第18章 特殊工具与技术(13)
18.7.1 位域
可以声明一种特殊的类数据成员,称为位域(bit-field),来保存特定的位数。当程序需要将二进制数据传递给另一程序或硬件设备的时候,通常使用位域。
位域在内存中的布局是机器相关的。
位域必须是整体数据类型,可以是signed或unsigned。通过在成员名后面接一个冒号以及指定位数的常量表达式,指出成员是一个位数。
[cpp] typedef unsigned int Bit;
class File{
Bit mode:2;
Bit modified:1;
Bit prot_owner:3;
};
typedef unsigned int Bit;
class File{
Bit mode:2;
Bit modified:1;
Bit prot_owner:3;
};通常最好将位域设为unsigned。存储在signed类型中的位域的行为由实现定义。
使用位域
用与类的其他数据成员相同的方式访问位域。例如,作为类的private成员的位域只能从成员函数的定义和类的友元中访问。
[cpp] File file=File();
file.mode=1;
file.modified=11;
File file=File();
file.mode=1;
file.modified=11;定义了位域成员的类通常也定义一组内联成员函数来测试和设置位域的值。
通常使用内置按位操作符操纵超过一位的位域。
地址操作符(&)不能应用于位域,所以不可能有引用类位域的指针,位域也不能是类的静态成员。
18.7.2 volatile限定符
当可以用编译器的控制或检测之外的方式改变对象值的时候,应该将对象声明为volatile。关键字volatile是给编译器的指示,指出对这样的对象不应该执行优化。
用与const限定符相同的方式使用volatile限定符。volatile限定符是一个对类型的附加修饰符。
[cpp] volatile int i;
volatile TheClass tc100;
volatile int arr[10];
volatile int i;
volatile TheClass tc100;
volatile int arr[10];可以声明volatile指针,指向volatile对象的指针,以及指向volatile对象的volatile指针。
合成的复制控制不适用于volatile对象
对待const和volatile的一个重要区别是,不能使用合成的复制和赋值操作符从volatile对象进行初始化赋值。合成的复制控制成员接受const形参,这些形参是对类类型的const引用,但是不能将volatile对象传递给普通引用或const引用。
如果类希望允许复制volatile对象,或者,类希望允许从volatile操作数或对volatile操作数进行赋值,它必须定义自己的复制构造函数和/或赋值操作符版本。
摘自 xufei96的专栏