C++中POD類型


 

在imperfect c++里,

 

書里是這樣解釋POD的:

 

1、   所有標量類型(基本類型和指針類型)、POD結構類型、POD聯合類型、以及這幾種類型的數組、const/volatile修飾的版本都是POD類型。

 

2、  POD結構/聯合類型:一個聚合體(包括class),它的非static成員都不是pointer to class member、

 

        pointer to class member function、非POD結構、非POD聯合,以及這些類型的數組、引用、const/

 

        volatile修飾的版本;

 

        並且,此聚合體不能有用戶自定義的構造函數、析構函數、拷貝構造函數.

 

POD結構(POD-struct)是一個聚合類,它沒有以下類型的非靜態數據成員:指向成員的指針、非POD結構、非POD聯合(或以上類型的數組),或它們的引用,並且沒有用戶自定義的拷貝賦值運算符,也沒有用戶自定義的析構函數。 
  
類似的,POD聯合(POD-union)是一個聚合聯合,它沒有以下類型的非靜態數據成員:指向成員的指針、非POD結構、非POD聯合(或以上類型的數組),或它們的引用,並且沒有用戶自定義的拷貝賦值運算符,也沒有用戶自定義的析構函數。

POD類(POD class)是一個類,它要么是POD結構,要么是POD聯合。以下幾種是POD:  
1、所有基本數據類型 

2、一個class或者struct,它不包含虛函數,沒有虛基類,每一個數據成員都是POD,且所有的父類(如果存在的話)都是POD  
   
3、POD數組  
   
4、由POD組成的union  
POD可以包含非虛成員函數,當然也可以包含構造函數和(非虛)析構函數,因為這些東東都不影響對象布局。  
   
下面這個類,它不需要copy ctor就可以拷貝構造,但不是POD:  
struct   S  
{  
    std::string   str;    // std::string內部有指針,使用memcpy時執行淺拷貝 
}; 

C++11中對POD的定義

當class/struct是極簡的(trivial)、屬於標准布局(standard-layout),以及他的所有非靜態(non-static)成員都是POD時,會被視為POD。

一個極簡的類別或結構符合以下定義:

  1. 極簡的默認建構式。這可以使用默認建構式語法,例如SomeConstructor() = default;
  2. 極簡的復制建構式,可使用默認語法(default syntax)
  3. 極簡的賦值運算子,可使用默認語法(default syntax)
  4. 極簡的解構式,不可以是虛擬的(virtual)

一個標准布局(standard-layout)的類別或結構符合以下定義:

    1. 只有非靜態的(non-static)資料成員,且這些成員也是符合標准布局的型別
    2. 對所有non-static成員有相同的存取控制(public, private, protected)
    3. 沒有虛擬函式
    4. 沒有虛擬基礎類別
    5. 只有符合標准布局的基礎類別
    6. 沒有和第一個定義的non-static成員相同型別的基礎類別
    7. 若非沒有帶有non-static成員的基礎類別,就是最底層(繼承最末位)的類別沒有non-static資料成員而且至多一個帶有non-static成員的基礎類別。基本上,在該類別的繼承體系中只會有一個類別帶有non-static成員。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM