它只有一个参数,参数类型是本类的引用。参数可以是const引用,也可以是非const引用。建议是const引用,为什么?
因为这样可以让对象是常量对象作为参数,也可以让非常量对象作为参数
。
如果你自己不写复制构造函数,系统会自动创建一个
下面是默认复制构造函数的一个例子:
#include<iostream > using namespace std; class Complex { public: double real, imag; Complex(double r, double i) { real= r; imag = i; } }; int main(){ Complex cl(1, 2); Complex c2 (cl); //用复制构造函数初始化c2 cout<<c2.real<<","<<c2.imag; //输出 1,2 return 0; }
当然你也可以自己写一个:
#include<iostream> using namespace std; class Complex{ public: double real, imag; Complex(double r,double i){ real = r; imag = i; } Complex(const Complex & c){ real = c.real; imag = c.imag; cout<<"Copy Constructor called"<<endl ; } }; int main(){ Complex cl(1, 2); Complex c2 (cl); //调用复制构造函数 cout<<c2.real<<","<<c2.imag; return 0; }
输出结果为:Copy Constructor called (换行) 1,2
此外,注意:
1. Complex c2(c1); 2. Complex c2 = c1;
形式一样,都是调用复制构造函数,表示初始化。
Complex c1, c2; c1 = c2 ;
注意第二条语句不是初始化而是赋值,所以不会调用复制构造函数。
形参的复制构造函数初始化
以对象作为函数的形参,在函数被调用时,生成的形参要用复制构造函数初始化,这会带来时间上的开销。如果用对象的引用而不是对象作为形参,就没有这个问题了。但是以引用作为形参有一定的风险,因为这种情况下如果形参的值发生改变,实参的值也会跟着改变。
如果要确保实参的值不会改变,又希望避免复制构造函数带来的开销,解决办法就是将形参声明为对象的 const 引用。例如:
void Function(const Complex & c) { ... }
返回值的复制构造函数调用
如果函数的返回值是类A的对象,那么在返回时A的复制构造函数会被调用。
例如:
#include<iostream> using namespace std; class A { public: int v; A(int n) { v = n; }; A(const A & a) { v = a.v; cout << "Copy constructor called" << endl; } }; A Func() { A a(4); return a; } int main() { cout << Func().v << endl; return 0; }
程序的输出结果是:
Copy constructor called
4