簡體   English   中英

重載后綴和前綴運算符

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

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