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 に答える