普通构造函数在对象创建时被调用。
复制构造函数在用已有对象复制到一个新对象时被调用。
复制构造函数由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其形参必须是引用,但并不限制为const,一般普遍的会加上const限制。
如果在类中没有显式的声明一个拷贝构造函数,那么,编译器会自动生成一个来进行对象之间非static成员的位拷贝。
举例:
1、声明复制构造函数
#include
#ifndef STRNGBAD_H_
#define STRNGBAD_H_
class StringBad
{
private:
int a;
int b;
public:
StringBad(const StringBad &s);// 声明复制构造函数
StringBad();// 声明构造函数
~StringBad();
};
#endif
2、定义复制构造函数
StringBad::StringBad(const StringBad &s)
{
a = s.a;
b = s.b;
}
1、函数参数为类的对象
void func(StringBad p) // 函数形参为类的对象
{
cout << p.a;
}
int main()
{
p(1,2);// 构造出对象p.
func(p);// 将实参传递给形参完成一个拷贝,会调用复制构造函数
return 0;
}
2、函数的返回值为类的对象时
StringBad func()
{
StringBad s (1,2);
return s;
}
int main()
{
StringBad p = func();
return 0;
}
3、对象赋值初始化
int main()
{
StringBad p1(1,2); // 构造函数创建对象p1。
StringBad p2(p1);//用对象p1 复制出对象p2(通过复制构造函数实现)
return 0;
}