[英]Purpose of Dummy Parameter in Postfix Operator Overload? 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
關鍵字,它會破壞使用postfix
作為標識符的代碼)。
在此處引用C++ 參考:
內置運算符的前綴版本返回引用,后綴版本返回值,典型的用戶定義重載遵循該模式,以便用戶定義運算符可以以與內置運算符相同的方式使用。
從邏輯上解釋這一點:
int a = 3;
int b = 0;
int c = a + ++b;
int d = a++ + b;
在第三行中, ++b
為您提供了對更新值的引用; 在第四行中,這是不可能的: a
必須增加,因此創建了一個值副本,並將其添加到b
。 這決定了運算符的不同語義。
事實上,只是為了避免使用另一個操作符名稱:
int 參數是一個虛擬參數,用於區分運算符的前綴和后綴版本。 當調用用戶定義的后綴運算符時,該參數中傳遞的值始終為零,盡管可以通過使用函數調用符號(例如,a.operator++(2) 或 operator++(a, 2))調用運算符來更改它.
引用cppreference :
int 參數是一個虛擬參數,用於區分運算符的前綴和后綴版本。
引言說明了一切,因為您還如何區分前綴和后綴?
假設您不需要int
參數,那么前綴( Foo operator++()
)和后綴( Foo operator++()
)將完全相同! 編譯器怎么知道你指的是哪一個? 這就是為什么有這個虛擬int
參數的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.