今天早上读《effective c++》的第五章条款,想到的深拷贝、浅拷贝,对应值拷贝和位拷贝。
值拷贝和位拷贝的内容如下:
http://blog.csdn.net/liam1122/article/details/1966617
C++中的位拷贝和值拷贝
为了便于说明我们以String类为例:
首先定义String类,而并不实现其成员函数。
位拷贝拷贝的是地址,而值拷贝则拷贝的是内容。如果定义两个String对象A和B。A.m_data和B.m_data分别指向一段区域,A.m_data="windows",B.m_data=“linux";
如果未重写赋值函数,将B赋给A,则编译器会默认进行位拷贝,A.m_data=B.m_data,此为浅拷贝。
则A.m_data和B.m_data指向同一块区域,虽然A.m_data指向的内容会改变成"linux",但是这样容易出现这些问题:
(1):A.m_data原来指向的内存区域未释放,造成内存泄露。
(2):A.m_data和B.m_data指向同一块区域,任何一方改变都会影响另一方
(3):当对象被析构时,B.m_data被释放两次。
对于编译器,如果不主动编写拷贝函数和赋值函数,它会以“位拷贝”的方式自动生成缺省的函数。
如果重写赋值函数和拷贝构造函数后,
A.m_data=B.m_data,进行的是值拷贝,会将B.m_data的内容赋给A.m_data,A.m_data还是指向原来的内存区域,但是其内容改变。
实现深拷贝需要2句话:
m_data = new char(sizeof(B.m_data));
mmcpy(m_data, B.m_data, sizeof (B.m_data));
如果浅拷贝(编译器默认提供)
就是
m_data = B.m_data
显然2者有很大的不同,
这就是为什么当类型为HasPtr即类型为带有指针成员的类的时候,要自己实现复制构造函数的原因