2011-07-02 9 views
3

ここはウェブサイトの例です:http://www.cplusplus.com/doc/tutorial/classes2/ 実例です。しかし、私はオブジェクトの温度が演算子+オーバーロード関数から返される理由を理解していません。私はコードの他にいくつかのコメントをしました。C++の関数の中でオブジェクト参照を返すのはなぜですか?

// vectors: overloading operators example 
#include <iostream> 
using namespace std; 

class CVector { 
    public: 
    int x,y; 
    CVector() {}; 
    CVector (int,int); 
    CVector operator + (CVector); 
}; 

CVector::CVector (int a, int b) { 
    x = a; 
    y = b; 
} 

CVector CVector::operator+ (CVector param) { 
    CVector temp; 
    temp.x = x + param.x; 
    temp.y = y + param.y; 
    return (temp); ***// Isn't object temp be destroyed after this function exits ?*** 
} 

int main() { 
    CVector a (3,1); 
    CVector b (1,2); 
    CVector c; 
    c = a + b; ***// If object temp is destroyed, why does this assignment still work?*** 
    cout << c.x << "," << c.y; 
    return 0; 
} 

答えて

8

この例では、オブジェクト参照を返さないため、単にオブジェクトを値で返すだけです。

オブジェクトtempは実際には関数が終了した後に破棄されますが、その時点でその値はスタックにコピーされます。

4
CVector CVector::operator+ (CVector param) { 

この行はそう

CVector temp; 
    temp.x = x + param.x; 
    temp.y = y + param.y; 
    return (temp); 

これは外側のスコープが一時のブランドの新しいコピーを取得し返すとき、(オブジェクト参照がCVector& ...ようになります)CVectorの独立したコピーを返すと言います。だから、私たちはもはや私たちと一緒ではありませんが、外側の範囲はコピーを受け取っています。

2

値を返すので、tempが破棄される前にコピーされます。

1

値で返されます。
これは、値のコピーがtempから作成され、返されることを意味します。

参照によってオブジェクトを返すには、戻り値の署名に&が必要です。

2

コンパイラの最適化後、オブジェクトは返されるアドレスに作成されます。一時オブジェクトはスタックに作成されません - >次にコピーしてアドレスを返します - >それを破棄します。

+1

私は、潜在的な最適化については話しません。重要な点は、*意味的に*オブジェクトが関数が完了する前の*戻り値にコピーされていることです( 'return'ステートメントで)。そのコピーが最適化されているかどうかは実装の詳細です。 –

関連する問題