2017-03-31 89 views
2

私はこのコードを持っている:なぜこのコンストラクタが2回呼び出されますか?

// Example program 
#include <iostream> 
#include <string> 

class Hello{ 
    public: 
    Hello(){std::cout<<"Hello world!"<<std::endl;} 
}; 

class Base{ 
    public: 
    Base(const Hello &hello){ this->hello = hello;} 
    private: 
    Hello hello; 
}; 

class Derived : public Base{ 
    public: 
    Derived(const Hello &hello) : Base(hello) {} 
}; 

int main() 
{ 
    Hello hello; 
    Derived d(hello); 
    return 0; 
} 

は、印刷結果は次のとおりです。

Hello world! 
Hello world! 

この問題が発生したのはなぜ?

+3

これは、動きの意味とは何の関係もありません。あなたのコードに動きはありません。 –

答えて

17

メンバをBasethis->hello = hello;割り当ての前)に構成するときに呼び出されます。

この(すなわち、パラメータhelloから直接helloメンバーをコピー-構築すること)を避けるためにメンバー初期化子リストを使用します。

Base(const Hello &hello) : hello(hello) { } 
関連する問題