美文网首页C++ 杂记
条款 12:复制对象时勿忘其每一个成分

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

作者: 赵者也 | 来源:发表于2017-07-22 10:33 被阅读1次

    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:复制对象时勿忘其每一个成分

        本文链接:https://www.haomeiwen.com/subject/kzzekxtx.html