5

ここにコード過負荷を後置し、接頭辞オペレーター

#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; 
    } 

を以下の点を考慮してください接尾とプレフィックス演算子の2つのバージョンが実装されて、私は読んだことがその差は別の、いわゆる仮引数を導入することによって行われるが、場合、私は疑問を持っています私たちは、++演算子は、引数の前に書かれており、それは彼らがあることを意味しません。例えば、なぜそれが必要な仮引数のですか?そしてまた、両方の場合には、それらは&マークによって異なっているこれらの

Digit& operator++();//prefix 
      Digit& operator--(); //prefix 
     Digit operator++(int); 
     Digit operator--(int); 

の宣言を参照してください同じ?

答えて

9

プレインクリメントとポストインクリメントは2つの異なる演算子であり、別々のオーバーロードが必要です。

C++では、戻り値の型でのみオーバーロードが許可されていないため、例のように異なる戻り値の型を持つと、2つのメソッドを明確にするには不十分です。

仮引数は、C++のデザイナが曖昧さ除去のために選択したメカニズムです。

+0

私は、曖昧さ回避のために選択された方法である理由について、腕またはどこかに表記があると想像します。答えは、おそらく "他の方法はありませんでした"という単純なものです。 –

2

オペレータは、任意の関数と同様に、シグネチャによって識別されます。関数/演算子名の前の戻り値の型と修飾子は、この中には含まれていません。演算子の名前はここにあります

operator++() 
operator++(int) 

これは、コンパイラが2つの間で区別する唯一の方法です。 Digit&Digitの戻り値は次のとおりです。 ++ xとx ++が動作するために必要です。

2

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