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++標準的了解?
總結
以上是生活随笔為你收集整理的C++ POD(Plain Old Data)类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: new A和new A()的区别详解
- 下一篇: _beginthreadex与Creat