2012-11-30 45 views
0

在運算符重載期間總是編寫自己的拷貝構造函數是否安全?處理運算符超載時的懸掛指針/引用

Complex Complex::operator+(const Complex& other) 
{ 
    Complex local ; 
    local.result_real = real + other.real; 
    local.result_imaginary = imag + other.imag; 
    return local ; 
} 

大部分時間我都看過上面的格式,而不是返回它作爲參考。

我們可以採取拇指規則就像 1-通過引用總是傳遞給函數的參數。 2-總是通過引用返回對象。

運算符重載中是否有任何特殊情況,我們必須僅按值返回對象?

+1

您的意思是:永遠不要通過引用返回(除非您確切知道您在做什麼)。 – melpomene

+1

這取決於你的重載是什麼操作符,請參閱[操作符重載](http://stackoverflow.com/questions/4421706/operator-overloading),它會回答你所有的問題和更多。 –

+0

通過引用返回本地將導致未定義的行爲。唯一可以通過引用返回對象的情況是:1)通過方法返回當前對象。 2)你創建一個新對象並返回它的引用,處理它的刪除。 –

回答

1

,我們可以採取像1-經驗法則始終按引用傳遞函數參數。 2-總是通過引用返回對象。

不,不是真的。即使您找到了返回非懸掛引用的方法,但添加等操作不應返回引用,因爲這沒有意義。 a+b應該返回一個新對象,而對於a+=b,返回對LHS的引用是有意義的。

關於通過引用傳遞參數,也沒有經驗法則。試想一下:

A operator+(const A& lhs, const A& rhs) 
{ 
    A tmp = lhs; // explicitly make a copy 
    return tmp += rhs; 
} 

這:

A operator+(A lhs, const A& rhs) 
{ 
    return lhs += rhs; 
} 

第二個版本按值傳遞一個參數,產生簡單的代碼,並給予編譯器更多的機會來臨時的Elid副本。

0

對於某些運算符,您應該返回一個引用,對於其他運算符則不應該,還有一些運算符會完全返回其他類型(如比較運算符)。

在你的情況下,你不應該。特別是因爲您將返回對本地變量的引用,該函數返回時該變量將無效。