2012-03-13 13 views
4

C++でconstリファレンスを返すのは混乱します。ですから、コードブロックの下に、gnu C++とVisual Studioでテストします。そして、別の答えを見つける。 C++でリターンconst参照を使用する利点を誰にも教えてください。その理由はdifferntコンパイラで異なる動作を引き起こします。C++のリターンconstリファレンスについて

#include <iostream> 
using namespace std; 

class A 
{ 
public: 
    A(int num1, int num2):m_num1(num1), m_num2(num2) 
    { 
      cout<<"A::A"<<endl; 
    } 
    const A& operator * (const A & rhs) const 
    { 
      return A(this->m_num1 * rhs.m_num1, this->m_num2*rhs.m_num1); 
    } 

    A(const A& rhs) 
{ 
      this->m_num1 = rhs.m_num1; 
      this->m_num2 = rhs.m_num2; 
      cout<<"A::A(A&)"<<endl; 
    } 
    const A& operator = (const A& rhs) 
    { 
      cout<<"A::Operator="<<endl; 
      return *this; 
    } 
    void Display(); 
private: 
    int m_num1; 
    int m_num2; 
}; 

void A::Display() 
{ 
    cout<<"num1:"<<m_num1<<" num2:"<<m_num2<<endl; 
} 

int main() 
{ 
    A a1(2,3), a2(3,4); 
    A a3 = a1 * a2; 
    a3.Display(); 
    return 0; 
} 

Gnu C++では、正解を報告しました。しかし、Visual Studioコンパイラでは失敗しました。

+2

VS C++で観察された正確な問題は何でしたか?プログラムの成果は? –

+0

'const A&operator *(const A&rhs)const'を' A operator *(const A&rhs)const'に変更するべきだと思います。 – hochl

答えて

8

これは許可されていないローカル変数への参照を返して:

const A& operator * (const A & rhs) const 
{ 
    return A(this->m_num1 * rhs.m_num1, this->m_num2*rhs.m_num1); 
} 

あなたはダングリング参照と未定義の動作を持っています。

関連

1
const A& operator * (const A & rhs) const 
{ 
    return A(this->m_num1 * rhs.m_num1, this->m_num2*rhs.m_num1); 
} 

これはここに悪いです。

偶然であれば、ダングリングリファレンスを返しています。

破棄されたスタックフレームに存在するものを返しています。 値を修正して戻すだけです。

1
const A& operator * (const A & rhs) const 
{ 
    return A(this->m_num1 * rhs.m_num1, this->m_num2*rhs.m_num1); 
} 

この関数は、ローカル変数への参照を返します。ローカル変数は、この関数から戻ったときに破棄されますoperator*。それは危険です。 Aを返すことができますが、A&を返すことはできません。Aを返すと、ファンクションは返信用にAをコピーします。

+0

"Aを返すと、関数は返すために一時Aをコピーします。": 実際に戻り値に割り当てられた領域にtempが格納されます。コピーは発生しません。これはC++ 11に付属している「必須の最適化」の1つです。 –

+0

@EmilioGaravaglia:これは値渡しの場合にのみ適用されます。ここでは参考にして戻っています。とにかく、すべてのコンパイラがC++ 11をサポートしているわけではありません。 –

+0

@LokiAstari:私はポストのコードを引用するのではなく、私が引用した特定のフレーズに、ポストでは「値を返すことについて話す」と文脈を描いています。 また、この最適化は「C + +11 "がコンパイルされたときに、C++ 03コンパイラのほとんどが既にそれを持っています。 –

関連する問題