##什麼是PODs以及它的特殊性 在C++標準中的正式定義(C++03 9 §4):c++
一個POD結構體是一個沒有非靜態的non-POD-struct、non-POD-union(或者這些類型的數組)或者引用類型的數據成員的aggregate類型,而且沒有用戶自定義的拷貝賦值操做和用戶自定義的析構函數(譯者注:這句話讀起來很繞,在此解釋一下,POD類型首先是一個aggregate類型,這個aggregate類型中不能含有非靜態的non-POD結構體或者聯合體,也不能含有用戶自定義的拷貝賦值函數和用戶自定義的析構函數)。相似的,一個POD聯合體是一個沒有非靜態的non-POD-struct、non-POD-union(或者這些類型的數組)或者引用類型的數據成員的aggregate類型,而且沒有用戶自定義的拷貝賦值操做和用戶自定義的析構函數。一個POD類要麼是POD結構體,不然是POD聯合體。
這個看起來更難以理解。如今讓咱們把聯合體剝離,換一種更清晰的說法:數組
若是一個aggregate類型不含用戶自定義的拷貝賦值函數和析構函數,不含有非靜態的non-POD類型的結構體和no-POD類型結構體的數組,不含有引用成員,則這個aggreagate類型爲POD類型。
這個定義是什麼意思呢(POD就是Plain Old Data)?安全
舉例:函數
struct POD { int x; char y; void f() {} //no harm if there's a function static std::vector<char> v; //static members do not matter }; struct AggregateButNotPOD1 { int x; ~AggregateButNotPOD1() {} //user-defined destructor }; struct AggregateButNotPOD2 { AggregateButNotPOD1 arrOfNonPod[3]; //array of non-POD class };
POD類、POD聯合體、標量類型以及上述全部類型的數組被統稱爲POD類型。 PODs有不少特殊的地方,我這裏僅舉幾個例子:佈局
memcpy
將對象的內容拷貝到一個char
或者unsigned char
的數組中再使用memcpy
拷貝回來時,對象的內容保持不變。值得注意的是對於非POD類型來講,C++沒有這樣的保證。固然,你可使用memcoy
在POD對象之間安全地拷貝。下面的例子中假設T是POD類型:#define N sizeof(T) char buf[N]; T obj; // obj initialized to its original value memcpy(buf, &obj, N); // between these two calls to memcpy, // obj might be modified memcpy(&obj, buf, N); // at this point, each subobject of obj of scalar type // holds its original value
f()
是不合法的,g()
是合法的。值得注意微軟的編譯器對於這條規則過於寬容--在全部例子中僅僅給出警告。int f() { struct NonPOD {NonPOD() {}}; goto label; NonPOD x; label: return 0; } int g() { struct POD {int i; char c;}; goto label; POD x; label: return 0; }
##結論 理解POD的確切含義是很重要的,由於正如你所看到的,許多語言特性對它們的行爲是不一樣的。this