c++中的pod类型
最早看到POD(plain old data)類型,是在imperfect c++里。我覺(jué)得這是一本把我?guī)У絚++世界里的一本很重要的書。
書里是這樣解釋POD的:
1、?? 所有標(biāo)量類型(基本類型和指針類型)、POD結(jié)構(gòu)類型、POD聯(lián)合類型、以及這幾種類型的數(shù)組、const/volatile修飾的版
??????? 本都是POD類型。
2、 POD結(jié)構(gòu)/聯(lián)合類型:一個(gè)聚合體(包括class),它的非static成員都不是pointer to class member、
??????? pointer to class member function、非POD結(jié)構(gòu)、非POD聯(lián)合,以及這些類型的數(shù)組、引用、const/
??????? volatile修飾的版本;
??????? 并且,此聚合體不能有用戶自定義的構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù).
3、 POD類型可以具有static成員、成員typedef、嵌套struct/class定義和 成員函數(shù)/方法。
(C++標(biāo)準(zhǔn))給出的定義:
將對(duì)象的各字節(jié)拷貝到一個(gè)字節(jié)數(shù)組中,然后再將它重新拷貝到原先的對(duì)象所占的存儲(chǔ)區(qū)中,此時(shí)該對(duì)象應(yīng)該具有它原來(lái)的值。
POD類型的特點(diǎn):
所有POD類型都可以作為union的成員,反之,所有非POD類型都不能作為union的成員。
POD特性利用:
我們可以利用POD類型特性來(lái)判斷一個(gè)類型是否為POD類型:
template<class T> struct must_be_pod
{
??? union
??? {
??????? T noname;
??? };
};
這個(gè)模板的意思是,只要類型T是非POD類型,那么編譯器將報(bào)錯(cuò),因?yàn)門被作為了union的一個(gè)成員。
VS2008里的測(cè)試代碼如下:
class A
{
public:
A(){}
void f() { cout << "A::F" << endl; }
protected:
private:
int i;
int j;
};
template<class T> struct must_be_pod
{
union
{
??? T noname;
};
};
must_be_pod<A> a; 編譯器會(huì)報(bào)錯(cuò):1>member 'must_be_pod<T>::noname' of union 'must_be_pod<T>::<unnamed-tag>' has user-defined constructor or non-trivial default constructor
其實(shí)POD本質(zhì)就是與c兼容的數(shù)據(jù)類型。
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的c++中的pod类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++ pimpl
- 下一篇: c++ template(9)trait