【C++进阶】C++的POD数据类型

POD: plain old data的缩写。

POD类型包括下面类型:

1、标量类型,c/c++的基本类型

  • signed integer types ( signed charshortintlong),
  • unsigned integer types ( unsigned charunsigned shortunsigned intunsigned long ),
  • char and wchar_t, and
  • bool.
  • floatdouble, and  long double
  • pointer-to-void ( void * ),
  • pointer-to-object and pointer-to-static-member-data (both of the form T* when pointing to an object of type T), and
  • pointer-to-function and pointer-to-static-member-function (both of the form  T (*)(... )  when pointing to a function that returns an object of type T).
  • pointer-to-nonstatic-member-data (of the form  T C::*  when pointing to one of class C's data members that has type T), and
  • pointer-to-nonstatic-member-functions (of the form  T (C::*)(... )  when pointing to one of class  C 's member functions that returns an object of type T).

2、用户自定义的类类型:

  • non-static data (including arrays) of any pointer-to-member type,
  • non-static data (including arrays) of any non-POD class type,
  • non-static data of any reference type,
  • user-defined copy assignment operator, nor
  • user-defined destructor.
  • user-declared constructors,
  • private or protected non-static data members,
  • base classes, nor
  • virtual functions.

POD类型的c++特性:

1、布局

   POD对象的内存字节是连续的。

2 初始化

1)如果定义一个非常量的POD对象,没有进行初始化,这个对象将会有一个不确定的初始值。

2)POD类型的缺省初始化是0初始化。

3)如果对一个静态的POD对象进行初始化,

如果是局部静态对象,那么初始值是在第一次执行初始化语句块的时候设定如果是全局静态对象,那么初始值是在任何动态初始化之前设定。

3 拷贝

      POD类型的对象可以copy

4 Addressing

The address of a POD object can be an address constant expression (or part of one) [§5.19, ¶4], while a reference to a POD member can be a reference constant expression 。

"A pointer to a POD-struct object, suitably converted using a reinterpret_cast, points to its initial member ... and vice versa"



POD全称Plain Old Data是指C风格的struct结构体定义的数据结构,其中struct结构体中只能定义常规数据类型(不能含有自定义数据类型)。它仅作为被动的收藏的字段值,不使用封包或者other object-oriented特征。

对于POD类型T的对象,不管这个对象是否拥有类型T的有效值,如果将该对象的底层字节序列复制到一个字符数组(或者无符号字符数组)中,再将其复制回对象,那么该对象的值与原始值一样。

对于任意的POD类型T,如果两个T指针分别指向两个不同的对象obj1和obj2,如果用memcpy库函数把obj1的值复制到obj2,那么obj2将拥有与obj1相同的值。

简言之,针对POD对象,其二进制内容是可以随便复制的,在任何地方,只要其二进制内容在,就能还原出正确无误的POD对象。对于任何POD对象,都可以使用memset()函数或者其他类似的内存初始化函数。

以上是C++ 03标准中的定义。

正是因为03标准中对POD限制的太严格了,所以C++ 0x标准中队POD的定义放宽了一些。

如果一个类或结构是平凡的,具有标准布局的,且不包含任何非POD的非静态成员,那么它就被认定是POD。平凡的类或结构定义如下:

1.具有一个平凡的缺省构造器。(可以使用缺省构造器语法,如 SomeConstructor() = default;)

2.具有一个平凡的拷贝构造器。(可以使用缺省构造器语法)

3.具有一个平凡的拷贝赋值运算符。(可以使用缺省语法)

4.具有一个非虚且平凡的析构器。

一个具有标准布局的类或结构被定义如下:

1.所有非静态数据成员均为标准布局类型。

2.所有非静态成员的访问权限(public, private, protected) 均相同。

3.没有虚函数。

4.没有虚基类。

5.所有基类均为标准布局类型。

6.没有任何基类的类型与类中第一个非静态成员相同。

7.要么全部基类都没有非静态数据成员,要么最下层的子类没有非静态数据成员且最多只有一个基类有非静态数据成员。总之继承树中最多只能有一个类有非静态数据成员。所有非静态数据成员必须都是标准布局类型。

 

其实说到底,POD就是一个很常规的结构体/类。看个例子:

上面的结构体在C++ 03中不算做一个POD,因为它有构造函数,而在C++ 0x中,这个结构体可以算作是一个POD类型,因为其满足上面的条件(貌似没有非虚的析构函数)。

不过这个东西就是个概念,不明白靠这个东西想了解应聘者的什么知识,难道是对C++标准的了解?



转自: http://blog.csdn.net/hengshan/article/details/6701216

               http://www.cppfans.org/1431.html

你可能感兴趣的:(【C++进阶】C++的POD数据类型)