不懂建设者工作方式的问题

时间:2018-10-29 20:06:18

标签: c++ class object constructor field

嗨,谁能在下一个代码中解释b = 16(对象“ o”字段b的值)如何?

class T{
  int a=5;
  int b=++a;
  int c=++b;
  public:
   T(int p): a(p++), b(a*p){b+=a+c;}
};

int main(){
  T o(2);
  return 0;
}

2 个答案:

答案 0 :(得分:2)

首先要注意的是,这段代码依赖于在类中声明对象的顺序,因此使初始化非常脆弱(如果顺序更改了输出,则更改)。

也就是说,当您这样做

T(int p): a(p++), b(a*p){b+=a+c;}

编译器将构造函数转换为

T(int p): a(p++), b(a*p), c(++b) {b+=a+c;}

因为未指定c,所以我们从类主体中提供的默认值中获取了它的初始化程序。类成员按照在类主体中声明的顺序进行初始化,因此在这种情况下,它将与成员初始化列表中的指定方式匹配。所以我们将从

开始
a(p++)

a初始化为2,并将p递增为3。然后

b(a*p)

b初始化为6。最后

c(++b)

b递增到7,然后将c初始化为7。然后我们运行构造函数的主体,这样

b+=a+c;

成为

b += 2 + 7

,由于b已经是7,因此通过向其添加16成为9。这就是全部。

答案 1 :(得分:0)

p的参数为2。在a的初始值设定项中,p递增为3,而a则初始化为旧值2。

b初始化为2 * 3 == 6。

c没有初始化程序,因此使用默认的初始化程序。在那里,b递增到7,c被初始化为相同的值。

最后,在构造函数主体中,复合赋值将2 + 7加到b上,得到16。