#include <iostream>
using namespace std;
class A{
public:
int a;
A() {a=0;}
A(int b) {a=b+1;}
};
class B{
public:
A a;
B():a(0) {}
};
int main(void) {
B *b = new B();
cout<<b->a.a<<endl;
return 0;
}
我将B():a(0) {}
替换为B() {A(0)}
,并且输出从1更改为0。我想知道它们之间有什么区别?
答案 0 :(得分:3)
B() : a(0) {}
用值B::a
显式初始化成员0
。这是member initializer list的示例。基本上,a(0)
在此上下文中使用参数a
调用0
的构造函数,该函数调用A::A(int)
,在您的实现中,将1
添加到参数并将结果分配给A::a
。因此,在第一种情况下,b->a.a == 1
。
另一方面,B() {A(0);}
默认初始化B::a
(因为A
具有默认构造函数)并创建了无名的本地临时对象A(0);
,该对象被立即销毁而没有改变任何东西。它在功能上等效于B(){}
,后者什么也不做。您可以忽略此琐碎的构造函数,因为编译器可以为您隐式生成它。请参阅special member functions,以获取有关其工作方式和条件的更多信息。因此,在第二种情况下,您将调用默认的构造函数,该构造函数设置b->a.a == 0
。