当出现类的等号赋值时,即会调用拷贝函数
深拷贝与浅拷贝区别:
- 在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅拷贝是可行的;
但是当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致指针悬挂现象,所以,此时,必须采用深拷贝
- 深拷贝与浅拷贝的区别就在于深拷贝会在堆内存中另外申请空间来储存数据,从而也就解决了指针悬挂的问题。简而言之,当数据成员中有指针时,必须要用深拷贝。
深拷贝:
指的就是当拷贝对象中有对其他资源(如堆、文件、系统等)的引用时(引用可以是指针或引用)时,对象的另开辟一块新的资源,而不再对拷贝对象中有对其他资源的引用的指针或引用进行单纯的赋值。如:
#include "stdafx.h"
class A
{
public:
A(int _size) : size(_size)
{
data = new int[size];//1th
printf("调用构造\n");
} // 假如其中有一段动态分配的内存
A() {};
A(const A& _A) : size(_A.size)
{
data = new int[size];//2th
printf("调用拷贝构造\n");
} // 深拷贝
~A()
{
delete[] data;//3th
printf("调用析构\n");
} // 析构时释放资源
private:
int* data;
int size;
};
int main()
{
A a(5), b = a; // 0th
return 0;
}
过程分析:
0th-->1th(此时查看其内存)
继续,走到了2th这里:
第一次走到3th这里:
第二次走到3th这里(对1th处的data进行处理):