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

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 19 特殊工具与技术)两种不可移植的特性之“volatile”相关的知识,希望对你有一定的参考价值。

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 是一个指向 volatilevolatile 指针

和 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”的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针