C++ 重载赋值运算符

——C++容许类对象赋值,这是经过自动为类重载赋值运算符实现的,原型以下:函数

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

  

什么时候使用:

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

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

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

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

隐式的问题:

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

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

  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;
    }
    

      代码首先检查自我复制内存

进一步重载:

为提升效率,若是常常使用标准类型等可转换为类类型的赋值,则首先考虑重载一个彻底匹配的赋值运算符,以免建立和释放临时对象消耗多余的执行时间和内存原型

相关文章
相关标签/搜索