1. volatile 限定符

当对象的值可能在程序的控制或检测之外被改变时, 应该将该对象声明为 volatile

volatile int display_register;  //display_register是一个int型的volatile对象
volatile Task *curr_task;     //curr_task是一个指向volatile的Task类对象的指针
volatile int ixa[ max_size ];  //ixa是一个volatile的整型数组,数组的每个元素都被认为是volatile 的//bitmap_buf是一个volatile的Screen类对象,它的每个数据成员都被视为volatile的
volatile Screen bitmap_buf;
  • const 和 volatile 限定符互相没什么影响, 某种类型可能既是volatile 的, 此时它同时具有二者的属性

1.1 volatile 限定符和指针之间的关系

volatile int v;  / / v 是一个 volatile int
int *volatile vip; / / vip 是一个 volatile 指针, 它指向 int
volatile int *ivp; / / ivp 是一个指针, 它指向一个 volatile int
// vivp 是一个 volatile 指针, 它指向一个 volatile int
volatile int *volatile vivp;int *ip = &v; // 错误: 必须使用指向 volatile 的指针
ivp = &v; // 正确: ivp 是一个指向 volatile 的指针
vivp = &v;/ / 正确: vivp 是一个指向 volatile 的 volatile 指针

和 const 一样, 我们只能将一个 volatile 对象的地址( 或者拷贝一个指向volatile 类型的指针) 赋给一个指向 volatile 的指针。 同时, 只有当某个引用是volatile 的时, 我们才能使用一个 volatile 对象初始化该引用。

1.2 合成的拷贝对 volatile 对象无效

不能使用合成的拷贝/移动构造函数及赋值运算符初始化 volatile 对象或从 volatile 对象赋值。 合成的成员接受的形参类型是( 非 volatile ) 常量引用, 显然我们不能把一个非 volatile 引用绑定到一个 volatile 对象上,如果一个类希望拷贝、 移动或赋值它的 volatile 对象, 则该类必须自定义拷贝或移动操作

class Foo {public:Foo (const volatile Foo& ) ; //从一个 volatile 对象进行拷贝//将一个 volatile 对象賦值给一个非 volatile 对象Foo& operator= (volatile const Foo& );//将一个 volatile 对象賦值给一个 volatile 对象Foo& operator= (volatile const Foo& ) volatile;//Foo 类的剩余部分
}

C++ Primer 5th笔记(chap 19 特殊工具与技术)两种不可移植的特性之“volatile”相关推荐

  1. C++ Primer 5th笔记(chap 19 特殊工具与技术)异常类层次

    1. 类 exception . bad_cast 和 bad_alloc 定 义 了 默 认 构 造 函 数 runtime_error 和 logic_error没有默认构造函数, 但是有一个可以 ...

  2. C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid运算符

    1. typeid运算符(typeid operator) 它允许程序向表达式提问:你的对象是什么类型? typeid表达式的形式是typeid(e),其中e可以是任意表达式或类型的名字,它操作的结果 ...

  3. C++ Primer 5th笔记(chap 19 特殊工具与技术)运行时类型识別RTTI

    1. 运行时类型识别(run-time type identification ) 当我们将这两个运算符用于某种类型的指针或引用, 并且该类型含有虚函数时, 运算符将 使用指针或引用所绑定对象的动态类 ...

  4. C++ Primer 5th笔记(chap 19 特殊工具与技术)type_info 类

    1. type_info 的操作 操作 描述 t1 == t2 如果type_info对象t1和t2表示同一种类型,则返回true t1 != t2 如果type_info对象t1和t2表示不同的类型 ...

  5. C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid

    1. 通常情况下使用 typeid 比较两条表达式的类型是否相同或者比较一条表达式的类型是否与指定的类型相同 Derived *dp = new Derived; Base *bp = dp; // ...

  6. C++ Primer 5th笔记(chap 19 特殊工具与技术)使用 RTTI

    1. RTTI用处 当想为具有继承关系的类实现相等运算符时.对于两个对象来说,如果他们的类型相同并且对应的数据成员取值相同,则我们说这两个类是相等的. class Base {friend bool ...

  7. C++ Primer 5th笔记(chap 19 特殊工具与技术)定位 new 表达式

    1. 定位 new (placement new) 1.1 起因 内存分配和初始化分离开 Placement new allows you to construct an object in memo ...

  8. C++ Primer 5th笔记(chap 19 特殊工具与技术)malloc 函数与 free 函数

    void *operator new (size_t size) {if (void *mem = malloc (size) )return mem;elsethrow bad_alloc ( ); ...

  9. C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配

    1. new void operator new (size_t, void ) ;//不允许重新定义这个版本 string *sp = new string("a value") ...

最新文章

  1. 微软推出免费在线系统诊断工具--不用手动下载
  2. Java环境搭建若干问题
  3. PHP--金额数字转换成英文
  4. delete index mysql_为什么MySQL不建议delete删除数据「心得分享」
  5. 创业失败感悟第二十九天
  6. 为什么有人执着于只买黑色的手机?
  7. SparkStreaming简介
  8. mysql中的cube和rollup_【hive】cube和rollup函数
  9. pdf照片显示正常打印时被翻转_要哭了,差点打印不了准考证!(2021考生提前收藏!)...
  10. 理解两个函数乘积的导数的一种视角
  11. Java SE 集合:Map接口
  12. Java音乐播放:获取音频信息
  13. 什么是阿里云服务器ECS?
  14. 聚焦网络攻击|知道创宇云安全2018年度网络安全态势报告
  15. Pokeman.csv 处理(Python)
  16. 服务器屏幕不全屏显示,服务器窗口显示不全屏
  17. Python3,异常进阶写法之retrying。
  18. 网易考拉Android客户端网络模块设计
  19. 高中数学_1_二次不等式和绝对值不等式
  20. SUST Weekly Final Round One 参考题解

热门文章

  1. C++:const分配内存情况分析
  2. Java集合:HashMap
  3. python2.7解释器安装教程_Python解释器安装教程以及环境变量配置
  4. 一套mysql_mysql 命令一套
  5. matlab调用kmeans_K_Means算法的MATLAB实现
  6. android推送接口,推送API
  7. 你知道铅酸蓄电池的常见失效模式吗?
  8. 谷歌云服务宕机,苹果iCloud也不行了
  9. 今年美国数据中心投资规模超182亿美元 超前三年总和
  10. centos 开发php扩展,【PHP扩展】centos给PHP安装扩展