高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(4)
类String的赋值函数比构造函数复杂得多,分四步实现: (1)第一步,检查自赋值。你可能会认为多此一举,难道有人会愚蠢到写出 a = a 这样的自赋值语句!的确不会。但是间接的自赋值仍有可能出现,例如 // 内容自赋值 b = a; … c = b; … a = c; b = &a; … a = *b;
他真的说错了。看看第二步的delete,自杀后还能复制自己吗?所以,如果发现自赋值,应该马上终止函数。注意不要将检查自赋值的if语句 if(this == &other) 错写成为 if( *this == other) (2)第二步,用delete释放原有的内存资源。如果现在不释放,以后就没机会了,将造成内存泄露。 (3)第三步,分配新的内存资源,并复制字符串。注意函数strlen返回的是有效字符串长度,不包含结束符‘\0’。函数strcpy则连‘\0’一起复制。 (4)第四步,返回本对象的引用,目的是为了实现象 a = b = c 这样的链式表达。注意不要将 return *this 错写成 return this 。那么能否写成return other 呢?效果不是一样吗? 不可以!因为我们不知道参数other的生命期。有可能other是个临时对象,在赋值结束后它马上消失,那么return other返回的将是垃圾。 9.7 偷懒的办法处理拷贝构造函数与赋值函数 偷懒的办法是:只需将拷贝构造函数和赋值函数声明为私有函数,不用编写代码。 例如: class A { … private: A(const A &a); // 私有的拷贝构造函数 A & operate =(const A &a); // 私有的赋值函数 }; 如果有人试图编写如下程序: A b(a); // 调用了私有的拷贝构造函数 b = a; // 调用了私有的赋值函数 编译器将指出错误,因为外界不可以操作A的私有函数。 9.8 如何在派生类中实现类的基本函数 u 派生类的构造函数应在其初始化表里调用基类的构造函数。 u 基类与派生类的析构函数应该为虚(即加virtual) |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |