条款12 复制对象时勿忘每一个成分
直接看一个例子,在继承体系中。
class Base
{
public:
...
Base& operator=(const Base& rhs)
{
name = rhs.name;
return *this;
}
private:
string name;
};
class Derived : public Base
{
public:
...
Derived& operator=(const Derived& rhs)
{
priority = rhs.priority;
return *this;
}
...
private:
int priority;
};
代码很简单,但是我们的Derived只复制了Derived的部分,而Base部分的name并没有复制
所以我们应该这样调用
Derived& operator=(const Derived& rhs)
{
Base::operator=(rhs);
priority = rhs.priority;
return *this;
}
调用父类的函数初始化父类部分。
总结
当我们编写copying函数请确保:
- 复制所有local成员变量
- 调用所有Base classes内适当的copying函数。
但是假如copy构造函数和copy assignment操作符具有相近的代码,正确做法是建立一个新的成员函数给两者调用。