C++中的位域(bit-filed):一种节省空间的成员

有一种被称为位域(bit-field) 的特殊的类数据成员,它可以被声明用来存放特定数目的位。位域必须是有序数据类型。它可以有符号也可以无符号。例如:

class  File  {
// 
unsigned int modified : 1// 位域 (bit-field)
}
;

   
   位域标识符后面跟有一个冒号,然后是一个常量表达式指定位数。例如modified 是一个只有一位构成的位域。
   在类体中相邻定义的位域,如果可能的话,它们会被放在同一个整数的连续位中,并以此提供空间压缩。例如,在下列声明中5 个位域被存储在单个unsigned int 中,它首先与位域mode 相关联。

typedef unsigned  int  Bit;
class  File  {
public:
Bit mode: 
2;
Bit modified: 
1;
Bit prot_owner: 
3;
Bit prot_group: 
3;
Bit prot_world: 
3;
// 
}
;

   
   位域在内存中的位置是从低位向高位放置的,比如mode在Bit的最低两位(二进制数0b0000000000000011中两个1的位置)。
   对于位域的访问方式与其他类数据成员相同。例如,类的私有位域只能在类的成员函数和友元中被访问:

void  File::write()
{
modified 
= 1;
// 
}

void  File::close()
{
if ( modified )
//  内容从略
}

   
   下面的例子说明了怎样使用大于1 位的位域

enum   { READ = 01, WRITE = 02 } //  文件模式
int  main()  {
File myFile;
myFile.mode 
|= READ;
if ( myFile.mode & READ )
cout 
<< "myFile.mode is set to READ/n";
}

   
   通常情况下我们会定义一组inline 成员函数,来测试每个位域成员的值。例如,类File可以定义成员isRead()和isWrite()

inline  int  File::isRead()  return mode & READ; }
inline 
int  File::isWrite()  return mode & WRITE; }
if  ( myFile.isRead() )  /*  */


   有了这些成员函数,现在位域可以被声明为类File 的私有成员。
   由于取地址操作符& 不能被应用在位域上,所以也没有能指向类的位域的指针。位域也不能是类的静态成员。
   C++标准库提供了一个bitset 类模板,它可以辅助操纵位的集合。在可能的情况下应尽可能使用它来取代位域。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值