结构、联合与枚举

结构、联合与枚举

结构与类

  • struct 是一种class, 它的成员默认是publicde .struct 可以包含成员函数,尤其是构造函数。
  • struct 的对象的大小因为需要系统对齐,可能导致struct 对象的大小不一定是所有成员的大小之和
**struct struct1 {
	char member1;
	char member2;
	int  member3;
};
struct struct2 {
	char member1;
	int member3;
	char member2;
};
struct1 的大小是8
struct2 的大小是12
所以在设计成员变量的时候,如果对内存使用比较敏感的情况下,可以通过合理的优化struct 成员的顺序来减少内存占用

普通旧数据(POD)

  • 普通旧数据是指被“仅当作数据” 处理的对象,程序员无须顾及类布局的复杂性以及用户自定义的构造、拷贝和移动语义
    • 满足下述条件的对象,才可以当作普通旧数据
      • 不具有复杂的布局
      • 不具有费标准(用户自定义的)拷贝语句
      • 含有一个最普通的默认构造函数
    • 正式(国际标准)规定, POD 必须是属于下列类型的对象
      • 标准布局类型
        • 一个类型具有标准布局,除非它
          • 包含一个费标准布局的非static 成员或基类
          • 包含virtual 函数
          • 包含virtual 基类
          • 含有引用类型
          • 其中的非静态数据成员有多种访问修饰符
          • 组织了重要的布局优化
        • 标准布局类型基本上是指与C 语言的布局兼容的类型
      • 平凡可拷贝类型
        • 平凡类型的属性: 一个平凡默认构造函数, 平凡拷贝和移动操作,通俗的讲, 当一个模热构造函数无须执行任何实际操作时,我们认为他是平凡的
      • 具有平凡默认构造函数的类型
  • istd:😒_pod::value 可以用于判断一个类型是否是POD类型
  • 如果是pod 类型就可以使用memcpy 这些函数直接进行操作,否则是不能进行这种操作的

联合union

  • union 是一种比较底层的语言特性,尤其是单片机类编程,或者底层通信接口编程时使用的比较广泛。C++ 并不提倡使用union。
union mydata {
	int data;
	struct {
		int bit1 : 1;
		int bit2 : 3;
		int reserve: 4;
	} mask;
};
这样操作data, 或者操作mask 会同步修改,反之亦然。在以前的C 编程中经常以这种方式使用

  • 匿名union (匿名联合) 是一个对象,而不是一个类型,无须对象明就能访问它的成员

枚举

  • 枚举类型:
  • enum class: 枚举值名字位于enum 的局部作用欲内,枚举值不会隐式的转换为其他类型
  • 普通enum: 枚举值名字与枚举类型位于同一个作用域中

enum class 类型

enum class Color {red, green, blue};
int color = Color::red; // error: cannot convert ‘Color’ to ‘int’ in initialization

enum class Color_INT: int {red, green, blue};
int color = static_cast<int>(Color::red);

// int color = static_cast<char>(Color::red); 也可以编译通过

  • 当使用基础类型(如int、char) 等表示枚举类型, 默认情况下,枚举值从0开始,依次递增,可以使用static_cast 进行转化
  • 一个整数类型的值可以显示的转换成枚举类型。如果这个值属于枚举的基础类型的取值范围, 则转换是有效的;否则超出了合理的表示范围,则转换的结果是未定义的。
enum class Flag : char {x=1, y=2, z = 4, e = 8};
// error: cannot convert ‘int’ to ‘Flag’ in initialization
Flag f0 = 1;


Flag f0 = static_cast<Flag>(0); // compile ok
Flag f0 = static_cast<Flag>(5); // 5 不在Flag 的值定义的范围内,语法上来讲转换结果未定义不推荐
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值