POD代表普通旧数据 - 即没有构造函数,析构函数和虚拟成员函数的类(无论是使用关键字struct
还是关键字class
)。 维基百科关于 POD 的文章更详细,并将其定义为:
C ++ 中的普通旧数据结构是一个聚合类,它只包含 PODS 作为成员,没有用户定义的析构函数,没有用户定义的复制赋值运算符,也没有指向成员类型的非静态成员。
在C ++ 98/03 的答案中可以找到更多细节。 C ++ 11 改变了围绕 POD 的规则,使它们大大放松,因此需要在此处进行后续回答 。
POD 是一种类型(包括类),其中 C ++ 编译器保证结构中不会出现 “魔术”:例如,隐藏指向 vtable 的指针,在转换为其他类型时应用于地址的偏移量(至少如果目标的 POD 也是如此),构造函数或析构函数。粗略地说,类型是 POD,当它中的唯一内容是内置类型和它们的组合时。结果是 “像 C” 一样的行为。
int
, char
, wchar_t
, bool
, float
, double
是 POD,以及它们的long/short
和有signed/unsigned
版本。 enums
是 POD const
或volatile
POD 是 POD。 class
, struct
或union
是 POD,前提是所有非静态数据成员都是public
,并且它没有基类,也没有构造函数,析构函数或虚方法。静态成员不会在此规则下停止某个 POD。此规则在 C ++ 11 中已更改,并且允许某些私有成员: 具有所有私有成员的类是否可以是 POD 类? 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 类型的非静态数据成员,非 POD-union(或这类类型的数组)或引用,并且没有用户 - 定义复制操作符,没有用户定义的析构函数。类似地,POD-union 是一个聚合联合,它没有非 POD-struct,非 POD-union(或这类类型的数组)或引用类型的非静态数据成员,并且没有用户定义的复制操作符,也没有用户定义的析构函数。
8.5.1(1): “聚合是一个数组或类(第 9 节),没有用户声明的构造函数(12.1),没有私有或受保护的非静态数据成员(第 11 节),没有基类(第 10 节)没有虚拟功能(10.3)。“
简而言之,它是所有内置数据类型(例如int
, char
, float
, long
, unsigned char
, double
等)以及 POD 数据的所有聚合。是的,这是一个递归定义。 ;)
更清楚一点,POD 就是我们所说的 “结构”:一个单元或一组只存储数据的单元。