一.拷贝构造函数
C++类会提供一个默认拷贝构造函数,其做的操作是将另一个实例化类的引用传入,将数据复制,然后传入当前实例化类,可以对拷贝构造函数进行重载,这涉及到深浅拷贝的问题。
Entity(const Entity& E)
拷贝赋值可以有以下两种写法
Entity E2(E);
Entity E2 = E;
二.浅拷贝
默认拷贝构造函数所做的就是一种浅拷贝。它的特点是只是将变量的值复制一份,然后赋值到当前实例化类的变量中,而不考虑指针变量。如果类中有指针变量,且进行了浅拷贝,那么会有多个类的指针指向同一块内存空间,导致对类的操作出现严重错误。且很可能出现野指针问题。为了解决这个问题,必须要对具有指针变量的类进行深拷贝操作。
下图可知进行浅拷贝的类,指针变量共享同一块地址空间由于类出作用域时会执行析构函数释放堆区内存,即E和E2都需要释放一次,而它们指向同一部分内存,所以会释放一次已经被释放的内存,导致程序崩溃
三.深拷贝
重载拷贝构造函数,对指针变量做处理,为其开辟大小相同的内存,这次拷贝赋值的不是地址,而是将原本地址中的值复制一份,赋值给新开辟的内存空间。这样就实现了每一个类的实例化对象的指针变量都有自己的一块内存维护。