一.生成一个对象的副本有2种途径
途径1:建立一个新对象,将一个已有对象数据成员的值取出来
赋给新对象。
途径2:使用复制构造函数。
复制构造函数是一种特殊的构造函数,用来生成一个对象的副本。
二.复制构造函数的作用
使用一个已经存在的对象初始化一个同类的新对象
三.复制构造函数的特点
1.复制构造函数名与类名相同,并且也没有返回值类型。
2. 复制构造函数可写在类中,也可以写在类外。
3. 复制构造函数要求有一个类类型的引用参数。
4. 如果没有显式定义复制构造函数,系统自动生成一个默认形式的复制构
造函数。
四.构造函数的定义
复制构造函数的形参为本类的对象引用。
class 类名
{ public :
类名(形参);//构造函数
类名([const ]类名 &引用名);//复制构造函数
...
};
类名::类名([const] 类名 &引用名) //复制构造函数的实现
{ 函数体 }
五.在以下情况调用复制构造函数
1、当用类的一个对象去初始化该类的另一个对象时系统自动调用复制构造函数实现拷贝赋值。
#include <iostream>
using namespace std;
class Complex {
public:
Complex(double r, double i)
{ real = r; imag = i; }
Complex( Complex & c)
{
real = c.real; imag = c.imag;
cout<<"copy constructor!"<<endl;
}
private :
double real, imag;
};
int main( ){
Complex c1(1,2);
Complex c2(c1);
Complex c3= c1; //用对象c1去初始化该类
的另一个对象c2|c3时复制构造函数被调用
c3=c2; //非初始化,不调用复制构造函数
return 0;
}
程序执行结果为:
copy constructor!
copy constructor!
2、若函数的形参为类对象,调用函数时,实参传递给形参,系统自动调用复制构造函数,用实参对象去初始化形参对象。
void func(Complex c) { };
int main( )
{
Complex c1(1,2);
func(c1); //调用复制构造函数cc1
return 0;
}
程序执行结果为:
copy constructor!
3、如果函数的返回值是类的对象,函数执行完返回调用者时,需要生成一个临时对象作为函数返回结果,此时,系统需要调用复制构造函数完成临时对象的生成。
Complex func()
{
Complex c1(1,2);
return c1; //调用复制构造函数
};
除此之外,还将调用析构函数销毁临时对象。
如果有形如 a=func()的表达式,还将调用赋值函数完成赋值操作。