我有一个关于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?这怎么会发生呢?
发布于 2012-02-06 18:32:00
您发布的代码是错误的。
首先,要像这样调用B的构造函数,必须从B派生A。
其次,您为A::A提供了两个实现。
我将在下面的示例中进行解释:
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希望你说的很清楚。
https://stackoverflow.com/questions/9158708
复制相似问题