【问题标题】:Problem With Undesrtanding How Constructors Work [closed]理解构造函数如何工作的问题[关闭]
【发布时间】:2018-10-29 20:06:17
【问题描述】:

您好,谁能在下一个代码中解释 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;
}

【问题讨论】:

  • 发布的代码无法编译。
  • 这将有助于逐步完成并发布您认为在每个步骤中发生的事情。然后,答案可以准确地告诉您哪一步与您的期望不同。
  • @NeilButterworth 在修正了琐碎的错字后,it does
  • @user463035818 人们总是用这样的例子来讨论语言的怪癖。如果您认为没有意义,请自己保留。
  • 这段代码是你自己写的吗?它的目的是什么?

标签: c++ class object constructor field


【解决方案1】:

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

也就是说,当你这样做时

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,所以通过添加9 变成16。仅此而已。

【讨论】:

    【解决方案2】:

    p 参数为 2。在a 的初始化器中,p 递增为 3,a 初始化为旧值 2。

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

    c 没有初始化器,所以使用默认初始化器。在那里,b 递增到 7,c 初始化为相同的值。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 2018-10-31
      • 2014-06-13
      • 2013-08-26
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多