有一种被称为位域(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 类模板,它可以辅助操纵位的集合。在可能的情况下应尽可能使用它来取代位域。

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

  1. C++:34---union:联合/共用体,一种节省空间的类

    一.联合(union)概述 联合(union)是一种特殊的类 一个union可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值.当我们给union的某个成员赋值之后,该union的其它成员就变 ...

  2. Oracle中压缩数据节省空间和提高速度

    使用表压缩来节省空间并提高查询性能 很多决策支持系统通常都涉及到存储于几个特大表中的大量数据.随着这些系统的发展,对磁盘空间的需求也在快速增长.在当今的环境下,存储着数百TB(太字节)的数据仓库已经变 ...

  3. C语言中的位域 bit field [转]

    一.位域             有些信息在存储时,并不需要占用一个完整的字节,       而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1       两种状态,       用一位 ...

  4. 位域 内存 字节序_C语言中的位域、字节序、比特序、大小端(转)

    1.比特序 / 位序 / bit numbering / 我们知道一个字节有8位,也就是8个比特位.从第0位到第7位共8位.比特序就是用来描述比特位在字节中的存放顺序的.通过阅读网页的内容,关于比特序 ...

  5. Redis中五大基本数据类型和三种特殊数据类型详解

    目录 介绍 概念 基本命令 redis是单线程的 五大基本数据类型 String 命令 应用场景 List 命令 应用场景 Set 命令 应用场景 Hash 命令 应用场景 Zset 命令 应用场景 ...

  6. Spring中配置DataSource数据源的几种选择

    Spring中配置DataSource数据源的几种选择 在Spring框架中有如下3种获得DataSource对象的方法: 从JNDI获得DataSource. 从第三方的连接池获得DataSourc ...

  7. jquery判断方法是否存在_判断图中是否有环的三种方法

    0.什么是环? 在图论中,环(英语:cycle)是一条只有第一个和最后一个顶点重复的非空路径. 在有向图中,一个结点经过两种路线到达另一个结点,未必形成环. 1.拓扑排序 1.1.无向图 使用拓扑排序 ...

  8. C#中判断空字符串的3种方法性能分析【月儿原创】

    C#中判断空字符串的3种方法性能分析 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.4.28  3种方法分别是:string ...

  9. c语言中的普通字符包括什么,【判断题】C语言中的字符常量通常有两种形式:普通字符和转义字符。...

    [判断题]C语言中的字符常量通常有两种形式:普通字符和转义字符. 更多相关问题 ---Can you speak French?---Yes, but only____.A.a littleB.lit ...

最新文章

  1. 社区智能家居产品研发商西谷数字新三板挂牌上市
  2. abap submit 的使用方法
  3. mysql生产环境加索引_【生产篇】_MySQL环境下如何查看基于表的索引定义
  4. mysql主键unsigned_mysql – 主键应该总是unsigned?
  5. 连接超时_记一次网络请求连接超时的事故
  6. 46张PPT彻底弄懂JVM、GC算法和性能调优!
  7. 数据驱动安全:数据安全分析、可视化和仪表盘》一3.6 本章小结
  8. Windows 7安装 Visual Studio 2010之大战三大回合
  9. har后缀文件怎么提取?
  10. 【Python密度泛函理论】
  11. win10易升_史上最稳定的win10版本,四大更新内容强势来袭,你敢升级吗?
  12. 想了解直播系统开发用什么语言?
  13. PCIe 分类、速度
  14. html表格填充空白单元格,Excel表格数据录入:怎么快速填充所有空白单元格?
  15. CentOS之VI编辑器的常用命令
  16. 高端光刻机为什么那么难制造?
  17. 计算机组成原理实验logisim(三)之偶校验编码与检错
  18. 达梦数据库DM的dmap服务启动失败dmap init failed如何解决
  19. 【第十三届全国大学生数学竞赛非数学类】真就参加就有奖
  20. android webview加载html图片自适应手机屏幕大小点击查看大图

热门文章

  1. linux端口爆破软件,Linux网络安全:端口扫描软件 nmap
  2. Adobe illustrator 抽丝剥茧选中多个点 - 连载 13
  3. 这些基因的名字太有才了,研究一下都可以发10分文章
  4. 常用输入法隐藏的这些神奇功能
  5. centos7 下 sudo yum install 报错镜像找不到
  6. python常用函数使用方法实例
  7. Qt笔记-当前时间转GMT并转换成英文(Qt构造http头中Date数据)
  8. Qt学习笔记-编写简易的音乐播放器
  9. 3dcaptcha php,php实现的Captcha验证码类实例
  10. php是阻塞模式吗,PHP非阻塞模式 - 黑白大熊猫的个人空间 - OSCHINA - 中文开源技术交流社区...