设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 数据 手机 公司
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

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站长网)

    网友评论
    推荐文章
      热点阅读