《Effective C++ 中文版 第三版》读书笔记
** 条款 12:复制对象时勿忘其每一个成分 **
任何时候只要你承担起 “为 derived class 撰写 copying 函数” 的重责大任,必须很小心地也复制其 base class 成分。那些成分往往是 private,所以你无法直接访问它们,你应该让 derived class 的 copying 函数调用相应的 base class 函数:
TobyDerived::TobyDerived(const TobyDerived& td)
:TobyBase(td), //< 调用 base class 的 copy 构造函数
others(td.other)
{
...
}
TobyDerived& TobyDerived::operator=(const TobyDerived& td)
{
...
TobyBase::operator=(td); //< 调用 base class 成分进行赋值动作
others = td.other;
return *this;
}
当编写一个 copying 函数时,请确保(1)复制所有 local 成员变量,(2)调用所有 base class 内的适当 copying 函数。
注意:
-
令 copy 赋值操作符调用 copy 构造函数是不合理的,因为这就像试图构造一个已经存在的对象。不该令 copy 赋值操作符调用 copy 构造函数。
-
令 copy 构造函数调用 copy 赋值操作符同样无意义。构造函数用于初始化新对象,而 copy 赋值操作符只施行于已初始化的对象身上。因此请别尝试对一个尚未构造好的对象赋值。
如果你发现你的 copy 构造函数和 copy 赋值操作符有相近的代码,消除重复代码的做法是,创建一个名为 init 的 private 成员函数。
请记住:
- Copying 函数应该确保复制 “对象内的所有成员变量” 及 “所有 base class 成分”。
- 不要尝试以某个 copying 函数实现另一个 copying 函数。应该将共同机能放进第三个函数中,并由两个 copying 函数共同调用。
网友评论