复制构造函数 (copy constructor)基本概念:
只有一个参数,即对同类对象的引用。
形如 X::X( X& )或X::X(const X &), 二者选一 后者能以常量对象作为参数 如果没有定义复制构造函数,那么编译器生成默认 复制构造函数。默认的复制构造函数完成复制功能。
class Complex { private : double real,imag; }; Complex c1; //调用缺省无参构造函数 Complex c2(c1);//调用缺省的复制构造函数,将 c2 初始化成和c1一样。
如果定义的自己的复制构造函数, 则默认的复制构造函数不存在。 class Complex { public : double real,imag; Complex(){ } Complex( const Complex & c ) { real = c.real; imag = c.imag; cout << “Copy Constructor called”; } }; Complex c1; Complex c2(c1);//调用自己定义的复制构造函数,输出 Copy Constructor called。
不允许有形如 X::X( X )的构造函数。 class CSample { CSample( CSample c ) { } //错,不允许这样的构造函数 };
复制构造函数起作用的三种情况
1)当用一个对象去初始化同类的另一个对象时。 Complex c2(c1); Complex c2 = c1; //初始化语句,非赋值语句
2)如果某函数有一个参数是类 A 的对象,
那么该函数被调用时,类A的复制构造函数将被调用。
class A
{
public:
A() { };
A( A & a) {
cout << "Copy constructor called" <<endl;
}
};
3)如果某函数有一个参数是类 A 的对象, 那么该函数被调用时,类A的复制构造函数将被调用。 void Func(A a1){ } int main(){ A a2; Func(a2); return 0; } 程序输出结果为: Copy constructor called
4) 如果函数的返回值是类A的对象时,则函数返回时,
A的复制构造函数被调用:
class A
{
public:
int v;
A(int n) { v = n; };
A( const A & a) {
v = a.v;
cout << "Copy constructor called" <<endl;
}
};
3) 如果函数的返回值是类 A的对象时,则函数返回时, A的复制构造函数被调用 : A Func() { A b(4); return b; } int main() { cout << Func().v << endl; return 0; } 输出结果: Copy constructor called 4
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.