3.5.5 定义拷贝构造函数(2)

2013-10-07 15:31:07 · 作者: · 浏览: 72

3.5.5   定义拷贝构造函数(2)

这个拷贝构造函数将d1的数据成员拷贝到d2(见图3-3)。

 
图3-3   编译器提供的拷贝构造函数将d1的数据成员拷贝到d2的数据成员
这样,第一次调用d2.dump()时,其输出为
 

将字符串Great Dane拷贝到d2.p指向的存储区域的第二块位置(见图3-4)。

语句

 
的输出为
 
 
图3-4   将Great Dane拷贝到d2.p指向的存储区域的第二块位置后,d1与d2的内存映像
需要注意的是,由于d1.p与d2.p现在指向相同的存储区域,则如下语句:
 
虽然d1没有调用set成员函数,但d1的内容却改变了!这是一个非常微妙的错误,我们本希望通过定义
 

来获得一个新的对象d2,d2拥有自己的存储空间,来保存这些字符串,而不是与d1共享存储空间。结果编译器却生成了一个拷贝构造函数,将d1.p直接赋给d2.p,将d1.size直接赋给d2.size,使得d1和d2的指针指向了同一个存储区域。

程序清单3-6列举了因使用编译器生成的拷贝构造函数而导致的严重后果。

例3-27

程序清单3-7改正了程序清单3-6的错误,具体方法是为Namelist类提供一个满足要求的拷贝构造函数。

程序清单3-7   为类设计合适的拷贝构造函数