我对c ++初始化列表有疑问,我在下面看到以下代码:
class A {
public:
A(String sender, String receiver, String service) {
//do something here
}
}
class B {
public:
B(String sender, String receiver, String service) {
//do something here
}
}
然后以下列方式创建对象:
A::A(sender,receiver, service) : B(sender,receiver, service) {
//do something here
}
是否也会根据传递的参数创建B? 怎么会发生这种情况?
答案 0 :(得分:5)
您发布的代码错误。
首先,要像这样调用B
的构造函数,A
必须从B
派生。
其次,您为A::A
提供了2个实现。
我将在下面的例子中解释:
class B
{
int _x;
public:
B();
B(int x);
}
B::B()
{
_x = 42;
}
B::B(int x)
{
_x = x;
}
class A : public B
{
public:
A(int x);
};
A::A(int x) : B(x) {}
现在,由于A
是一个B
(这就是继承),每当你构造一个A
时,一个基础对象 - B
- 也将被构造。如果未在初始值设定项列表中指定它,则将调用B
- B::B()
的默认构造函数。即使您没有声明,它确实存在。
如果您指定了不同版本的构造函数 - 就像在这种情况下B::B(int)
那样,将调用该版本。
这就是语言的设计方式。
编辑:
我编写了一些代码。
假设A
的构造函数的以下定义:
A::A(int x) : B(x) {}
//...
A a(10);
//a._x will be 10
但是,如果您的构造函数定义为:
A::A(int x) {}
将调用 B
的默认构造函数:
A a(10);
//a._x will be 42
希望这很清楚。