您的位置:首页 > 编程语言 > C语言/C++

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

2017-02-22 10:14 363 查看
有一种被称为位域(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 类模板,它可以辅助操纵位的集合。在可能的情况下应尽可能使用它来取代位域。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: