const,volatile,mutable

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

强大的RGG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值