zoukankan      html  css  js  c++  java
  • 条款十二 复制对象时勿忘其每一个成分

    1.在类里涉及到对象拷贝的函数要复制类里每一个成分copy构造函数以及copy assignment操作符

    class Test
    {
    private:
       string name;
    
    public:
      Test(const Test& rhs):name(rhs.name) {}
      Test& operator = (const Test& rhs)
      {
        name = rhs.name;
        return this;
      }
    };

    这样如果类里再添加一个成员变量时,就得需要修改这两个函数,不然新成员不会被拷贝的新对象中,而且
    编译器一般不会报错

    2.在继承中,注意base类的拷贝

    class derve:public Test
    {
    private:
       string derveStr;
    public:
       derve(const derve& rhs):derveStr(rhs.derveStr){}
       derve& operator = (const derve& rhs)
       {
          derveStr = rhs.derveStr;
          return this;
      }
    };

    虽然继承类里看到了两个拷贝函数,但忘了base类的拷贝,继承类对象里也包含了base类的一份副本,所以继承类对象拷贝时也需要
    拷贝base的副本,如果继承类里没有调用base 的拷贝函数,会使用default的拷贝函数,如上面的继承类,拷贝时使用的是base类的default
    拷贝函数,则不能做到拷贝每个成分,在定义继承类的时候可以调用base类的自定义拷贝函数

    class derve:public Test
    {
    private:
      string derveStr;
    public:
      derve(const derve& rhs):derveStr(rhs.derveStr),Test(rhs){}
      derve& operator = (const derve& rhs)
      {
        Test::operator = (rhs);
        derveStr = rhs.derveStr;
        return this;
      }
    };

    3.如果两个拷贝函数有重复的代码,可以定义一个成员函数(如init()),将重复的代码放到这个成员函数中,然后拷贝函数再调用这个init()函数,
    这两个拷贝函数不要互相调用,这样不太好,应该把相同代码放到第三方函数中

  • 相关阅读:
    屏幕截图 从安卓模拟器中识别出屏幕文字
    srcset
    Bitwise and Bit Shift Operators 位运算 取反 补码
    text recognizer (OCR) Engine 光学字符识别
    删除目录下 某类名字的文件
    appmaptile
    登录框
    将代码设置的剪切板内容通过输入法软件粘贴入app搜索框
    面向问题的高级语言
    使用心理视觉来进行图像处理
  • 原文地址:https://www.cnblogs.com/bizhu/p/2613851.html
Copyright © 2011-2022 走看看