POD,全稱plain old data,plain代表它是一個普通型別,old代表它可以與c相容,可以使用比如memcpy()這類c中最原始函式進行操作。C++11中把POD分為了兩個基本概念的集合,即:平凡的(trival)和標準佈局的(standard layout)。
POD,全稱plain old data,plain代表它是一個普通型別,old代表它可以與c相容,可以使用比如memcpy()這類c中最原始函式進行操作。C++11中把POD分為了兩個基本概念的集合,即:平凡的(trival)和標準佈局的(standard layout)。
首先是平凡的(trival)定義,通常一個平凡的類或者結構體需要滿足以下定義:擁有平凡的預設建構函式和解構函式。預設的意思就是由編譯器為我們自動生成的,不許是我們自己定義的,但是由於c++11提供了default,也可以是自己定義的加=default,比如 struct Trival{Trival(){}=default;} 就是滿足這個要求的,而 struct noTrival{ noTrival(){}; } 就不滿足這個要求(哪怕我們定義的建構函式體裡面啥都沒有)。這個要求對於帶參的建構函式沒有束縛。你可以自定義帶參的建構函式。擁有平凡的複製建構函式和移動建構函式。預設的意思同上,也可以使用=default。擁有平凡的複製賦值運算子和移動賦值運算子。不能包含虛擬函式和虛基類。 2.接下來是標準佈局的定義:所有非靜態成員擁有相同的訪問級別,(訪問級別就是public,private,protected),struct t1{ private : int a; public: int b; }就不滿足標準佈局,因為a,b訪問級別不同。在類和結構體繼承時需要滿足以下兩個情況之一:派生類中有非靜態類,那麼這個派生類只能有且只有一個僅包含了靜態成員的基類。基類有非靜態成員,那麼派生類中不允許有非靜態成員。 (這兩句話看著挺繞口,其實就是在說明一個事實,關於非靜態資料的事實,派生類中有非 靜態的資料那麼它的基類只能是隻有靜態的,而且基類只能有一個。如果基類有非靜態的, 那麼派生類就不能有非靜態的。有種蹺蹺板的感覺,非靜態的對面坐著的是靜態,父子類就 是坐在蹺蹺板的兩端這種對應關係。)類中第一個非靜態型別與基類不是同一個型別。比如 struct A:B{ B b; int c; }就不符合這個條件。因為A中第一個成員是基類B型別的。沒有虛類和虛基類(與trival中重複)所有非靜態資料成員都符合標準佈局的要求,這其實就是一個遞迴的定義。所以在C++11中,POD就是滿足平凡的(trival)和標準佈局(standard layout)這兩個方面。可以使用<type_traits>中的is_pod<T>::value判斷T是不是POD型別的。說了這麼多,那麼為什麼我們需要POD這種條件滿足的資料呢?可以使用位元組賦值,比如memset,memcpy操作對C記憶體佈局相容。保證了靜態初始化的安全有效。