条款9:绝不在构造和析构函数过程中调用virtual函数
- 在构造和析构期间不要调用virtual函数,此类调用从来不下降至比起当前执行的那一成
一个简单的例子:
class base
{
public:
base();
~base();
virtual void getone() const = 0;
};
class a : public base
{
a();
~a();
virtual void getone() const;
}
base::base()
{
getone();
}
a name;
当我们初始化的时候,name 对象先调用基类的构造函数,从而调用了基类的getone(),没有调用 a 类的getone();
函数,从而会导致初始数据的错误。
条款10:令operator= 返回一个 reference to *this
- 令赋值(assignment)操作符返回 reference to * this
class wight
{
public:
wight & operator=(const wight & abc)
{
...
return *this;
}
};
return *this;返回左侧对象。
条款11:在operator=中处理“自我赋值”
- 确保当对象自我赋值时 operator = 有良好的行为。
- 确定任何操控一个对象,其中多个对象是一个对象,其行为仍然正确
条款12:复制对象时勿忘其每个成分
在复制基类中的数据时候请如下图:
- Copy函数应该确保复制“对象内的所有成员变量”及“所有base class” 成分
- 不要尝试以某个Copying函数实现另一个Copying函数。应将他们放在第三个函数中,并有两个Copying函数共同调用