c ++初始化列表

时间:2012-02-06 10:27:04

标签: c++ initialization

我对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? 怎么会发生这种情况?

1 个答案:

答案 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

希望这很清楚。