8

次のコードを検討してください

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

それらは&マークで異なるので、なぜダミー引数が必要なのですか?また、どちらの場合も、たとえば++演算子は引数の前に記述され、それらが同じであることを意味しませんか?

4

4 に答える 4

12

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

C ++では、return型のみのオーバーロードは許可されていないため、例のように異なるreturn型を使用するだけでは、2つのメソッドの曖昧さを解消するのに十分ではありません。

ダミー引数は、C++の設計者が曖昧性解消のために選択したメカニズムです。

于 2011-10-12T12:54:21.337 に答える
4

演算子は、他の関数と同様に、署名によって識別されます。関数/演算子名の前の戻りタイプと修飾子はこれに含まれていません。あなたのオペレーター名はここにあります

operator++()
operator++(int)

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

于 2011-10-12T13:00:19.383 に答える
3

プレインクリメント/デクリメントとポストインクリメント/デクリメントでは、違いはオーバーロードされた関数のダミーパラメータのみに基づいています

operator++()         => Prefix Increment
operator--()         => Prefix Decrement

operator++(int)      => Postfix Increment
operator--(int)      => Postfix Decrement

リターンタイプは同じでもかまいません。また、参照することもできます:http ://www.tutorialspoint.com/cplusplus/increment_decrement_operators_overloading.htm

于 2016-02-24T06:28:52.493 に答える
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を参照してください

于 2011-10-12T13:00:19.950 に答える