标签:style blog color os io ar 数据 div cti
Plain old data structure, 缩写为POD, 是C++语言的标准中定义的一类数据结构,POD适用于需要明确的数据底层操作的系统中。POD通常被用在系统的边界处,即指不同系统之间只能以底层数据的形式进行交互,系统的高层逻辑不能互相兼容。比如当对象的字段值是从外部数据中构建时,系统还没有办法对对象进行语义检查和解释,这时就适用POD来存储数据。
POD类型包括下述C++类型,以及其cv-qualified的类型,还有以其为基类型的数组类型:
术语标量类型包括下述C++类型范畴, 以及其cv-qualified类型:
术语算术类型包括下述C++类型范畴:
术语整数类型包括下述C++类型范畴:
术语枚举类型包括各种枚举类型,即命名的常量值(named constant values)的集合.
术语指针类型包括下述C++类型范畴:
术语指针到成员类型包括下述C++类型范畴:
POD类类型是指聚合类(aggregate classes, 即POD-struct types)与聚合union (POD-union types),且不具有下述成员:
术语聚合是指任何的数组或者类,且不具有下述特征:
可见,POD类类型就是指class、struct、union,且不具有用户定义的构造函数、析构函数、拷贝算子、赋值算子;不具有继承关系,因此没有基类;不具有虚函数,所以就没有虚表;非静态数据成员没有私有或保护属性的、没有引用类型的、没有非POD类类型的(即嵌套类都必须是POD)、没有指针到成员类型的(因为这个类型内含了this指针)。
POD类型在源代码兼容于ANSI C时非常重要。POD对象与C语言的对应对象具有共同的一些特性,包括初始化、复制、内存布局、寻址。
一个例子是下述C++的new表达式中的对象初始化,POD与non-POD的区别: non-POD类型的对象或数组总是被初始化;而POD类型的对象或数组可能未被初始化.
其它与POD相关的C++特性:
1 #include <iostream> 2 using namespace std; 3 4 /// POD 5 template<typename T> 6 struct POD 7 { 8 static const bool Result=false; 9 }; 10 template<>struct POD<bool>{static const bool Result=true;}; 11 template<>struct POD<signed char>{static const bool Result=true;}; 12 template<>struct POD<unsigned char>{static const bool Result=true;}; 13 template<>struct POD<signed short>{static const bool Result=true;}; 14 template<>struct POD<unsigned short>{static const bool Result=true;}; 15 template<>struct POD<signed int>{static const bool Result=true;}; 16 template<>struct POD<unsigned int>{static const bool Result=true;}; 17 template<>struct POD<signed long long>{static const bool Result=true;}; 18 template<>struct POD<unsigned long long>{static const bool Result=true;}; 19 template<>struct POD<char>{static const bool Result=true;}; 20 template<>struct POD<wchar_t>{static const bool Result=true;}; 21 template<typename T>struct POD<T*>{static const bool Result=true;}; 22 template<typename T>struct POD<T&>{static const bool Result=true;}; 23 template<typename T, typename C>struct POD<T C::*>{static const bool Result=true;}; 24 template<typename T, int _Size>struct POD<T[_Size]>{static const bool Result=POD<T>::Result;}; 25 template<typename T>struct POD<const T>{static const bool Result=POD<T>::Result;}; 26 template<typename T>struct POD<volatile T>{static const bool Result=POD<T>::Result;}; 27 template<typename T>struct POD<const volatile T>{static const bool Result=POD<T>::Result;}; 28 29 /// Test Def 30 class MyClass{int a,b;}; 31 class MyPOD{int a,b;}; 32 typedef int* PTI; 33 typedef int ARR[10]; 34 typedef int& BAS; 35 typedef const int CON; 36 typedef std::pair<int,int> PII; 37 typedef std::pair<MyClass,MyPOD> PMM; 38 template<>struct POD<MyPOD>{static const bool Result=true;}; 39 template<typename K, typename V>struct POD< std::pair<K, V> >{static const bool Result=POD<K>::Result && POD<V>::Result;}; 40 41 int main() 42 { 43 /// Test Code 44 cout << POD<int>::Result << endl; 45 cout << POD<PTI>::Result << endl; 46 cout << POD<ARR>::Result << endl; 47 cout << POD<BAS>::Result << endl; 48 cout << POD<CON>::Result << endl; 49 cout << POD<MyClass>::Result << endl; 50 cout << POD<MyPOD>::Result << endl; 51 cout << POD<PII>::Result << endl; 52 cout << POD<PMM>::Result << endl; 53 return 0; 54 }
标签:style blog color os io ar 数据 div cti
原文地址:http://www.cnblogs.com/zinthos/p/3947706.html