mutable、const、volatile关键字

发布时间 2023-04-01 20:47:22作者: _Explosion!

C++中有三种修饰数据可变的关键字:mutable、const、volatile。

const

const我们很常见,在定义一些不可变的常量或不修改数据内容的函数时经常会用到。

 

  1. 修饰变量,说明该变量不可以被改变;
  2. 修饰指针,分为指向常量的指针(例如const char*,其自身可变,指向的是常量字符数组)和自身是常量的指针(例如char* const,其自身不可变);
  3. 修饰引用,指向常量的引用(例如const A &q,指向对象类型为A的常对象的引用q),用于形参类型,即避免了拷贝,又避免了函数对值的修改;
  4. 修饰成员函数,说明该成员函数内不能修改成员变量。

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