【问题标题】:C++ constants initialization when one constant takes other constant value当一个常量取其他常量值时的 C++ 常量初始化
【发布时间】:2015-03-24 16:36:01
【问题描述】:

我无法在一个常量依赖于另一个常量值的类中初始化常量。

class foo {
private:
   const int secondConst;
   const int firstConst;
public:
   foo(int x) :
          firstConst(x),
          secondConst(firstConst*3)
   {
       // constructor code here....
   }
}

secondConst 是一个垃圾值, 如何正确初始化它? 也许在 C++ 中,一个常量在初始化期间不能依赖其他常量?

我编辑了我的帖子。问题真的是在原始代码中我切换了声明它们的 const 字段。

【问题讨论】:

  • 我认为这应该可行,但作为一种解决方法你不能这样做:foo(int x) : firstConst(x), secondConst(x*3) ?
  • 应该可以;一定还有其他问题。你能发一个complete test case来证明这个问题吗?
  • 出于多种原因,我避免使用这样的 const 成员。如果您想要一个不改变的 Foo 对象,请将其设为 const。
  • It does work,请提供重现您在问题中提到的行为的代码。
  • 每个成员初始化之间都有一个序列点,所以这段代码是正确的。但是,您确定您的实际代码中的成员按初始化顺序声明,就像它们在这里一样吗?成员按照它们在类声明中出现的顺序进行初始化,而不是它们在初始化列表中出现的顺序。

标签: c++ initialization constants


【解决方案1】:

您的示例对我有用。但是,如果我将订单更改为拥有

private:
   const int secondConst;
   const int firstConst;

然后secondConst 得到垃圾。原因是数据成员是按照它们声明的顺序进行初始化的,而不是按照它们在成员初始化列表中出现的顺序。

来自标准:

然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化 (同样不管 mem-initializers 的顺序如何)。

【讨论】:

  • @user3528438 如果编译器支持:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 2021-04-22
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
相关资源
最近更新 更多