详细解读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)
};

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

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

(0)

相关推荐

  • 使用 Lambda 取代 Android 中的匿名类

    Lambda是第十一个希腊字母,大写Λ,小写λ,额,跑题了-Lambda表达式 是Java8的新特性之一: Lambda表达式 函数式接口 流API 默认方法 新的Date Time API Lambda表达式 取代了匿名类 ,取消了模板,允许用函数式风格编写代码. 由于最近接触了RxJava,遇到了Lambda,立马就喜欢上了~所以就学习了一下. 本文主要介绍一下Lambda在Android中替代匿名类的部分使用场景. 在Android中使用Lambda gradle-retrolambda

  • 全面了解Java中的内部类和匿名类

    Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的设计者在内部类身上的确是用心良苦.学会使用内部类,是掌握Java高级编程的一部分,它可以让你更优雅地设计你的程序结构.下面从以下几个方面来介绍: 第一次见面 public interface Contents { int value(); } public interface

  • Java中匿名类的两种实现方式

    使用匿名内部类课使代码更加简洁.紧凑,模块化程度更高.内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到.然而这个不是我说的重点,我说的很简单,就是匿名内部类的两种实现方式:第一种,继承一个类,重写其方法:第二种,实现一个接口(可以是多个),实现其方法.下面通过代码来说明: public class TestAnonymousInterClass{ public static void main(String args[]){ TestAnonymousInterCl

  • java 中使用匿名类直接new接口详解及实例代码

    java:使用匿名类直接new接口 java中的匿名类有一个倍儿神奇的用法,见下面代码示例: package contract; public interface ISay { void sayHello(); } 上面是一个简单的接口,下面是如何使用: package jimmy; import contract.ISay; public class Program { public static void main(String[] args) { ISay say = new ISay()

  • 深入讲解C#编程中嵌套类型和匿名类型的定义与使用

    嵌套类型 在类或结构内部定义的类型称为嵌套类型.例如: class Container { class Nested { Nested() { } } } 不管外部类型是类还是结构,嵌套类型均默认为 private,但是可以设置为 public.protected internal.protected.internal 或 private.在上面的示例中,Nested 对外部类型是不可访问的,但可以设置为 public,如下所示: class Container { public class N

  • java 内部类(匿名类,匿名对象,静态内部类)详解及实例

    内部类的介绍 定义在另外一个类中的类,叫内部类 成员内部类 1..new 创建成员内部类必须先创建外部类的实例,然后通过.new 创建内部类的对象 2..this 可以通过外部类的类名.this去访问外部类的所有属性和方法. public class Test1 { String name = "asnd"; public static void main(String[] args) { Test1 test1 = new Test1(); Inner mInner = test1.

  • Java通过匿名类来实现回调函数实例总结

    在C语言中,函数名可以当做函数指针传递给形参从而实现回调 void f1() { printf("f1()\n"); } void f2() { printf("f2()\n"); } void f3() { printf("f3()\n"); } void do_func(void(*f)()) { f(); } int main() { do_func(f1); do_func(f2); do_func(f3); } 在C++11中,实现回调

  • ASP.NET中实现根据匿名类、datatable、sql生成实体类

    在开发中可能会遇到这几种情况: 1.EF或LINQ查询出来的匿名对象在其它地方调用不方便,又懒的手动建实体类 2.通过datatable反射实体需要先建一个类 ,头痛 3.通过SQL语句返回的实体也需要先建一个类 ,头痛 4.如果通过代码生成器要写模版,需要安装或者不想生成一堆不用的类    为了解决上面的不便之处,我封装了一个实体生成类,可以扔到程序里面任意调用 封装类: using System; using System.Collections.Generic; using System.

  • Kotlin基础教程之伴生对象,getter,setter,内部,局部,匿名类,可变参数

    先来看一个名为Message的类 在这个类中有一段包含在companion object中的代码,需要说一下的是,Kotlin的class并不支持static变量,所以需要使用companion object来声明static变量,其实这个platformStatic变量也不是真正的static变量,而是一个伴生对象, 这个伴生对象位于Message类中定义的一个叫做Companion的内部类中,如图: 可以看到在Kotlin中编译器自动生成类是很常见的事情,那么这个伴生对象作何理解呢? 我的理

  • PHP7匿名类用法分析

    本文实例讲述了PHP7匿名类用法.分享给大家供大家参考,具体如下: 匿名类跟匿名函数一样,创建一次性的简单对象 <?php /** * Created by PhpStorm. * User: bee * Date: 2016/4/24 * Time: 00:17 */ echo '匿名函数'; $anonymous_func = function(){return 'function';}; echo $anonymous_func(); echo '<br>'; echo '<

随机推荐