C++ 初始化列表

标签 c++ initialization

我有一个关于 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/

相关文章:

c - 使用先前声明的数组初始化结构

c++ - Xcode 代码感知不工作(找不到符号)

c++ - Hierarchical State Machine 涉及的原理是什么,如何实现基本模型?

c++ - 制作一个优化未使用部分的元组样式类

java - 变量初始化

c++ - 为什么这个 C++ 成员初始值设定项列表不起作用?

c++ - 自动构建 ID

c++ - Qt QInputDialog参数列表

python - 在 Django/mod_wsgi 中进行一次性初始化的安全方法是什么?

c# - 是否可以从具有值的运行时对象自动生成对象初始化代码?