可以声明一种特殊的类数据成员,称为位域(bit-field),来保存特定的位数。当程序需要将二进制数据传递给另一程序或硬件设备的时候,
通常使用位域。
注解:位域在内存中的布局是机器相关的。
位域必须是整型数据类型,可以说是signed或unsigned 。通过在成员名后面接一个冒号以及指定位数的常量表达式,指出成员是一个位域:
typedif unsigned int Bit;
class File
{
Bit mode:2;
Bit modefiled:1;
Bit prot_owner:3;
Bit prot_group:3;
Bit prot_world:3;
//..
};
mode位域有两个位,modified 只有一位,其他每个成员有三个位。(如果可能)将类定义体中按相邻次序定义中的位域压缩在同一整数的相邻位,
从而提供存储压缩。例如:在前面的声明中,5个位域将存储在一个首先与位域mode关联的unsigned int 中。位是否压缩到整数以及如何压缩与机器
有关。
通常最好将位域设为unsigned 类型。存储在signed 类型中的位域 的行为由实现定义
使用位域
用与类的其他数据成员相同的方式访问位域。例如:作为类的private成员的位域只能从那个成员函数的定义和类的友元中访问:
void File::write()
{
modified=1;
//...
}
void File::close()
{
if(modified)
//..save contents
}
通常使用内置按位操作符操作超过一位的位域:
enum {READ=01,WRITE =02};//File modes
int main()
{
File myFile;
myFile.mode |=READ;//set the READ bit
if(myFile.mode & READ)
{
cout<<"myFile.mode READ is set \n";
}
}
定义了位域成员的类通常也定义一组内联成员函数来测试和设置位域的值。例如:File类可以定义成员isRead和isWrite:
inline int File::isRead(){return mode & READ;}
inline int File::isWrite(){return mode & WRITE;}
有了这些成员函数,现在就可以将位域声明为File类的私有成员了
地址操作符(&)不能应用于位域,所以不可能有引用类位域的指针,位域也不能是类的静态成员。
通常使用位域。
注解:位域在内存中的布局是机器相关的。
位域必须是整型数据类型,可以说是signed或unsigned 。通过在成员名后面接一个冒号以及指定位数的常量表达式,指出成员是一个位域:
typedif unsigned int Bit;
class File
{
Bit mode:2;
Bit modefiled:1;
Bit prot_owner:3;
Bit prot_group:3;
Bit prot_world:3;
//..
};
mode位域有两个位,modified 只有一位,其他每个成员有三个位。(如果可能)将类定义体中按相邻次序定义中的位域压缩在同一整数的相邻位,
从而提供存储压缩。例如:在前面的声明中,5个位域将存储在一个首先与位域mode关联的unsigned int 中。位是否压缩到整数以及如何压缩与机器
有关。
通常最好将位域设为unsigned 类型。存储在signed 类型中的位域 的行为由实现定义
使用位域
用与类的其他数据成员相同的方式访问位域。例如:作为类的private成员的位域只能从那个成员函数的定义和类的友元中访问:
void File::write()
{
modified=1;
//...
}
void File::close()
{
if(modified)
//..save contents
}
通常使用内置按位操作符操作超过一位的位域:
enum {READ=01,WRITE =02};//File modes
int main()
{
File myFile;
myFile.mode |=READ;//set the READ bit
if(myFile.mode & READ)
{
cout<<"myFile.mode READ is set \n";
}
}
定义了位域成员的类通常也定义一组内联成员函数来测试和设置位域的值。例如:File类可以定义成员isRead和isWrite:
inline int File::isRead(){return mode & READ;}
inline int File::isWrite(){return mode & WRITE;}
有了这些成员函数,现在就可以将位域声明为File类的私有成员了
地址操作符(&)不能应用于位域,所以不可能有引用类位域的指针,位域也不能是类的静态成员。