首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++初始化器列表

c++初始化器列表
EN

Stack Overflow用户
提问于 2012-02-06 18:27:04
回答 1查看 390关注 0票数 0

我有一个关于c++初始化器列表的问题,我在某个地方看到了以下代码:

代码语言:javascript
复制
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
                                                    }
}

然后通过以下方式创建对象:

代码语言:javascript
复制
A::A(sender,receiver, service) : B(sender,receiver, service) {
//do something here
}

是否也会基于传递的参数创建B?这怎么会发生呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-06 18:32:00

您发布的代码是错误的。

首先,要像这样调用B的构造函数,必须从B派生A

其次,您为A::A提供了两个实现。

我将在下面的示例中进行解释:

代码语言:javascript
复制
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的构造函数定义如下:

代码语言:javascript
复制
A::A(int x) : B(x) {}
//...
A a(10);
//a._x will be 10

但是,如果您的构造函数定义为:

代码语言:javascript
复制
A::A(int x) {}

B的默认构造函数将被调用:

代码语言:javascript
复制
A a(10);
//a._x will be 42

希望你说的很清楚。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9158708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档