【问题标题】:Is modify const in constructor C++ standard?在构造函数 C++ 标准中修改 const 吗?
【发布时间】:2014-05-07 02:31:09
【问题描述】:

在构造函数 C++ 标准中修改 const 吗?我正在修改我的 struct 删除固定值(默认成员初始值设定项)以稍后在构造函数时设置它,但我忘记删除 const 关键字并稍后注意到它。令我惊讶的是,我没有收到编译错误,它运行良好,但对于测试用例 2,它提供了一个编译器。它们有何不同?

测试用例 1:

struct A
{
    const int x = 2;

    A()
        : x(3)
    {
    }
};

测试用例 2:

struct A
{
    const int x = 2;

    A()
    {
           x = 3; // compile error!  error: read-only variable is not assignable
    }
};

【问题讨论】:

标签: c++ constructor initialization constants


【解决方案1】:

此语法是在 C++11 中添加的:

struct A
{
    const int x = 2;

在这种情况下,2 类似于用于初始化x 的“默认”值。如果您在构造函数的初始化列表中初始化 x,那么这就是使用的值。但是,如果您没有这样做,则使用 2

这是在 C++11 中添加的,以避免在有多个构造函数的情况下必须在初始化列表中重复操作的乏味。

【讨论】:

    【解决方案2】:
    1. 问题是对象必须完全初始化,然后构造函数的主体才能开始使用它。这意味着必须在内存中保留足够的空间来放置新对象的实例。

    2. 如果将数据成员 (int x) 声明为 const,则禁止自己更改其值,一旦创建,这意味着必须在创建期间设置该值。

    在示例 1 中,您首先创建 int x 并将其设置为值 3(将驻留在为您的对象保留的内存中),然后才执行构造函数的主体。

    在示例 2 中,您创建了新对象(为您的 int x 设置了一些值),然后您尝试在构造函数中修改它,这是 const 关键字所禁止的。

    【讨论】:

      【解决方案3】:

      在第一个示例中,初始化常量变量,在第二个示例中,为它赋值,在默认构造变量之后。这些是不同的操作,并且在初始化后不能对常量进行赋值。

      【讨论】:

      • 当然,所有这些都用 const 强制转换
      猜你喜欢
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多