2016-04-23 60 views
3

在重載後綴運算符,我可以做一些簡單的像後綴運算符過載中虛擬參數的用途? C++

Class Foo 
{ 
private: 
    int someBS; 
public: 
    //declaration of pre &postfix++ 
    Foo operator++(); 
    //rest of class not shown 
}; 

前綴不需要帶任何參數,所以當我定義它,像

Foo Foo::operator() 
{ 
    someBS ++; 
    return *this; 
} 

,這讓對我來說完美的感覺。

當我去定義後綴超負荷我必須包括一個虛擬的int參數

Foo Foo::operator++(int) 
{ 
    Foo temp = *this; 
    someBS ++; 
    return temp; 
} 

我的問題是爲什麼呢?我從來沒有在方法中使用它。前綴運算符不需要一個。返回temp值的後綴不依賴於虛擬參數。我知道如果我想要重載一個postfix操作符,它是如何完成的,我只想知道背後的原因。

+1

你會提出什麼替代方法? –

+0

@AlanStokes,沒有其他辦法。鑑於我不確定其目的,我當然沒有辦法以不同的方式做。 – Podo

+1

@AlanStokes,'Foo ++運算符()'和'Foo運算符++()'怎麼樣? ;) (只有5%嚴重...) – kloffy

回答

5

虛擬參數只是爲了區分後綴和前綴運算符。名稱++--在這兩種情況下都是相同的,所以必須有一些方式來指定您正在定義哪一個。添加一個虛擬參數可能並不優雅,但任何替代方案都可能需要發明新的語法(可能是postfix關鍵字,這會破壞使用postfix作爲標識符的代碼)。

+0

那麼當我去調用帶有類對象的方法時,可以說類似「Foo lilBunny;」的內容,如果我想對它使用後綴,那麼我會在參數中包含什麼值?垃圾?如果它是虛構的,必須通過某些東西,但是因爲它通過了我們無關緊要的事情? – Podo

+1

@JeffreyDilley:你什麼都不通過。你只是說'lilBunny ++;' - 編譯器通過將'++'放在變量名後面而不是之前,來確定你想要的是後綴版本。 –

1

引述cppreference

的int參數是使用運營商的前綴和後綴的版本來區分虛擬參數。

引用說明了一切,因爲如何區分前綴和後綴?

讓我們只說,你不需要int參數,那麼前綴(Foo operator++())和後綴(Foo operator++())是完全一樣的!編譯器如何知道你的意思?這就是爲什麼有這個虛擬int參數。

1

援引C++reference這裏:

內置運營商的前綴版本返回引用和後綴版本返回值,和典型的用戶定義的重載遵循的模式,使用戶定義的運算符可以用在與內置插件相同的方式。

解釋這個邏輯:

int a = 3; 
int b = 0; 

int c = a + ++b; 
int d = a++ + b; 

在第三行,++b爲您提供了更新值的參照;在第四行中,這是不可能的:a必須增加,因此創建了一個值複製,並將其添加到b。這決定了操作員的不同語義。

其實,只是爲了避免另一家運營商名稱:

的int參數是使用運營商的前綴和後綴的版本來區分虛擬參數。當調用用戶定義的postfix運算符時,該參數中傳遞的值始終爲零,儘管可以通過使用函數調用符號(例如a.operator ++(2)或operator ++(a,2))調用運算符來更改該值。 。