嗨,谁能在下一个代码中解释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;
}
答案 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。