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 类的剩余部分
}



