C语言中的非受限联合体(union)如何改写为长尾词?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2029个文字,预计阅读时间需要9分钟。
在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 取消了这种限制。本文共计2029个文字,预计阅读时间需要9分钟。
在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 的改进。
