2013-11-09 32 views
3

這是從one of the c++ tutorials摘錄:從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); 
} 

int main() { 
    CVector a (3,1); 
    CVector b (1,2); 
    CVector c; 
    c = a + b; 
    cout << c.x << "," << c.y; 
    return 0; 
} 

在操作符重載函數,它創建了一個局部變量temp然後返回它,我很困惑,這是正確的做法?

+3

我們可以給出比一個更有意義的答案「是的「,如果你解釋你對此感到困惑的話。 – interjay

+0

如果您沒有指出'operator +'通常以'operator + ='的形式實現的事實。 – chris

+0

'return(temp)'中的圓括號是否必要? – qed

回答

5

「這是正確的方法嗎?」

是的。請注意,它不是本地變量,但副本實際返回的局部變量,這是完全有效的,正確的事情。在通過指針或引用返回時返回本地變量時要謹慎,而不要在返回值爲的情況下返回

+0

也許這樣的操作可能導致未定義的行爲。例如,如果類存儲一個指向某個在構造函數中分配的字符串的指針,並且它只有默認的複製構造函數。 – Michael

+0

@邁克爾:但這不是這種情況,與這件事情毫不相干。 – LihO

+0

好的。然後使用下面的鏈接描述的類將在這裏好吧:http://stackoverflow.com/questions/3278625/when-do-we-have-to-use-copy-constructors? – Michael

1

是的,因爲它是按價值返回的。有功能有下面的簽名,它不會是正確的:

CVector& CVector::operator+(CVector param); 

順便說一句,更有效的實現看起來像:

CVector CVector::operator+(const CVector &param) const; 
+0

總之,通過引用,按價值回報。 – qed

相關問題