• 44、volatile、mutable和explicit关键字的用法


    (1)volatile

    volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比 如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再 进行优化,从而可以提供对特殊地址的稳定访问。

    当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指 令刚刚从该处读取过数据。

    volatile定义变量的值是易变的,每次用到这个变量的值的时候都要去重新读取这个变量的值,而不是 读寄存器内的备份。多线程中被几个任务共享的变量需要定义为volatile类型。

    volatile 指针

    volatile 指针和 const 修饰词类似,const 有常量指针和指针常量的说法,volatile 也有相应的概念 修饰由指针指向的对象、数据是 const 或 volatile 的:

    指针自身的值——一个代表地址的整数变量,是 const 或 volatile 的:

     注意:

    1. 可以把一个非volatile int赋给volatile int,但是不能把非volatile对象赋给一个volatile对象。

    2. 除了基本类型外,对用户定义类型也可以用volatile类型进行修饰。

    3. C++中一个有volatile标识符的类只能访问它接口的子集,一个由类的实现者控制的子集。用户只 能用const_cast来获得对类型接口的完全访问。此外,volatile向const一样会从类传递到它的成员。

    多线程下的volatile

    有些变量是用volatile关键字声明的。当两个线程都要用到某一个变量且该变量的值会被改变时,应该 用volatile声明,该关键字的作用是防止优化编译器把变量从内存装入CPU寄存器中。如果变量被装入 寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误 执行。volatile的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄 存器中的值。

    (2)mutable

    mutable的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。在C++中, mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在 一个const函数中。我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明 成const的。但是,有些时候,我们需要在const函数里面修改一些跟类状态无关的数据成员,那么这个 函数就应该被mutable来修饰,并且放在函数后后面关键字位置。

    (3)explicit

    explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换,注意以下几点:

    1.explicit 关键字只能用于类内部的构造函数声明上

    2.explicit 关键字作用于单个参数的构造函数

    3.被explicit修饰的构造函数的类,不能发生相应的隐式类型转换

    补充(隐式转换):可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。

  • 相关阅读:
    3-变量的解构赋值
    2-新的变量声明方式(var ,let,const)
    JS实现验证输入框密码强度
    JavaScript获取文本框内选中的文本
    js获取 URL 中的参数
    数据结构算法-JavaScript常用排序法(常用排序方法的总结)
    echart多条折线图ajax请求json数据
    axios代理proxy解决接口请求跨域问题
    物理综合:Setup&Hold
    RTL基本知识:快速填充矢量
  • 原文地址:https://www.cnblogs.com/crbhf/p/15086889.html
Copyright © 2020-2023  润新知