对于拷贝构造函数,我前面的博文有提起过,不过,有的时候,浅拷贝和深拷贝真的很难理解,所以,我们再进行关于拷贝构造函数的一些讨论。
大家都整到拷贝构造函数分为浅拷贝和深拷贝,系统默认的拷贝构造函数是浅拷贝。
默认拷贝构造函数以内存拷贝的方式将旧有对象的内存空间拷贝到新对象的内存空间。
如果类中有指针类型的类型的时候,默认拷贝构造函数只能复制指针属性的值,而不能复制指针属性所指向的内存,此时,如果我们自己不显式定义拷贝构造函数,那么我们在编程的时候,可能会出现很诡异的问题。
显式定义拷贝构造函数来完成指针属性等需要特殊处理的属性的拷贝工作。
The Number one : 我们先来看浅拷贝带来的问题
---------------------我是分割线------------------------
----------------------------------------------------------------------------
这个程序运行失败,代码分析:
1、car_two(car_one)等价于
car_two.brand = car_one.brand;
car_two.price = car_one.price;
2、经过赋值操作后,两个对象中的指针指向的是同一块动态内存,当car_one和car_two撤销时,其释放函数都要释放同一块动态内存内存,可是,两个对象撤销有先有后,一旦一个对象被撤销,另一个对象的brand指针变速"野指针",使用该指针再次释放同一块动态内存会引发内存错误。
不仅仅是重复释放内存的问题,还会出现其他问题:
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
由于car_two是在if结构中定义的局部对象,因此if结构退出时,car_two被撤销,系统自动调用其析构函数,释放了car_two.brand所指向的动态内存,由于car_one和car_two值相同,此时car_one.brand已无所指,成了野指针,此时,对该指针的读写操作都会引发无法预料的错误。
----------------------------------------------------------------------------
此时,我们就需要自己来定义拷贝构造函数:
----------------------------------------------------------------------------
------------------------------------------------------------------------------------------
最后提一点,自定义的拷贝构造函数,最好也重载operator=运算符!
https://www.cnblogs.com/xiangcunjiaoshi/p/12485190.html
https://www.cnblogs.com/xiangcunjiaoshi/p/12482707.html
https://www.cnblogs.com/xiangcunjiaoshi/p/12492287.html
https://www.cnblogs.com/xiangcunjiaoshi/p/12492412.html
https://www.cnblogs.com/xiangcunjiaoshi/p/12507406.html