zoukankan      html  css  js  c++  java
  • C++ 重载赋值运算符

    ——C++允许类对象赋值,这是通过自动为类重载赋值运算符实现的,原型如下:

    Class_name & Class_name_name::operator=(const Class_name &);
    

      

    何时使用:

    将已有的对象赋给另一个对象时,将使用重载的赋值运算符,初始化对象时,并不一定会使用赋值运算符

    StringBad metoo = knot;    // use copy constructor, possibly assignment, too
    

      使用复制构造函数,或实现时分两步:使用复制构造函数创建一个临时对象,然后通过赋值将临时对象的值复制到新对象中

    • 与复制构造函数相似,赋值运算符的隐式实现也对成员进行逐个复制
    • 如果成员本身就是对象,则程序将使用为这个类定义的赋值运算符来复制该成员
    • 静态数据成员不受影响

    隐式的问题:

    与隐式复制构造函数相同:浅复制导致指针指向的内存数据受损(内存区被得到值的对象修改或调用析构函数被释放内存)

    解决办法:大体与复制构造函数相同,又有细微差别

    1. 用delete(delete[])释放目标对象以前分配的数据
    2. 使用深度复制
    3. 返回指向调用对象的引用(实现连续赋值:a=b=c)
    4. 考虑赋给自己的情况:应尽量避免,或首先检查自我复制,若是赋给自己,则直接返回调用对象
      StringBad &StringBad::operator=(const StringBad &st)
      {
          if (this == &st)    // 检查自我复制    
              return *this;
          delete []str;
          len = st.len;
          str = new char [len + 1];
          std::strcpy(str, st.str);
          return *this;
      }
      

        代码首先检查自我复制

    进一步重载:

    为提高效率,如果经常使用标准类型等可转换为类类型的赋值,则首先考虑重载一个完全匹配的赋值运算符,以避免创建和释放临时对象消耗多余的执行时间和内存

  • 相关阅读:
    阻塞 io 非阻塞 io 学习笔记
    nodejs 不是单线程
    最短路径之迪杰斯特拉(Dijkstra)算法
    迷宫问题求解之“A*搜索”(二)
    迷宫问题求解之“穷举+回溯”(一)
    CnBlogs自定义博客样式
    .NET中Main函数使用小技巧
    .NET中的枚举(Enum)
    DotNetBar的使用—(界面风格)
    .NET4.5新特性async和await修饰符实现异步编程
  • 原文地址:https://www.cnblogs.com/suui90/p/13127155.html
Copyright © 2011-2022 走看看