C ++中的POD类型是什么?

我遇到过这个POD类型的几次。 这是什么意思?


POD代表普通旧数据 - 也就是说,一个类(不管是用关键字struct还是关键字class )没有构造函数,析构函数和虚拟成员函数。 维基百科有关POD的文章更详细一点,并将其定义为:

C ++中的普通旧数据结构是一个聚合类,它仅包含PODS作为成员,没有用户定义的析构函数,没有用户定义的复制赋值运算符,也没有指向成员类型的非静态成员。

在C ++ 98/03的这个答案中可以找到更详细的信息。 C ++ 11改变了POD的规则,大大放松了他们,因此在这里需要一个后续的答案。


非常非正式地:

POD是一种类型(包括类),其中C ++编译器保证结构中不会出现“魔术”:例如隐藏指向vtable的指针,当转换为其他类型时应用到地址的偏移量至少如果目标的POD也是),构造函数或析构函数。 粗略地说,一个类型是一个POD,当它唯一的东西是内置类型和它们的组合。 结果是“行为像”C型的东西。

较不正式:

  • intcharwchar_tboolfloatdouble都是POD, long/short以及它们的signed/unsigned版本。
  • 指针(包括指向函数的指针和指向成员的指针)都是POD,
  • enums是POD
  • constvolatile POD是POD。
  • POD的classstructunion是POD,前提是所有非静态数据成员都是public ,并且它没有基类,也没有构造函数,析构函数或虚方法。 根据这条规则,静态成员不会阻止POD。
  • 维基百科错误地说POD不能有指向成员类型的成员。 或者说,C ++ 98的写法是正确的,但是TC1明确指出,指向成员的指针是POD。
  • 正式(C ++ 03标准版):

    3.9(10): “算术类型(3.9.1),枚举类型,指针类型,指向成员类型的指针(3.9.2)和这些类型的cv限定版本(3.9.3)共同是调用者标量类型。类型,POD结构类型,POD联合类型(第9章),这些类型的数组和这些类型的cv限定版本(3.9.3)统称为POD类型“

    9(4): “POD-struct是一个聚合类,它没有类型非POD-struct,non-POD-union(或这种类型的数组)或非引用的非静态数据成员,定义复制操作符并且没有用户定义的析构函数类似地,POD-union是没有类型非POD-struct,非POD-union(或这种类型的数组)或引用的非静态数据成员的聚合联合,并没有用户定义的复制操作符,也没有用户定义的析构函数。

    8.5.1(1): “聚合是没有用户声明的构造函数(12.1),没有私有或受保护的非静态数据成员(第11节),没有基类(第10节)的数组或类(第9节)并没有虚拟功能(10.3)“。


    普通旧数据

    简而言之,它是所有内置数据类型(例如intcharfloatlongunsigned chardouble等)以及所有POD数据的聚合。 是的,这是一个递归定义。 ;)

    更清楚的是,POD就是我们所说的'结构'。

    链接地址: http://www.djcxy.com/p/1045.html

    上一篇: What are POD types in C++?

    下一篇: What is the optimal algorithm for the game 2048?