const
在面向过程中
最简单的用法就是定义程序用到的数字,字符串常量,代替宏定义,但如果我们从 C++ 程序的生命周期角度来看的话,就会发现,它和宏定义还是有本质区别的:const 定义的常量在预处理阶段并不存在,而是直到运行阶段才会出现。所以准确来说const修饰的叫只读
const 放在声明的最左边,表示指向常量的指针,指针指向的是一个“只读变量”,不允许修改。
const 在“*”的右边,表示指针不能被修改,而指向的变量可以被修改(很恶心的用法,尽量不用)
在面向对象中
const 放在了函数的后面,表示这个函数是一个“常量”。(如果在前面,就代表返回值是 const int)
const 成员函数”的意思并不是说函数不可修改。它的真正含义是:函数的执行过程是 const 的,不会修改对象的状态(即成员变量),也就是说,成员函数是一个“只读操作”。
volatile
它的含义是“不稳定的”“易变的”,在 C++ 里,表示变量的值可能会以“难以察觉”的方式被修改(比如操作系统信号、外界其他的代码),所以要禁止编译器做任何形式的优化,每次使用的时候都必须“老老实实”地去内存取值。
mutable
mutable 与 volatile 的字面含义有点像,但用法、效果却大相径庭。volatile 可以用来修饰任何变量,而 mutable 却只能修饰类里面的成员变量,表示变量即使是在 const 对象里,也是可以修改的。例如:涉及到 mutex 的对象
总结
《1》volitate: cpu每次读取数据的时候,如果寄存器或者三级缓存中有该值,则直接使用,所以此时如果内存中的值被改变,值不会改变。如果加上volitate每次绕过寄存器和缓存直接从内存读取,此时内存中的值已经改变了。
《2》mutable: 1、在lambal表达式中,如果捕获按值捕获,但是在函数体中想要修改,可以使用mutable
2、多线程环境下如果某个成员函数,比如int get_count() const { },返回类中某个成员数量,势必会进行加锁保护变量达到线程安全,此时声明mutex必须是mutable的。
int get_count() const {
std::lock_guardstd::mutex lock(m)
return count;
}
在声明mutable std::mutex m; 需要加 mutable