C++的两种初始化方式
在阐述拷贝构造函数之前,先让我们来看一下C++支持的初始化方式。C++支持两种初始化方式。
- 直接初始化
int a(5);
A a(2);
- 拷贝初始化
int a = 5;
A a = a1;
除了类类型之外,两种初始化方式无差别。对于类类型,直接初始化调用相应的构造函数,拷贝初始化调用拷贝构造函数。
拷贝构造函数的一般形式
classname(const classname &obj){
//...
}
拷贝构造函数和构造函数、析构函数一样,都是一种特殊的函数。如上所示,拷贝构造函数的函数名和类名一样,形参为同类型对象的const引用。可以看到,拷贝构造函数的实现是需要开发者自己实现的,具体在拷贝构造函数中实现什么,由开发者自己决定。但是正如其名字所含的意义,应当在拷贝构造函数中实现对象的拷贝操作。
什么时候必须实现拷贝构造函数?
当类的成员变量含有指针类型时
当类的成员在构造函数中分配其他资源时(待验证)
何时调用拷贝构造函数?
- 一个对象以值传递的方式传入函数体
func(Object obj){//obj参数作为对象的值传递传入
// ...
}
- 一个对象以值传递的方式从函数返回
func(){
Object obj;
// ...
return obj;//对象obj以值传递的形式返回
}
- 一个对象是通过另一个对象初始化时
Object obj1;
Object obj2 = obj1;// obj2通过obj1初始化
当定义一个新对象并用一个同类型的对象对它进行初始化时,将显示使用拷贝构造函数。当该类型的对象传递给函数或从函数返回该类型的对象时,将隐式调用拷贝构造函数。