加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

我应该使用哪种C运算符重载变体?而且,为什么?

发布时间:2020-12-16 10:46:04 所属栏目:百科 来源:网络整理
导读:这里给出了加法运算符()的重载的3种变化. 我应该使用哪种变体?为什么? class MyClass { int myInteger; double myDouble; public: MyClass(int i,double d) { myInteger = i; myDouble = d; } // Variation - 1 //-------------- MyClass operator +(MyCla
这里给出了加法运算符()的重载的3种变化.

我应该使用哪种变体?为什么?

class MyClass {
    int myInteger;
    double myDouble;
    public:
        MyClass(int i,double d) {
        myInteger = i;
        myDouble = d;
    }

    // Variation - 1
    //--------------
    MyClass operator +(MyClass rhsObj) {
        return MyClass(this->myInteger + rhsObj.myInteger,this->myDouble + rhsObj.myDouble);
    }

    // Variation - 2
    //--------------
    MyClass &operator +(MyClass &rhsObj) {
        rhsObj.myInteger = this->myInteger + rhsObj.myInteger;
        rhsObj.myDouble = this->myDouble + rhsObj.myDouble;

        return rhsObj;
    }

    // Variation - 3
    //--------------    
    MyClass &operator +(MyClass &rhsObj) {
        this->myInteger = this->myInteger + rhsObj.myInteger;
        this->myDouble = this->myDouble + rhsObj.myDouble;

        return *this;
    }
};


int main() {
    MyClass objOne(10,10.5);
    MyClass objTwo(20,20.5);

    MyClass objThree = objOne + objTwo;
}

分配运算符(=)应该是什么情况?应该使用哪种变体?

解决方法

你真的想要一个和三个变化.

MyClass的用户期望它遵循The Principle of Least Astonishment,并且永远不会期望看到由于添加而修改右侧.使用const更多将强制执行此操作,并将作为文档.如果您想修改左侧,请使用=.像这样:

// Plus: Modify neither the left nor the right
//--------------
MyClass operator +(const MyClass& rhsObj) const
{
    return MyClass(myInteger + rhsObj.myInteger,myDouble + rhsObj.myDouble);
}

// Increment: Modify the left
//--------------
MyClass& operator +=(const MyClass& rhsObj)
{
    myInteger += rhsObj.myInteger;
    myDouble += rhsObj.myDouble;

    return *this;
}

演示:http://ideone.com/8oarA

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读