1、
函数中按值传递类对象将调用复制构造函数。最好的办法是按引用传递。
如按值传递的函数:
void callme1 (StringBad );//StringBad 是一个类,这里使用的是按值传递
应该改成:
void callme1 (StringBad &);// 这个是按引用传递的,不会调用复制构造函数
2、浅复制与深度复制
默认的复制构造函数逐个复制非静态成员(成员复制也称之为浅复制),浅复制在复制字符串时,容易出现问题。
比如在:
sailor.str = sport.str; // sailor 和sport是两个类对象
这里复制的不是真正的字符串,而是一个指向字符串的指针。
两个指针指向同一个字符串时并没有问题,问题在于在调用析构函数,释放sailor.str时:
delete [ ] sailor.str; // delete 语句将释放字符串占用的内存。
然后,再次调用析构函数时,释放sports时,
delete [ ] sports.str;
由于sports.str 指向的内存已经被sailor的析构函数释放,这将导致不确定的、可能有害的后果。
解决办法:进行深度复制,也就是说复制构造函数应当复制字符串并将副本的地址赋给str成员,而不仅仅是复制字符串地址。