C++11非受限结合体 union
发布时间:2022-07-13 11:21 所属栏目:51 来源:互联网
导读:在 C/C++ 中,联合体(Union)是一种构造数据类型。在一个联合体内,我们可以定义多个不同类型的成员,这些成员将会共享同一块内存空间。老版本的 C++ 为了和C语言保持兼容,对联合体的数据成员的类型进行了很大程度的限制,这些限制在今天看来并没有必要,
在 C/C++ 中,联合体(Union)是一种构造数据类型。在一个联合体内,我们可以定义多个不同类型的成员,这些成员将会共享同一块内存空间。老版本的 C++ 为了和C语言保持兼容,对联合体的数据成员的类型进行了很大程度的限制,这些限制在今天看来并没有必要,因此 C++11 取消了这些限制。 C++11 标准规定,任何非引用类型都可以成为联合体的数据成员,这种联合体也被称为非受限联合体。例如: class Student{ public: Student(bool g, int a): gender(g), age(a) {} private: bool gender; int age; }; union T{ Student s; // 含有非POD类型的成员,gcc-5.1.0 版本报错 char name[10]; }; int main(){ return 0; } 上面的代码中,因为 Student 类带有自定义的构造函数,所以是一个非 POD 类型的,这导致编译器报错。这种规定只是 C++ 为了兼容C语言而制定,然而在长期的编程实践中发现,这种规定是没有必要的。 关于 POD 类型稍后我们会讲解,大家先不要着急。 接下来,我们具体看一下 C++11 对 C++98 的改进。 1. C++11 允许非 POD 类型 C++98 不允许联合体的成员是非 POD 类型,但是 C++1 1 取消了这种限制。 POD 是 C++ 中一个比较重要的概念,在这里我们做一个简单介绍。POD 是英文 Plain Old Data 的缩写,用来描述一个类型的属性。 POD 类型一般具有以下几种特征(包括 class、union 和 struct等): 1) 没有用户自定义的构造函数、析构函数、拷贝构造函数和移动构造函数。 2) 不能包含虚函数和虚基类。 3) 非静态成员必须声明为 public。 4) 类中的第一个非静态成员的类型与其基类不同,例如: class B1{}; class B2 : B1 { B1 b; }; class B2 的第一个非静态成员 b 是基类类型,所以它不是 POD 类型。 需要注意的是,静态成员变量只能在联合体内定义,却不能在联合体外使用,这使得该规则很没用。 非受限联合体的赋值注意事项 C++11 规定,如果非受限联合体内有一个非 POD 的成员,而该成员拥有自定义的构造函数,那么这个非受限联合体的默认构造函数将被编译器删除;其他的特殊成员函数,例如默认拷贝构造函数、拷贝赋值操作符以及析构函数等,也将被删除。 (编辑:ASP站长网) |
相关内容
网友评论
推荐文章
热点阅读