8

私が知っているように、ポストインクリメント演算子をオーバーロードする方法は次のとおりです。

const MyClass& MyClass::operator++(int);

引数として int があるのはなぜですか?

4

2 に答える 2

12

D&E、§11.5.3:

私は明白な解決策を考え、キーワードを C++ に追加しましたprefix[ postfix... ] しかし、新しいキーワードを嫌う人々からいつものように怒りの遠吠えを受けました。新しいキーワードを含まないいくつかの代替案が提案されました。例えば:

   class Ptr_to_X {
       X ++operator(); // prefix ++
       X operator++(); // postfix ++
   };

また

   class Ptr_to_X {
       X& operator++(); // postfix because it 
                        // returns a reference
       x operator();    // prefix because it
                        // doesn't return a reference
   };

前者は可愛すぎ、後者は地味すぎると思いました。最後に私は落ち着いた:

   class Ptr_to_X {
       X operator++();     // prefix: no argument
       X operator++(int);  // postfix: because of the argument
   };

これはかわいすぎて微妙すぎるかもしれませんが、機能し、新しい構文を必要とせず、狂気への論理があります。他の単項演算子は接頭辞であり、メンバー関数として定義されている場合は引数を取りません。「奇数」および未使用の仮int引数は、奇数の後置演算子を示すために使用されます。つまり、後置の場合、++は最初の (実) オペランドと 2 番目の (ダミー) 引数の間にあるため、後置になります。

これらの説明が必要な理由は、メカニズムが独特であり、それゆえに少し疣贅があるからです。選択肢があれば、おそらくprefixandpostfixキーワードを導入したでしょうが、その時点では実行可能ではないように思われました。

于 2012-10-05T06:19:17.913 に答える
3

これは、前置インクリメント演算子と後置インクリメント演算子を区別するためです。

完全を期すために、これは C++03 標準と C++11 標準の両方で §13.5.7 に規定されています。

于 2012-10-05T06:02:11.580 に答える