首页 > 其他分享 >mutable、const、volatile关键字

mutable、const、volatile关键字

时间:2023-04-01 20:58:24浏览次数:52  
标签:const int 关键字 volatile 修饰 mutable

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

 

标签:const,int,关键字,volatile,修饰,mutable
From: https://www.cnblogs.com/Explosion556/p/17279327.html

相关文章

  • Why is redux state immutable???
    众所周知,redux的三项原则之一有stateisread-only,即immutable.为了保证immutable,所以每次reducer都要return一个newobject,作为新的state.但为什么state一定要......
  • 用const修饰指针
    1)常量指针语法:const数据类型*变量名;不能通过解引用的方法修改内存地址中的值(用原始的变量名是可以修改的)。注意:l 指向的变量(对象)可以改变(之前是指向变量a的,后来可......
  • const在c语言和c++中的区别
    1.c语言中的const变量 c语言中const变量是只读变量,有自己的存储空间2.c++中的const常量可能分配存储空也可能不分配存储空间当const常量为全局,并且需要......
  • const对象分析
    const定义一个常量,常量定义以后就不能被修改。1classA{2public:3inta;4int*b;5int&c;6A():a(1),b(newint(1)),c(*newint(1)){......
  • what's the difference between const and constexpr in C++?
    BothconstandconstexprareusedtodefineconstantsinC++,buttheyhavedifferentmeaningsandusecases.constisusedtodeclareavariableasconstant,......
  • css属性——env()和constant()设置安全区域,解决移动端小程序和H5底部栏 iPhoneX安全
    转载:https://www.cnblogs.com/jiaoshou/p/16647577.html使用苹果官方推出适配方案css函数env()、constant()来适配苹果官方推荐使用env(),constant()来适配,建议使用该方......
  • javascript中的var,let,const区别
    const:这个最简单,只需记住是声明的常量,定义的时候必须声明const的具体值,且之后不允许改变const的值 var和let区别1、由于js引擎存在预解析,会把var变量名进行提升对于......
  • Java关键字-volatile详解
    点击  ​​Mr.绵羊的知识星球​​ 解锁更多优质文章。一、介绍1.简介  volatile是java关键字,同时也是JVM提供的轻量级的同步机制2.特性  你需要先了解一下Jav......
  • var、let、const
    var和let是变量(var有数据穿透;比如使用var写个for循环,在for循环外面打印var,会打印出来;而let会直接报错)for(leti=0;i<5;i++){console.log(i)}//使用var打印0-5;使用l......
  • C++面向对象、初始化列表、static const
    面向对象OOP​ OOP的四大特征:抽象、封装、继承、多态​ 对象内存大小只和成员变量有关,不同对象的变量都有自己的空间,成员方法是所有对象共享的,一旦编译会添加this指针,......