-1

我正在阅读有效的 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

4 回答 4

4

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

于 2013-01-25T00:53:40.380 回答
1

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

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);
}
于 2013-01-25T00:56:35.400 回答
1

der有两个base instances,正如 Ylisar 所解释的那样。由于 base 有默认构造函数,它将在 der 构造函数中被隐式调用。

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

§3.6.1 主要功能

实现不应预定义主要功能。该功能不得重载。它应该有一个 int 类型的返回类型,否则它的类型是实现定义的。所有实现都应允许以下两种 main 定义:

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

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

于 2013-01-25T01:04:50.290 回答
0

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

于 2013-01-25T01:49:40.277 回答