1.默默生成的函数。
C++为类默默生成了构造,拷贝构造,赋值与析构四个函数。
class CTest{
public:
CTest(){…}//默认生成空参数构造。
~ CTest(){…}//默认生成非virtual的析构
CTest(const CTest & ct){…}//默认生成拷贝构造,传入引用且不可修改
Ctest& operator=(const Ctest&ct){...}//默认生成赋值函数,传入引用且不可修改
};
2.防止默认,给出拒绝。
对于某些默认生成的函数不想使用时将其放入private区。
3.virtual在析构的使用。
a.如果希望base-class作为指针或引用进行多态,则将析构变为virtual。
b.若base-class不进行多态,则析构可以不为virtual。
4.防止异常逃离析构。
析构函数执行时期为对象销毁时期,对象销毁在delete或作用域结束时,则析构函数的调用处繁多,不可能在每一处都进行异常捕获,则应将异常吞入,并转交给异常处理函数统一处理或结束程序。
5.避免在构造与析构中调用virtual函数。
a.由于virtual函数的动态调用依靠virtual的函数表,在生成子类时先调用父类的构造,则父类构造过程中virtual函数表内无子类信息,则父类调用virtual没任何效果。
b.析构时先将子类的信息擦除,则父类的析构函数调用virtual函数时,virtual函数表内的子类信息已被擦除,则不会多态的调用。
6.连续赋值让operator=返回*this。
CTest&operator=(const CTest& ct){
…
return *this;//返回自身引用
};
7.处理自我赋值。
a.自身毁坏了自身。
CTest &operator=(const CTest& ct){//自己向自己赋值,结果将自己的区域删除了
delete p;//将p区指向清除
p=ct.p;//(浅拷贝)将清除区域的地址给p
return *this;//返回自身
};
b.对自身增强了保护。
CTest &operator=(const CTest& ct){//增强自我保护
if(this==&ct){//判断是否自身
return*this;//返回自身引用
}
delete p;//将p区指向清除
p=ct.p;//(浅拷贝)将清除区域的地址给p
return *this;//返回自身
};
c.对异常的出现进行防范
CTest &operator=(const CTest& ct){//利用新对象赋值
char *bp=p;//对原地址进行保护
p=createNew(ct.p);//(深拷贝)利用ct.p创建副本
delete p;//删除原先区域
return *this;//返回自身
};
CTest &operator=(const CTest& ct){//增强自我保护
CTest temp(ct);//创建可由系统自动销毁的副本
swap(temp);//交换内容
return *this;//返回本体
};
8.复制对象切勿遗忘每个成分。
a.在复制子类成员前先将父类成员先复制。
b.设置公有的copying函数,让拷贝和赋值函数调用,而不是他们互相调用。