1

下面的代码给出了加法的正确输出,它在执行后更改了第一个对象b的x值。

class numbers{
public:
    int x;
    numbers(int i1){
        x = i1;
    }
    numbers operator+ (numbers num){
        x = x + num.x;
        return(x);
    }
};

int main(){
    numbers a (2);
    numbers b (3);
    numbers c (5);
    numbers d (7);
    cout << a.x << b.x << c.x << d.x << endl; // returns 2357
    numbers final (100); //this value won't be shown
    final = a+b+c+d; 
    cout << a.x << b.x << c.x << d.x << endl; // returns 5357
    cout << final.x; //returns 17 (2+3+5+7)
    system("pause");
}

问题是,这个加法类究竟是如何工作的?我的意思是,为什么对象中x被修改了?我虽然只有来自最终对象的x会被修改。

谢谢 :)

4

3 回答 3

2

对 operator+ 的调用就像任何其他成员函数调用一样。a + b转换为a.operator+(b)。因此,x = x + num.x;在这种情况下,该行实际上是分配给a.x. 为了实现你想要的,你需要用新值填充一个新数字,即

numbers operator+ (numbers num) const {
    return numbers(x + num.x)
}

还要注意 const - 当你犯了那个错误时它会给你一个编译错误。

于 2013-02-03T16:53:46.857 回答
2

您编写的 operator+ 实际上正在执行您对 operator+= 的期望

operator+ 应该返回一个包含计算值的对象编号,而不是修改当前对象。

这里有一些指导方针

于 2013-02-03T16:54:08.013 回答
0

您的operator+更改this是因为这是您定义它的方式。或者,您可以尝试

numbers operator+( const numbers& num ) {
    numbers ret( this->x ); // constract a local copy
    ret.x += num.x;
    return ret;
}
于 2013-02-03T16:54:13.070 回答