2017-05-16 13 views
-1
struct Complex 
{ 
    int real; 
    int imaginary; 
}; 

ostream& operator<<(ostream& output, const Complex& temp) 
{ 
    output << temp.real << " + " << temp.imaginary << 'i' << endl; 
    return output; 
} 
Complex& operator+(Complex& c1, Complex& c2) 
{ 
    Complex ans; 
    ans.real = c1.real + c2.real; 
    ans.imaginary = c1.imaginary + c2.imaginary; 
    return ans; 
} 



int main() 
{ 
    Complex temp; 
    cin >> temp; 
    Complex temp2; 
    cin >> temp2; 
    Complex ans; 
    ans = temp + temp2; 
    cout << ans << endl; 
    return 0; 
} 

入力:C++ oveloaded演算子+と<<

1 2 
    1 2 

出力

2 + 4i 
-858993460 + -858993460i 

私はC++に新たなんだと私はいくつかのプログラム をコード化haved私は結果についてとても困惑していますこのプログラムのC++に関する私の知識に間違っていることを説明してください。助けをありがとう

+0

参照型eの戻り値を持つ関数でローカル変数を返すことは、未定義の動作です。 – marcinj

+0

'operator +'はローカル変数への参照を返します。関数が返ってくると、変数はスコープから外れてしまい、参照が使用される前にぶら下がってしまいます。次に、プログラムは、オブジェクトの存続期間が終了した後にオブジェクトにアクセスすることによって、未定義の動作を示します。代わりに値で返します。 –

+0

あなたの現在の知識がわからないので、質問は明確ではありません。静的にコードを分析する:@IgorTandetnikで述べたように、関数定義されていない振る舞いである関数ローカルオブジェクトへの参照を返します。 – MABVT

答えて

2

参照によってローカル変数を返しています。代わりにこれを試してみてください:

Complex operator+(Complex& c1, Complex& c2) 
{ 
    Complex ans; 
    ans.real = c1.real + c2.real; 
    ans.imaginary = c1.imaginary + c2.imaginary; 
    return ans; 
} 

は、関数宣言にコンプレックス後&のabscenceに注意してください。参照によってローカル変数を返すことはできません。結果は未定義です。

1

実際の回答の後にゴミ値が表示されています。理由はここにある:

Complex& operator+(Complex& c1, Complex& c2) 
{ 
    Complex ans; 
    ans.real = c1.real + c2.real; 
    ans.imaginary = c1.imaginary + c2.imaginary; 
    return ans; 
} 

関数の戻り値の型がComplex&で、あなたのansはちょうどComplexであり、あなたはちょうどそれを返します。戻り値の型をComplexに変更すると、すべてが一貫しています。 Complex&では、基本的にスコープ内に見つからない変数への参照を返そうとしています。

これをよく理解するためにexampleを参照してください。これがあなたの問題を解決することを願っています。

関連する問題