1. volatile 限定符
当对象的值可能在程序的控制或检测之外被改变时, 应该将该对象声明为 volatile
volatile int display_register;
volatile Task *curr_task;
volatile int ixa[ max_size ];
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
volatile int *volatile vivp;
int *ip = &v;
ivp = &v;
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& ) ;
Foo& operator= (volatile const Foo& );
Foo& operator= (volatile const Foo& ) volatile;
}
|