2017-11-25 5 views
-1

私は、さまざまな演算子のオーバーロードを行っていて、何が起きているかを見るためにprintステートメントを追加しました。ポストインクリメント演算子がオーバーロードされたとき、コンストラクタが2回呼び出されているのがわかりましたが、理由はわかりません。なぜC++でポストインクリメント演算子のオーバーロードがコンストラクタを2回呼び出すのですか?

#include <iostream> 
using namespace std; 

class ParentClass { 
    public: 
    ParentClass() { 
     cout << "In ParentClass!" << endl; 
    } 
}; 

class ChildClass : public ParentClass { 
    public: 
     int value; 
     ChildClass() { } 
     ChildClass(int a) 
     : value(a) { 
      cout << "In ChildClass!" << endl; 
     } 

     int getValue() { return value; } 

     ChildClass operator++(int) { 
      cout << "DEBUG 30\n"; 
      this->value++; 
      return this->value; 
     } 
}; 

int main() { 
    cout << "DEBUG 10\n"; 
    ChildClass child(0); 
    cout << "value initial  = " << child.getValue() << endl; 
    cout << "DEBUG 20\n"; 
    child++; 
    cout << "DEBUG 40\n"; 
    cout << "value incremented = " << child.getValue() << endl; 
} 

このコードを実行した後、出力は次のようになります。

DEBUG 10 
In ParentClass! 
In ChildClass! 
value initial  = 0 
DEBUG 20 
DEBUG 30 
In ParentClass! 
In ChildClass! 
DEBUG 40 
value incremented = 1 
+0

コードは** post ** - インクリメント演算子をオーバーロードしますが、** pre ** - インクリメントを実装することに注意してください。 –

+0

@PeteBecker多分私は何かが欠けている。私は、演算子++(int)でパラメータ 'int'を追加すると、ポストインクリメントが実装されると思いましたか? – yamex5

+1

コードはインクリメントされた値を返します。これがプリインクリメントの機能です。ポストインクリメントは元の値を返す必要があります。 –

答えて

1

この文

return this->value; 

int

を返す言うしかし、メソッドプロトタイプは

です

したがって、intが必要です。ChildClass - intから1つを構築してください。したがって、出力

+0

私は結果を持つ新しい型が返されるバイナリ演算子の例に従っていました。私はreturn文を削除しましたが、実際にはコンストラクタが呼び出されましたが、今は一度呼び出されます。また、戻り値の型をintに変更することもできます。ありがとう! – yamex5

+1

@ yamex5、 'ChildClass'の' ++ 'が' int'を返すことは 'operator ++'の通常の動作を期待している人にとっては本当に面倒です。詳細については、[オペレータのオーバーロードの基本ルールとイディオムは何ですか?](https://stackoverflow.com/questions/4421706/what-are-the-basic-rules-and-idioms-for-operator-overloading)を参照してください。演算子のオーバーロードに関する書き込み。 – user4581301

+0

@ user4581301 - 'int'を返さない。プロトタイプと私の説明を参照してください –

関連する問題