为什么这个构造函数被调用两次?

时间:2017-03-31 16:51:41

标签: c++ c++11 constructor

我有这段代码:

// 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!

为什么会这样?

1 个答案:

答案 0 :(得分:17)

在默认构建hello成员Base时(this->hello = hello;分配之前)调用它。

使用成员初始值设定项列表来避免这种情况(即直接从参数hello复制构造hello成员):

Base(const Hello &hello) : hello(hello) { }