簡體   English   中英

Postfix運算符重載中虛擬參數的目的? C++

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM