c++ - 为什么可以在构造函数中修改 const 成员?

标签 c++ c++11 initialization c++14 constants

我很好奇为什么可以在构造函数中修改 const 成员。

初始化中是否有任何标准规则可以覆盖成员的“常量”?

struct Bar {
    const int b = 5; // default member initialization
    Bar(int c):b(c) {}
};

Bar *b = new Bar(2); // Problem: Bar::b is modified to 2
                     // was expecting it to be an error

有什么想法吗?

最佳答案

这不是修改(或赋值),而是 initialization .例如

struct Bar {
    const int b = 5; // initialization (via default member initializer)
    Bar(int c)
        :b(c)        // initialization (via member initializer list)
    {
        b = c;       // assignment; which is not allowed
    }
};

const 数据成员无法修改或分配,但可以(并且需要)通过成员初始化器列表或默认成员初始化器进行初始化。

如果在同一个数据成员上同时提供了默认成员初始化器和成员初始化器,则默认成员初始化器将被忽略。这就是为什么 b->b 被初始化为值 2

If a member has a default member initializer and also appears in the member initialization list in a constructor, the default member initializer is ignored.

另一方面,默认成员初始化器只有在成员初始化器列表中没有指定数据成员时才会生效。例如

struct Bar {
    const int b = 5;   // default member initialization
    Bar(int c):b(c) {} // b is initialized with c
    Bar() {}           // b is initialized with 5
};

关于c++ - 为什么可以在构造函数中修改 const 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49525941/

相关文章:

c++ - 如何在命名空间中初始化外部变量

c - 评估包含未初始化指针的条件 - IN,但它会崩溃吗?

C++读取文本文件直到特定的分隔符

C++14 堆栈分配的共享指针

c++ - 无锁原子循环队列无法正常工作

c++ - 为什么 std::map 在按值传递给 lambda 时表现异常?

java - 获取 "Could not initialize class sun.security.ec.SunEC"如何继续?

c++ - 贝尔曼福特邻接矩阵的单源最短路径未检测到负循环

c++ - 在编译时将类隐式转换为整数类型(最好是 bool)

c++ - 使用 boost::shared_ptr 的多态分派(dispatch)