2017-03-31 161 views
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

當默認構建Basehello成員(在this->hello = hello;分配之前)時調用它。

使用成員初始化列表,以避免這種情況(即直接從參數hello拷貝構造hello成員):

Base(const Hello &hello) : hello(hello) { } 
相關問題