C ++中的POD类型是什么?
我遇到过这个POD类型的几次。 这是什么意思?
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 ++ 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)“。
普通旧数据
简而言之,它是所有内置数据类型(例如int
, char
, float
, long
, unsigned char
, double
等)以及所有POD数据的聚合。 是的,这是一个递归定义。 ;)
更清楚的是,POD就是我们所说的'结构'。
链接地址: http://www.djcxy.com/p/1045.html