C ++:将值分配给对象和类之间的区别

时间:2018-10-25 23:18:31

标签: c++ class

#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。我想知道它们之间有什么区别?

1 个答案:

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