mutable、const、volatile关键字
C++中有三种修饰数据可变的关键字:mutable、const、volatile。
const
const我们很常见,在定义一些不可变的常量或不修改数据内容的函数时经常会用到。
- 修饰变量,说明该变量不可以被改变;
- 修饰指针,分为指向常量的指针(例如const char*,其自身可变,指向的是常量字符数组)和自身是常量的指针(例如char* const,其自身不可变);
- 修饰引用,指向常量的引用(例如const A &q,指向对象类型为A的常对象的引用q),用于形参类型,即避免了拷贝,又避免了函数对值的修改;
- 修饰成员函数,说明该成员函数内不能修改成员变量。
mutable
mutable正如其字面意思—“可变的”,与const相反,该关键字可以让一个被该关键字修饰的数据,在const函数中被修改。
例如:
class A{ public: A(int t):a(t){} mutable int a; void func()const; } void A::func()const{ a=2; } int main(){ const A a(1); a.func(); return 0; }
调用a的const成员函数,其会将a.a从1修改为2。
volatile
volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素(操作系统、硬件、其它线程等)更改。所以使用 volatile 告诉编译器不应对这样的对象进行优化。
volatile int i=10; int a = i; 。。。//其他代码,并未明确告诉编译器,对i进行过操作 int b = i;
假如a和b的定义之间,i的实际值发生过变化,但对编译器来说,对 i 的两次读操作之前 i 并没有被操作过,那么其将会自动优化b的值为上次读取的 i 的值。
但是此处 i 有volatile关键字修饰,它告诉编译器无论什么时候调用它,都应从其所在内存中读取它,因此此项优化被取消,b的值不会出现错误。
参考文章:https://blog.csdn.net/whl0071/article/details/125395653
https://blog.csdn.net/qq_43509546/article/details/110386037