1. 程式人生 > >C++ POD(Plain Old Data)型別

C++ POD(Plain Old Data)型別

群裡發過來一份他們公司的筆試題,看了下,發現裡面考了一個判斷如下是否為POD型別,沒搞明白什麼是POD,多方查閱後,發現其實是指一個C風格程式碼的概念。

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就是一個很常規的結構體/類。看個例子:

struct mydata
{
	mydata() : i(0), f(0.0f), c('1') {}
	int i;
	float f;
	char c;
};

上面的結構體在C++ 03中不算做一個POD,因為它有建構函式,而在C++ 0x中,這個結構體可以算作是一個POD型別,因為其滿足上面的條件(貌似沒有非虛的解構函式)。

不過這個東西就是個概念,不明白靠這個東西想了解應聘者的什麼知識,難道是對C++標準的瞭解?