拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个“一模一样”的新对象出来。虽然都是复制对象,但是不同的复制方法,复制出来的新对象却并非完全一模一样,对象内部存在着一些差异。通常的拷贝方法有两种,即深拷贝和浅拷贝,那二者之间有何区别呢?
我的理解是:
1、深拷贝和浅拷贝之间的区别在于是否复制了子对象。
2、如果一个类拥有资源(堆,或者是其它系统资源),,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之对象存在资源,但复制过程并未复制资源的情况视为浅拷贝。
当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:
①、一个对象以值传递的方式传入函数体:这个好理解,因为传递给函数体的参数不是 str 而是 _str ,是str的复制品。所以必然会调用拷贝构造函数。
②、一个对象以值传递的方式从函数返回 :相当于构造一个新的对象。
③、一个对象需要通过另外一个对象进行初始化。:同上、
正如您理解那样 “浅拷贝:只拷贝对象的基本属性,其他的引用不拷贝,还是保留引用”如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。当对象没有指针时,按照上面的规则,则一切正常,浅拷贝把数据复制过新对象。但当对象有指针时,因为浅拷贝引用不拷贝,所以新对象与旧对象他们指向的是同一个内存区,这时当释放内存时就出现释放两次,出错了。
这时需要深拷贝..................
所以通常我们需要自己写拷贝构造函数,以免出现错误。
//////////////参考资料所得,正确与否欢迎讨论、
posted on 2011-09-27 01:24
Yu_ 阅读(365)
评论(0) 编辑 收藏 引用 所属分类:
C/C++