条款九 不要在构造和析构函数中调用virtual函数
原因:构造derived class时会先构造一个base class,此时derived class还没有构造,调用的virtual函数只能来自base class。析构同理,会先析构derived class,再析构base class
条款十 令operator=返回一个reference *this
class Base
{
private:
int a;
public:
Base &operator=(const Base &rhs)
{
/*
...
*/
return *this;
}
};
条款十一 处理operator=
class One{..};
class Two{
...
private:
One *po;
};
Two& Two::operator= (const Two& rhs){
delete po;
po = new One(*rhs.po);
return *this;
}
上述代码会引发问题:如果有Two t; t = t;这类代码时,那么自身赋值无法完成。
同时也有引发异常的危险,如果在new语句发生异常,此时po已经被delete,空间已被释放,会导致程序无法运行,所以可以优化代码
Two& Two::operator=(const Two& rhs){
One *pOri = po;
po = new One(*rhs.po);
delete pOri;
return *this;
}