详细解读C++编程中的匿名类类型和位域

 更新时间:2016年01月25日 14:15:23   投稿:goldensun  
这篇文章主要介绍了C++编程中的匿名类类型和位域,是C++入门学习中的基础知识,需要的朋友可以参考下

匿名类类型
类可以是匿名的 - 也就是说,可以在没有 identifier 的情况下声明类。在将类名称替换为 typedef 名称时,这会很有用,如下所示:

typedef struct
{
  unsigned x;
  unsigned y;
} POINT;

注意
上面示例中显示的匿名类的用法对于保留与现有 C 代码的兼容性很有用。在某些 C 代码中,将 typedef 与匿名结构结合使用是很普遍的。
如果您希望对类成员的引用就像它未包含在独立类中的情况一样出现,则匿名类也很有用,如下所示:

struct PTValue
{
  POINT ptLoc;
  union
  {
    int iValue;
    long lValue;
  };
};

PTValue ptv;

在上面的代码中,可以使用对象成员选定内容运算符 (iValue.) 访问 ,如下所示:

int i = ptv.iValue;

匿名类受某些限制的约束。(有关匿名联合的详细信息,请参阅联合。) 匿名类:
不能具有构造函数或析构函数。
不能作为函数的参数传递(除非使用省略号使类型检查无效)。
无法作为函数中的返回值返回。

C++ 位域
类和结构可包含比整型类型占用更少存储空间的成员。这些成员被指定为位域。位域成员声明符规范的语法如下:
语法

declarator : constant-expression

备注
(可选)declarator 是在程序中访问成员的名称。它必须是整型类型(包括枚举类型)。 常数表达式指定结构中成员所占据的位数。匿名位域 — 即不带标识符的位域成员,可用于填充。
注意
宽度为 0 的未命名位域强制将下一个位域与下一个 type 边界对齐,其中 type 是成员的类型。
下面的示例声明包含位域的结构:

// bit_fields1.cpp
// compile with: /LD
struct Date {
  unsigned short nWeekDay : 3;  // 0..7  (3 bits)
  unsigned short nMonthDay : 6;  // 0..31 (6 bits)
  unsigned short nMonth  : 5;  // 0..12 (5 bits)
  unsigned short nYear   : 8;  // 0..100 (8 bits)
};

Date 类型的对象的概念上的内存布局如下图所示。

2016125141100380.jpeg (448×116)

数据对象的内容布局
请注意,nYear 的长度为 8 位,并且会溢出声明类型 unsigned short 的字边界。因此,它始于新 unsigned short 的开头。并不必使所有位域均适合基础类型的对象;根据声明中请求的位数来分配新的存储单元。
如果结构的声明包含长度为 0 的未命名字段(如以下示例所示),

// bit_fields2.cpp
// compile with: /LD
struct Date {
  unsigned nWeekDay : 3;  // 0..7  (3 bits)
  unsigned nMonthDay : 6;  // 0..31 (6 bits)
  unsigned      : 0;  // Force alignment to next boundary.
  unsigned nMonth  : 5;  // 0..12 (5 bits)
  unsigned nYear   : 8;  // 0..100 (8 bits)
};

则内存布局如下图中所示。

2016125141203296.jpeg (525×80)

带有零长度位域的数据对象的布局
位域的基础类型必须是整型类型。

相关文章

  • C语言实现学生管理系统的源码分享

    C语言实现学生管理系统的源码分享

    这篇文章主要为大家详细介绍了如何利用C语言实现学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • win10中的dlib库安装过程

    win10中的dlib库安装过程

    这篇文章主要介绍了win10中dlib库的安装过程,本文通过实例图文介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • C++中strtok()函数的用法介绍

    C++中strtok()函数的用法介绍

    以下是对C++中strtok()函数的使用方法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-09-09
  • C++实现矩阵对称正交化的示例代码

    C++实现矩阵对称正交化的示例代码

    这篇文章主要介绍了C++实现矩阵对称正交化,分为python代码和C++的eigen库实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • c++ typeid关键字的使用

    c++ typeid关键字的使用

    这篇文章主要介绍了c++ typeid关键字的使用,帮助大家更好的理解和使用c++,感兴趣的朋友可以了解下
    2020-11-11
  • C++实现扫雷游戏

    C++实现扫雷游戏

    这篇文章主要为大家详细介绍了C++实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C++之拼接长字符串问题

    C++之拼接长字符串问题

    这篇文章主要介绍了C++之拼接长字符串问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C语言宏定义#define的使用

    C语言宏定义#define的使用

    本文主要介绍了C语言宏定义#define的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C语言深入分析递归函数的实现

    C语言深入分析递归函数的实现

    递归(recursive)函数是“自己调用自己”的函数,无论是采用直接或间接调用方式。间接递归意味着函数调用另一个函数(然后可能又调用第三个函数等),最后又调用第一个函数。因为函数不可以一直不停地调用自己,所以递归函数一定具备结束条件
    2022-04-04
  • C++如何将一个vector内容赋值给另一个vector,及swap与assign区别

    C++如何将一个vector内容赋值给另一个vector,及swap与assign区别

    在本文中,我们将主要介绍5种将一个vector内容赋值给另一个vector的方式,顺便讨论下swap与assign的区别,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08

最新评论