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 为类设计合适的拷贝构造函数