条款 12:复制对象时勿忘其每一个成分

《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 函数。

注意:

  1. 令 copy 赋值操作符调用 copy 构造函数是不合理的,因为这就像试图构造一个已经存在的对象。不该令 copy 赋值操作符调用 copy 构造函数。

  2. 令 copy 构造函数调用 copy 赋值操作符同样无意义。构造函数用于初始化新对象,而 copy 赋值操作符只施行于已初始化的对象身上。因此请别尝试对一个尚未构造好的对象赋值。

如果你发现你的 copy 构造函数和 copy 赋值操作符有相近的代码,消除重复代码的做法是,创建一个名为 init 的 private 成员函数。

请记住:

  1. Copying 函数应该确保复制 “对象内的所有成员变量” 及 “所有 base class 成分”。
  2. 不要尝试以某个 copying 函数实现另一个 copying 函数。应该将共同机能放进第三个函数中,并由两个 copying 函数共同调用。

你可能感兴趣的:(条款 12:复制对象时勿忘其每一个成分)