我有一个关于 c++ Initializer list 的问题,我在某处看到以下代码:
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 是否也会根据传递的参数创建? 怎么会这样?
最佳答案
您发布的代码有误。
首先,要像那样调用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
希望这很清楚。
关于C++ 初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9158708/