C++ POD(Plain Old Data)类型
群里發(fā)過來一份他們公司的筆試題,看了下,發(fā)現(xiàn)里面考了一個判斷如下是否為POD類型,沒搞明白什么是POD,多方查閱后,發(fā)現(xiàn)其實(shí)是指一個C風(fēng)格代碼的概念。
POD全稱Plain Old Data是指C風(fēng)格的struct結(jié)構(gòu)體定義的數(shù)據(jù)結(jié)構(gòu),其中struct結(jié)構(gòu)體中只能定義常規(guī)數(shù)據(jù)類型(不能含有自定義數(shù)據(jù)類型)。它僅作為被動的收藏的字段值,不使用封包或者other object-oriented特征。
對于POD類型T的對象,不管這個對象是否擁有類型T的有效值,如果將該對象的底層字節(jié)序列復(fù)制到一個字符數(shù)組(或者無符號字符數(shù)組)中,再將其復(fù)制回對象,那么該對象的值與原始值一樣。
對于任意的POD類型T,如果兩個T指針分別指向兩個不同的對象obj1和obj2,如果用memcpy庫函數(shù)把obj1的值復(fù)制到obj2,那么obj2將擁有與obj1相同的值。
簡言之,針對POD對象,其二進(jìn)制內(nèi)容是可以隨便復(fù)制的,在任何地方,只要其二進(jìn)制內(nèi)容在,就能還原出正確無誤的POD對象。對于任何POD對象,都可以使用memset()函數(shù)或者其他類似的內(nèi)存初始化函數(shù)。
以上是C++?03標(biāo)準(zhǔn)中的定義。
正是因?yàn)?3標(biāo)準(zhǔn)中對POD限制的太嚴(yán)格了,所以C++?0x標(biāo)準(zhǔn)中隊(duì)POD的定義放寬了一些。
如果一個類或結(jié)構(gòu)是平凡的,具有標(biāo)準(zhǔn)布局的,且不包含任何非POD的非靜態(tài)成員,那么它就被認(rèn)定是POD。平凡的類或結(jié)構(gòu)定義如下:
1.具有一個平凡的缺省構(gòu)造器。(可以使用缺省構(gòu)造器語法,如 SomeConstructor() = default;)
2.具有一個平凡的拷貝構(gòu)造器。(可以使用缺省構(gòu)造器語法)
3.具有一個平凡的拷貝賦值運(yùn)算符。(可以使用缺省語法)
4.具有一個非虛且平凡的析構(gòu)器。
一個具有標(biāo)準(zhǔn)布局的類或結(jié)構(gòu)被定義如下:
1.所有非靜態(tài)數(shù)據(jù)成員均為標(biāo)準(zhǔn)布局類型。
2.所有非靜態(tài)成員的訪問權(quán)限(public, private, protected) 均相同。
3.沒有虛函數(shù)。
4.沒有虛基類。
5.所有基類均為標(biāo)準(zhǔn)布局類型。
6.沒有任何基類的類型與類中第一個非靜態(tài)成員相同。
7.要么全部基類都沒有非靜態(tài)數(shù)據(jù)成員,要么最下層的子類沒有非靜態(tài)數(shù)據(jù)成員且最多只有一個基類有非靜態(tài)數(shù)據(jù)成員。總之繼承樹中最多只能有一個類有非靜態(tài)數(shù)據(jù)成員。所有非靜態(tài)數(shù)據(jù)成員必須都是標(biāo)準(zhǔn)布局類型。
?
其實(shí)說到底,POD就是一個很常規(guī)的結(jié)構(gòu)體/類。看個例子:
struct mydata {mydata() : i(0), f(0.0f), c('1') {}int i;float f;char c; };上面的結(jié)構(gòu)體在C++ 03中不算做一個POD,因?yàn)樗袠?gòu)造函數(shù),而在C++ 0x中,這個結(jié)構(gòu)體可以算作是一個POD類型,因?yàn)槠錆M足上面的條件(貌似沒有非虛的析構(gòu)函數(shù))。
不過這個東西就是個概念,不明白靠這個東西想了解應(yīng)聘者的什么知識,難道是對C++標(biāo)準(zhǔn)的了解?
總結(jié)
以上是生活随笔為你收集整理的C++ POD(Plain Old Data)类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: new A和new A()的区别详解
- 下一篇: s3c2440移植MQTT