对于基本数据类型,拷贝构造函数类似如下:
int a = 10;
float b = 100.0;
而对于自定义的结构,拷贝构造函数并没有那么随意。
- 默认拷贝构造函数&浅拷贝
当用户未声明拷贝构造函数时,系统会自动生成一个默认的拷贝构造函数,它实现位拷贝。这就引出了浅拷贝。
浅拷贝:当对象具有资源(堆、系统资源等)时,拷贝时未重新分配该资源(而是和被拷贝对象共享)。反之,叫做深拷贝。浅拷贝容易造成资源的归属不明确,释放时可能会导致出现错误(共享指针了解下)。
- 自定义拷贝构造函数
可以通过自定义拷贝函数来实现数据的深拷贝。拷贝函数定义格式如下
ClassName(const ClassName & p){}
拷贝构造函数和构造函数有相似之处也有区别,主要时参数必须时一个同类型对象的常引用。
class student{
public:
student(cosnt student& s){
nomber = new int;
*nomber = *s.nomber;
}
private:
int* nomber;
}
- 注意:默认拷贝构造函数、自定义拷贝构造函数与深拷贝、浅拷贝无直接关系。深、浅拷贝的区分以拷贝构造函数的实际定义方式为准。