拷贝构造也是一种特殊的构造函数,格式为:
类名(const 类名& that) // const可加可不加,但是加更好
{
}
什么时候调用拷贝构造:
当使用旧的对象给新对象初始化时,就会自动调用拷贝构造
Test t1; // 调用无参构造
Test t2 = t1; // 自动调用拷贝构造
拷贝构造的任务:
顾名思义拷贝构造负责把旧对象中的成员变量拷贝给新对象,而且编译器默认生成的具有该功能的拷贝构造函数
什么时候需要显式地实现拷贝构造函数:
普通情况下编译器自动生成的拷贝构造(浅拷贝)完全够用,但是当类中的成员有指针且为指针分配了堆内存时,默认的拷贝构造只会对指针变量的值进行拷贝,这样导致两个对象的指针成员指向同一块堆内存,在执行析构函数时,就会造成重复释放堆内存导致内存崩溃,这种情况就应该显式地实现拷贝构造函数(深拷贝)。
深拷贝和浅拷贝的区别
浅拷贝:系统默认调用,对指针进行拷贝后会出现两个指针指向同一个内存空间,程序结束时,该内存会被释放两次,导致程序崩溃
深拷贝:在对含有指针的对象进行拷贝时,自己定义拷贝构造函数,使拷贝后的对象指针成员有自己的内存空间,即进行深拷贝,这样就避免了内存泄漏发生。
浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。



