2013-10-09 44 views
0

因此,例如:運算符=通常返回對C++中對象的引用的原因?

const Ball& operator=(const Ball& other) 
{ 
    // Irrelevant code 

    return *this; 
} 

所以我聽說你回到一個參考,因爲級聯的對象:

Ball a,b,c; 
// Unimportant initializations 
a=b=c; 

但爲什麼不能在方法是這樣的:

const Ball operator=(const Ball& other) 
{ 
    // Irrelevant code 

    return *this; 
} 

或者這樣:

const Ball* operator=(const Ball& other) 
{ 
    // Irrelevant code 

    return this; 
} 

,如果我這樣做什麼:

Ball *a, *b, *c; 
// Unimportant initializations 
a = b; 

會用這兩種方法這項工作我提供?

我很抱歉,如果這些是愚蠢的問題。我對C++還是比較陌生的。 任何幫助將很好。

+0

@jrok我混淆了兩個操作符。沒關係。 – 2013-10-09 20:17:59

回答

2

以價值回報可能會奏效,但是您會做不必要的副本。

通過指針返回會阻止自然鏈接,你需要像

a = *(b = c); 

而且

一些奇怪的事情
Ball *pa; 
Ball *pb; 

pa = pb; 

不會將您的用戶定義的賦值運算符,用於指針賦值運算符是內置的,並做指針分配。

0

如果你有一個const引用,那麼你不能指派給它。如果您返回一個指針,則再次指定指針值,而不是對象實例。

在大多數情況下,堅持所謂的「int語義」是有意義的,而你讓你的類的行爲與int一樣。特別是,你想級聯工作。

0

如果你有一個參考,你可以chain您的操作,這樣

a.add(b).subtract(c); 

但是,如果你返回一個指針或const,你不能這樣做。

3

返回類型是約定,但通常是Ball&而不是const Ball&。我認爲你可以有任何你喜歡的東西(例如,如果你不想返回任何東西)。但最好有一些行爲像分配操作符一樣使用內置類型。這樣,人們不會驚訝你的任務操作員的行爲。

此代碼

Ball *a, *b, *c; 
// Unimportant initializations 
a = b; 

只是指針賦值,它永遠是合法的,但它沒有任何關係的任何賦值運算符定義這是Ball對象不Ball指針。

0

你可以將其定義是這樣的:

const Ball operator=(const Ball& other) 
{ 
    // Irrelevant code 
    return *this; 
} 

但是,您將回到臨時副本。編譯器可能會在優化時爲您解決這個問題。此外,當operator=需要const Ball&時,鏈接a = b = c,則傳遞臨時引用。

返回指針將不起作用,因爲您無法鏈接,並且您正在處理不同的數據類型(左側的指針,右側的常量引用)。

0

這個片段是合法的:

int a; 
(a = 2)++; 

在一個聲明中,我們分配給2a然後遞增a。這意味着a = 2必須評估爲對a的引用。

爲了用用戶自定義類型複製此行爲,賦值運算符需要返回一個引用。

相關問題