我正在阅读有效的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构造函数而不是调用基类的构造函数。任何人都可以澄清这个概念。
答案 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)
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的成员)。