我很好奇为什么可以在构造函数中修改 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/