当前位置: 首页 > 编程笔记 >

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

郜卓君
2023-03-14
本文向大家介绍详细解读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 类型的对象的概念上的内存布局如下图所示。

数据对象的内容布局
请注意,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)
};

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

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

 类似资料:
  • 本文向大家介绍详解C# 匿名对象(匿名类型)、var、动态类型 dynamic,包括了详解C# 匿名对象(匿名类型)、var、动态类型 dynamic的使用技巧和注意事项,需要的朋友参考一下 随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑。C# 语言从诞生起就是强类型语言,这一性质到今天不曾改变,我想以后也不会变。既然是强类型语言,那编写任一程序均要求满足下面的基本

  • 本文向大家介绍深入讲解C#编程中嵌套类型和匿名类型的定义与使用,包括了深入讲解C#编程中嵌套类型和匿名类型的定义与使用的使用技巧和注意事项,需要的朋友参考一下 嵌套类型 在类或结构内部定义的类型称为嵌套类型。例如: 不管外部类型是类还是结构,嵌套类型均默认为 private,但是可以设置为 public、protected internal、protected、internal 或 private

  • 问题内容: 我正在编写C#Wicket实现,以加深对C#和Wicket的理解。我们遇到的问题之一是Wicket大量使用匿名内部类,而C#没有匿名内部类。 因此,例如,在Wicket中,您可以这样定义一个链接: 由于Link是一个抽象类,因此它强制实现者实现onClick方法。 但是,在C#中,由于没有匿名内部类,因此无法做到这一点。另外,您可以使用如下事件: 当然,这样做有两个缺点。首先,可以有多

  • 本文向大家介绍详细解读Java的串口编程,包括了详细解读Java的串口编程的使用技巧和注意事项,需要的朋友参考一下 常见问题 JavaComm 和 RxTX 安装时有一些与众不同的地方。强烈建议按照安装说明一点点的安装。如果安装说明要求一个jar文件或一个共享库必须在某一特定的文件夹下,那这就意味着需要严肃对待。如果说明要求一个特定的文件或设备需要拥有一个特定的所有权或访问权,这也意味着需要严肃处

  • 闭包从封闭的作用中域捕获变量简单明了。这样会有某些后果吗?当然会。观察一下使用闭包作为函数参量的方式是要求为泛型的,它们定义的方式决定了这是必要的(原文:Observe how using a closure as a function parameter requires generics, which is necessary because of how they are defined):

  • 这个答案使用了流,但这个问题不是关于流的,因为这个匿名类型构造可以在其他上下文中使用,即: 令我惊讶的是,这编译并打印了预期的输出。 注意:我很清楚,自古以来,就有可能构造一个匿名的内部类,并按如下方式使用它的成员: 并且我需要在某个存储库中存储实例的JSON表示,为此,我需要每个实例以及每个ID的JSON字符串: 在本例中,我丢失了字段,因为我已经将每个人转换为其对应的json字符串。 为了避免