[英]overloading postfix and prefix operators
請考慮以下代碼
#include <iostream>
using namespace std;
class Digit
{
private:
int m_digit;
public:
Digit(int ndigit=0){
m_digit=ndigit;
}
Digit& operator++();//prefix
Digit& operator--(); //prefix
Digit operator++(int);
Digit operator--(int);
int get() const { return m_digit;}
};
Digit& Digit::operator++(){
++m_digit;
return *this;
}
Digit& Digit::operator--(){
--m_digit;
return *this;
}
Digit Digit::operator++(int){
Digit cresult(m_digit);
++(*this);
return cresult;
}
Digit Digit::operator--(int){
Digit cresult(m_digit);
--(*this);
return cresult;
}
int main(){
Digit cDigit(5);
++cDigit;
cDigit++;
cout<<cDigit.get()<<endl;
cout<<cDigit.get()<<endl;
return 0;
}
這里實現了postfix和prefix運算符的兩個版本,我已經讀到引入另一個所謂的啞元參數是有區別的,但是我有疑問我們是否看到這些聲明
Digit& operator++();//prefix
Digit& operator--(); //prefix
Digit operator++(int);
Digit operator--(int);
它們之間用&標記區別,那么為什么必須使用偽參數呢?在這兩種情況下,例如++運算符都寫在參數之前,這並不意味着它們相同嗎?
增量前和增量后是兩個不同的運算符,並且需要單獨的重載。
C ++不允許僅在返回類型上進行重載,因此像您的示例中那樣使用不同的返回類型不足以消除這兩種方法的歧義。
虛擬參數是C ++設計人員為消除歧義而選擇的機制。
就像任何功能一樣,操作員也可以通過簽名來識別。 函數/運算符名稱前面的返回類型和修飾符不包括在其中。 您的運營商名稱在這里
operator++()
operator++(int)
這是編譯器區分兩者的唯一方法。 至於Digit&
和Digit
返回值; 由於++ x和x ++應該運行的方式而需要它們。
在預增/減和后增/減中,差異僅基於重載函數中的虛擬參數
operator++() => Prefix Increment
operator--() => Prefix Decrement
operator++(int) => Postfix Increment
operator--(int) => Postfix Decrement
返回類型可能相同。 您也可以參考: http : //www.tutorialspoint.com/cplusplus/increment_decrement_operators_overloading.htm
在C ++中,函數/方法不能由返回類型重載,只能由參數列表重載。 忽略前綴和后綴運算符是運算符的事實,想象一下如果它們只是簡單的其他函數,編譯器將如何根據返回類型確定要使用的函數? 例如
int x = 2;
const int DoIt()
{
return 1;
}
int& DoIt()
{
return x;
}
int y = DoIt();
由於運算符重載實際上只是功能的核心,因此編譯器無法按返回類型區分它們。
參見http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.14
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.