美文网首页程序员
[C++进阶]复制对象时勿忘其每个部分

[C++进阶]复制对象时勿忘其每个部分

作者: 小鱼号的代码日记 | 来源:发表于2020-09-07 00:02 被阅读0次

    前言:
    设计良好的面向对象系统(OO-system)会将对象的内部封装起来,
    只留两个函数负责拷贝,那便是带着适切名称的copy构造函数和copy
    assignment操作符。
    统称为copying函数
    如果你声明自己的copying函数需要注意
    1 如果你为class 添加一个成员变量,你必须同时修改copying函数
    2 让derived class的copying函数调用相应的base class函数
    3 如果你发现你的copy构造函数和copy assignment操作符有相近的代码。
    消除重复代码的做法是,建立一个新的成员函数给两者调用。
    这样的函数往往是private而且常被命令为init。
    这个策略可以安全消除copy构造函数和
    copy assignment操作符之间的重复代码

    /***************************
    effectivre c++
    改善编程与设计的55个具体做法
    条款12:复制对象时勿忘其每个部分
     ---------小鱼号的代码日记--------------
    ****************************/
    /*
     前言:
       设计良好的面向对象系统(OO-system)会将对象的内部封装起来,
       只留两个函数负责拷贝,那便是带着适切名称的copy构造函数和copy
       assignment操作符。
       统称为copying函数
       如果你声明自己的copying函数需要注意
       1 如果你为class 添加一个成员变量,你必须同时修改copying函数
       2 让derived class的copying函数调用相应的base class函数
       3 如果你发现你的copy构造函数和copy assignment操作符有相近的代码。
         消除重复代码的做法是,建立一个新的成员函数给两者调用。
         这样的函数往往是private而且常被命令为init。
         这个策略可以安全消除copy构造函数和
         copy assignment操作符之间的重复代码
    */
    #include <QCoreApplication>
    #include <iostream>
    using namespace std;
    
    class Customer
    {
      public:
        Customer(const Customer & rhs)
            :name(rhs.name)
        {
    
        }
        Customer& operator=(const Customer & rhs)
        {
           if(this == &rhs)
               return *this;
           name = rhs.name;
             return *this;
        }
    private:
        std::string name;
        int type;       //添加一个成员变量,你必须同时修改copying函数
    };
    
    
    class pCustomer :public Customer
    {
    public:
        pCustomer(const pCustomer & rhs)
            :Customer(rhs),
            priority(rhs.priority)
        {
    
        }
        pCustomer& operator=(const pCustomer & rhs)
        {
           if(this == &rhs)
               return *this;
    
           Customer::operator =(rhs);
           priority = rhs.priority;
           return *this;
        }
    private:
        int priority;
    };
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        return a.exec();
    }
    /*****
    内容选自:
    effectivre c++
    改善程序与设计的55个具体做法
    *****/
    

    相关文章

      网友评论

        本文标题:[C++进阶]复制对象时勿忘其每个部分

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