初始化列表的好处 - 避免调用默认构造函数

时间:2013-01-25 00:45:31

标签: c++

我正在阅读有效的C ++并且我无法真正理解初始化列表中提到的一个好处。据我所知,初始化列表还有助于避免调用不必要的默认构造函数,尤其是在不需要它们时。所以为了测试我创建了一个简单的代码示例

class base
{
public:

    base()
    {
        std::cout << "Default Constructor called \n";
    }
    base (int i)
    {
        std::cout << "Int constructor called \n";
    }
};

class der : public base
{
private:
    base b;
public:
    der(int i):b(i)
    {
        std::cout << "Derived constructor called \n";
    }
};

void main()
{
    der d(12);
}

不,我假设只调用int构造函数而不是调用基类的构造函数。任何人都可以澄清这个概念。

4 个答案:

答案 0 :(得分:4)

问题是你实际上有2个base个实例,一个是成员,一个是基础。请更改为der(int i):base(i),b(i)或删除该成员。

答案 1 :(得分:1)

请记住,您要将base类型的成员添加到der类,这也需要构建。该成员正在使用不带参数的构造函数进行初始化。你的意思是:

class base
{
private:
    int num;
public:

    base()
    {
        std::cout << "Default Constructor called \n";
    }
    base (int i) : num(i)
    {
        std::cout << "Int constructor called \n";
    }
};

class der : public base
{
private:
    //base b;
public:
    der(int i):base(i)
    {
        std::cout << "Derived constructor called \n";
    }
};

void main()
{
    der d(12);
}

答案 2 :(得分:1)

如Ylisar所述,

der有两个base instances由于base具有默认构造函数,因此将在构造函数中隐式调用它。

C ++也只支持以下两种形式的main函数,C ++中没有void main()

§3.6.1主要功能

  

实现不应预定义主函数。这个功能   不得超载。它应该具有int类型的返回类型,但是   否则其类型是实现定义的。所有实施   应允许以下两个主要定义:

     

int main(){/ * ... * /}

     

     

int main(int argc,char * argv []){/ * ... * /}

答案 3 :(得分:0)

在你的der中,有两个基类,一个是继承,另一个是b(der的成员)。