【问题标题】:Can const member be initialized in c++ construtor?可以在 c++ 构造函数中初始化 const 成员吗?
【发布时间】:2017-12-26 10:29:29
【问题描述】:

我读到了代码 sn-p here。请搜索“常量类数据成员”以进入该部分。代码如下:

class Test
{
   const int i;
   public:
   Test (int x)
   {
     i=x;
   }
};

int main()
{
 Test t(10);
 Test s(20);
}

我使用 VS2013 警告我它不正确。据我所知, const 成员变量只能由初始化列表初始化。某事。喜欢:

Test (int x):i(x){}

更新的 C++ 标准是否更新来支持它(如果是这样,更改听起来很合理,在函数体中初始化似乎没有区别,对吧?)?或者文件出错了(我想它不会犯这样的错误)。

【问题讨论】:

  • 第一个代码 sn-p 在任何 C++ 标准中都不正确。
  • 是的,它可以被初始化。但你不是在初始化它,而是在分配它。
  • 您应该继续学习本教程。构造函数初始化列表稍后解释studytonight.com/cpp/initializer-list-in-cpp.php

标签: c++ initialization constants


【解决方案1】:

规则没有改变(从 C++98 开始)。

注意构造函数体内的i=x;不是初始化而是赋值;它们是不同的东西。对于const成员,只能是initialized

对于不能默认初始化的成员,例如引用成员和 const 限定类型的成员,必须指定成员初始化器。

例如Test (int x):i(x){},

但它们不能被分配,

Test (int x)
{
  i=x;  // assignment is not allowed
  ...
  i=42; // assignment again; that makes no sense for const at all
}

【讨论】:

    【解决方案2】:

    是的,const 成员只能被初始化(通过使用初始化列表)而不是分配给,如您的代码 sn-p 所示。不,较新的 C++ 标准尚未对此进行更新以支持构造函数中的赋值。

    包含该代码 sn-p 的相关教程是错误的。我建议不要阅读这样的教程,因为它们往往会出现细微(而且不那么细微)的错误。

    【讨论】:

    • @EdHeal 我喜欢在周末编程。唱歌只是兼职。
    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多