拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同样对象,是一种特殊的构造函数,具有一般构造函数的所有特性,当创建一个新对象的时候系统会自动调用它;其形参是本类对象的引用,它的特殊功能是将参数代表的对象逐域拷贝到新创建的对象中。
用户可以根据实际需要定义特定的拷贝构造函数,以实现同类对象之间数据成员的传递。如果用户没有声明类的拷贝构造函数,系统会自动生成一个默认的拷贝构造函数,它的功能就是把初始对象的每个数据成员的值复制到新建立的对象当中。它定义为:类名(类名&对象名)
class dog { private: int age; float weight; char *color; public: dog(); dog(dog&); void play(); void hunt(); }; dog::dog(dog&other) { age = other.age; weight = other.weight; color = other.color; }
在以下四种情况下会调用拷贝构造函数:
(1)用类的一个对象去初始化另一个对象:
dog dog1;
dog dog2(dog1);
(2)用类的一个对象去初始化另一个对象的另一种形式:
dog dog2 = dog1;
(3) 对象作为参数传递,调用拷贝构造函数:
f(dog a){}
dog b;
f(b);
(4)如果函数的返回值是类的对象,函数调用返回时,调用拷贝构造函数
dog f{
dog a;
.....
return a;
}
dog b;
b = f();
// 拷贝构造函数分为深拷贝和浅拷贝
浅拷贝只是复制对象的空间而不复制资源,深拷贝需要同时复制对象空间和资源。