c++ - 为什么声明为类成员的 const 变量仍然可以修改?

标签 c++ c++11 initialization declaration

如果一个已经被赋值的const变量仍然可以被重新赋值,那么它不是一个const?举个例子:

 struct ss
 {
     const int m = 1024;

     ss()
     {
     }

     ss(int m) : m(m)
     {
     }
 };



ss sa;
ss sb(-1);

cout << sa.m << endl;
cout << sb.m << endl; 

哇 m 毕竟不是常数!

> /* Ouput:
> 
> 1024
> -1
> 
> */

最佳答案

 ss(int m) : m(m)
 {
 }

这表示当类 ss 被初始化时,它的成员 m 使用参数 m 被初始化。成员 m 确实不能修改,但可以初始化,就像任何其他 const 对象一样。请注意,如果我们改为这样做

 ss(int m)
 {
     this->m = m;
 }

那么我们就会遇到问题,因为 ss::m 需要初始化。如果 ss::m 是一个带有默认构造函数的类,那么在

 ss(FooClass m)
 {
     this->m = m;
 }

不显式初始化 ss::m 是可以的(因为它只是默认构造的),但是构造函数主体中的行将被拒绝,因为它会修改 ss::m 在它已经被初始化之后。

编辑:糟糕,我不明白你原来的问题。

brace-or-equal-initializer 例如

const int m = 1024;

仅在 ctor-initializer 中未提及成员时使用。换句话说,由于默认构造函数没有显式初始化 m,因此使用值 1024。但是 ss::ss(int) 确实显式初始化了 m,所以 brace-or-equal-initializer 被忽略了。

关于c++ - 为什么声明为类成员的 const 变量仍然可以修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24226054/

相关文章:

c++ - 为每个循环将迭代器分配给 std::vector 的当前元素

c++ - 将 C 或 C++ 文件作为脚本运行

c++ - 这两种添加字符串的情况有什么区别?

c++ - 我是否正确使用 move 语义?会有什么好处?

C++位域成员变量初始化值(UE4示例)

c++ - 使用宏扩展作为标识符的一部分

c++ - 弹出倒数第二个

c++ - 将 "auto"关键字用于带有 GCC 的 std::list 迭代器

asp.net-mvc - 使用 ASP.NET MVC 和 MVVM 的页面初始化模式(如 knockoutjs)

C++ 用户定义的空默认构造函数与隐式或默认默认构造函数