非受限联合体--non-trivial union

        联合体中可以定义多个不同类型的成员,这些成员变量共享一块内存空间,C++11以前为了与C兼容,对于联合体内的数据类型进行了很多限制,C++11后取消了这些限制

        在C++11之前是不允许联合体中包含非POD类型的,而在C++11之后取消了这种限制。

         POD类型在上一遍博客中有叙述C++11 POD类型_xiangyuhaoaizcm的博客-CSDN博客

class A {
public:
	A(int x, int y) :aa(x), bb(y) {}
private:
	int aa;
	int bb;
};

union T {
	A a;
	double f;
};

        上面的联合体T包含类型A的变量a,类型A因为包含了非平凡的构造函数,所以为非POD类型。

当然取消这种限制是有条件的

        如果非受限联合体内有一个非 POD 的成员,而该成员拥有自定义的构造函数,那么这个非受限联合体的默认构造函数将被编译器删除;其他的特殊成员函数,例如默认拷贝构造函数、拷贝赋值操作符以及析构函数等,也将被删除。


非受限联合体的匿名声明和枚举式类

联合体T内定义了一个匿名联合体,这个联合体称为匿名联合体

union T {
    union {
        int a;
    };
};

非受限联合体运用于类的声明时,这样的类被称为枚举式类

class Student {
public:
	Student(bool g, int a) : gender(g), age(a) {}
	bool gender;
	int age;
};
class Singer {
public:
	enum Type { STUDENT, NATIVE, FOREIGENR };
	Singer(bool g, int a) : s(g, a) { t = STUDENT; }
	Singer(int i) : id(i) { t = NATIVE; }
	Singer(const char* n, int s) {
		int size = (s > 9) ? 9 : s;
		memcpy(name, n, size);
		name[s] = '\0';
		t = FOREIGENR;
	}
	~Singer() {}
private:
	Type t;
	union {
		Student s;
		int id;
		char name[10];
	};
};
int main() {
	Singer(true, 13);
	Singer(310217);
	Singer("J Michael", 9);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值