C++/C中mutalbe与volatile的详解

1、 mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。
在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量(mutable只能由于修饰类的非静态数据成员),
将永远处于可变的状态,即使在一个const函数中。mutable 只能用于类的非静态和非常量数据成员。


我们知道,假如类的成员函数不会改变对象的状态,那么这个成员函数一般会声明为const。
但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。


class Student
{
public:
Student(){}
~Student(){}
Student( int _age):age(_age){}


public:
int getAge() const
{
age++; // 在const函数里试图修改,编译报错
return age;
}
private:
string name;
int  age;
};
上面代码在编译时报:“error C2166: 左值指定 const 对象”错误。
在上面的例子中,const类型的getAge()函数中改变了类的非静态数据成员age。
因此,这个时候需要使用mutable来修饰一下要在const成员函数中改变的非静态数据成员,
将上述代码改为:
class Student
{
public:
Student(){}
~Student(){}
Student( int _age):age(_age){}


public:
int getAge() const
{
age++;    //mutable修饰的变量能在const函数中修改
return age;
}
private:
string name;
mutable int  age;
};
这样编译能通过了。
个人总结下:
       (1)mutable关键字只能作用于类的非静态和非常量数据成员。
       (2)mutable关键字提示编译器该变量可以被雷的const函数修改。

       (3)在一个类中,用mutable修饰的变量只能是少数,或者根本不使用mutable。

在本人做的项目中很少用到mutable关键字的,一般是采用get()/set()方法进行修改成员对象的值。

2、volatile

       一个定义为volatile的变量可能会被意想不到地改变而影响编译器编译的结果,这样,编译器就不会去假设这个变量的值了。
精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值。
也就是说当编译器访问该volatile变量时每次都从内存中读取该变量的值。


下面是volatile变量的几个例子:
    1). 并行设备的硬件寄存器(如:状态寄存器)
    2). 一个中断服务子程序中会访问到的非自动变量(全局变量、静态变量)
    3). 多线程应用中被多任务共享的变量

int square(volatile int *ptr)
{
 int a,b;

 a = *ptr;

 b = *ptr;

 return a * b;
}

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

long square(volatile int *ptr)
{
    int a;

    a = *ptr;

    return a * a;
}

今天的介绍就先到这里,后续研究之后再更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

没有mmu可以跑Linux吗?

为什么需要mmu?我们知道应用程序是不能随意访问内存的,如果让应用程序直接访问物理内存,那么计算机是很危险的,计算机内存的所有内容将被完全暴露出来。所以出现了mmu,mmu是内存管理单元,应用程序访问的是虚拟内存&am…

pC机OracLe库磁盘坏如何恢复,电脑硬盘坏了数据能恢复吗(6步教你自己在家轻松恢复数据)...

电脑硬盘毁坏如何恢复数据有过硬盘损坏经历的用户都知道,硬盘损坏其最严重的结果就是导致其中存储的文件难以读取,包括无法复制,无法移动。通常来说,具体的表现形式是复制文件或者传输文件的时候,耗费很长的时间都无法…

又重新让aspspider.net支持中文PDF输出了

经过一番努力,再次看到中文PDF的输出;aspspider.net经过这次更新后,不知道什么原因,使用BaseFont.AddToResourceSearch(MapPath(".\itextsharpasian\") "iTextAsian-1.0.dll");的方法就是不能把iTextAsian-1.…

My new iMac 27

iMac 27 12GB Memory. 用来贴补家用,有需要开发项目的可以与我联系 asp.net、组件开发 ,java,javascript,xml/xslt,objective-c 什么都行. 目前上架产品包括:少儿有声阅读系列《单刀会》《白蛇传》《空城记》,新闻阅读有 “辽宁日报” “辽宁…

url编码函数encodeURI和encodeURIComponent

var url "http://www.wrox.com/illegal value.html#start";encodeURIComponent(url) //"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.html%23start" encodeURI(url) //"http://www.wrox.com/illegal%20value.html#start" 记住2种特殊字符&…

C语言面试题大汇总之华为面试题

该面试题大全可以很好地提高C/C程序员的技术综合实力 1、局部变量能否和全局变量重名?  答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时&#xff0…

从没想过会有一个这样的机会|大疆招聘

我是昨晚才知道,年前有一个读者一直在找工作最近准备入职大疆,之前我也有给他推荐了机会,不过都没有合适的。昨晚突然给我发消息说拿到了大疆的岗位,待遇和职位都是自己喜欢的。我的微信好友有好几个大疆的同学,刚好昨…

oracle不同session共享变量,SpringMVC使用oracle配置session共享

简述由于开发是单机项目,但是到了配置负载均衡的集群中就发生了问题,使用账号登录后又跳回主页面。我分析了原因是负载均衡配置的跳转是每次访问都会切换服务,所以在A机器登录后,再次访问B机器找不到有登录状态的session&#xff…

Google Earth 和MS Virtual Earth:虚拟地球简介

自从Goal在98年提出数字地球(Digital Earth)之后,全球掀起了数字地球热,而随着Goal的竞选总统的失利和当时科学技术和硬件水平的限制,数字地球一直处于慢慢发展状态。其中它涉及到很多学科包括地理对象的描述、存储、建…

转些别人收集的歌

2019独角兽企业重金招聘Python工程师标准>>> 【Anaesthesia】Maximilian Hecker强烈推荐 【Summer Days In Bloom】Maximilian Hecker力推! 【end of May】Keren Ann 【gotta have you】The Weepies调调很特别,我用它做过背景音乐。 …

Linux社区关于链表的bug讨论我们要看一下

最近在Linux社区看到一个关于内核链表的讨论原文讨论链接:https://lwn.net/SubscriberLink/885941/01fdc39df2ecc25f/先用例子说明怎么使用内核链表list.h/* SPDX-License-Identifier: GPL-2.0 */ #ifndef LIST_H #define LIST_H/** Copied from include/linux/...*…

多图上传乱序php,discuz图片顺序混乱解决方案_php技巧

说明discuz在发表帖子的时候,添加多张图片,然后直接发表帖子,图片顺序有时候会乱掉即使上传图片窗口中图片顺序正确,发布之后还是会乱掉分析看url,程序代码中看不出什么将图片名改为序号上传,顺序乱了&…

在.NET中excel导出方法汇总(收集)

http://search.csdn.net/Expert/topic/2346/2346423.xml?temp.3901941http://search.csdn.net/Expert/topic/2387/2387301.xml?temp3.222293E-02http://search.csdn.net/Expert/topic/2581/2581246.xml?temp.9223444http://search.csdn.net/Expert/topic/2414/2414749.xml?…

进程之间的同步机制

多进程的系统中避免不了进程间的相互关系。本讲将介绍进程间的两种主要关系——同步与互斥,然后着重讲解解决进程同步的几种机制。 进程互斥是进程之间发生的一种间接性作用,一般是程序不希望的。通常的情况是两个或两个以上的进程需要同时访问某…

(二)AS给button添加点击事件

三种方法给Button添加点击事件 &#xff08;一&#xff09;通过button的id&#xff0c;添加继承View.OnClickListener的监听实现 <Buttonandroid:id"id/btn_button2"android:text"按钮2"android:layout_width"match_parent"android:layout_he…

MongoDB(4)--MongoDB服务的启动

原始方式 只有启动了MongoDB的服务&#xff0c;才能使用MongoDB的功能&#xff0c;通常情况下会开一个命令窗口&#xff0c;输入下面的命令来启动服务&#xff1a; 配置文件方式 如果不想每次启动的时候都在命令行中输入很多繁琐的参数&#xff0c;可以把参数信息保存在配置文件…

我张哥做的这ARM开发板,真酸爽!

本文导读&#xff1a;市场普及度最高的A7处理器&#xff0c;核心板所有设计资料、生产资料全部开放&#xff01;包含核心板原理图、PCB、BOM、uboot源码、Linux内核所有驱动源码、文件系统等&#xff0c;并提供测试与验证方案&#xff01;武汉万象奥科&#xff08;www.vanxoak.…

oracle rac维护命令,2015年oracle rac日常基本维护命令.doc

Oracle RAC 资料收集http://www.D数据库吧oracle rac日常基本维护命令2Oracle RAC性能调整12详解Oracle RAC入门和提高27ORACLE RAC数据库配置Dataguard环境49老白对于RAC应用调优的建议51oracle rac日常基本维护命令所有实例和服务的状态$ srvctl status database -d orclInst…

linux嵌入式开发流程,听听牛人怎么说

很多学习嵌入式的人来说&#xff0c;都会学习嵌入式linux开发&#xff0c;在学习的过程中&#xff0c;总会有很多难题&#xff0c;相对而言&#xff0c;嵌入式linux也算是嵌入式学习中比较难的&#xff0c;那如何可以攻破这个难点&#xff0c;那么我们就需要从根本入手&#xf…

搭建LNMP遇到的问题

配置PHP的执行./buildconf --force出现一下错误 buildconf: Your version of autoconf likely contains buggy cache code. Running vcsclean for you. To avoid this, install autoconf-2.13. 解决方案&#xff1a;安装autoconf-2.13.RPM包 执行export …