1. 程式人生 > >c++類物件陣列初始化的幾種方法

c++類物件陣列初始化的幾種方法

    類物件陣列初始化

    如有一個如下類:
    class EquipmentPiece {
    private:
        int IDNumber;
    public:
        EquipmentPiece(int IDNumber) : IDNumber(IDNumber) {};
    };

    以下列出幾種初始化的方法:
    <一>、物件陣列
        int ID1, ID2, ID3;
        EquipmentPiece bestPieces[] = { EquipmentPiece(ID1), EquipmentPiece(ID2), EquipmentPiece(ID3) };

    注意:
        EquipmentPiece bestPieces[10];    //no appropriate default constructor available
        EquipmentPiece *bestPieces = new EquipmentPiece[10];    //no appropriate default constructor available
    當然,如果你將建構函式引數全都設了預設值,以上兩種寫法也成功,如將類中建構函式修改如下:
        ...
        EquipmentPiece(int IDNumber = 0) : IDNumber(IDNumber) {};
        ...


    <二>、指標陣列
        typedef EquipmentPiece* PEP;    //PEP是個指向EquipmentPiece的指標

        PEP bestPieces[10];                //等同於 PEP *bestPieces = new PEP[10];

        //然後初始化
        for(int i = 0; i < 10; i++){
            bestPieces[i] = new EquipmentPiece( IDNumber );
        }

    注意:
        要記得將此陣列所指的所有物件刪除。如果忘了會產生資源洩露。還有就是該方法與物件陣列相比需要額外記憶體用於存放指標。(過度使用記憶體 這一問題可以避免,見第三種方法)


    <三>、使用placement new
        方法是:先為此陣列分配raw memory,然後使用"placement new"在這塊記憶體上構造EquipmentPiece objects;

        //分配足夠的raw memory,給一個預備容納10個EquipmentPiece objects的陣列使用
        void *rawMemory = operator new(10*sizeof(EquipmentPiece));

        //讓bestPieces指向此記憶體,使這塊記憶體被視為一個EquipmentPiece陣列
        EquipmentPiece *bestPieces = reinterpret_cast<EquipmentPiece*>(rawMemory);

        //利用"placement new"構造這塊記憶體中的EquipmentPiece objects。
        int IDNumber = 0;
        for(int i = 0; i < 10; i++){
            new (&bestPieces[i]) EquipmentPiece( IDNumber );
        }

    注意:該方法維護比較困難。在陣列內物件結束生命時,要以手動方式呼叫destructors,最後還得呼叫operator delete釋放raw memory。
        //將bestPieces中物件以構造次序的反序析構掉
        for(i = 0; i < 10; i++){
            bestPieces[i].~EquipmentPiece();
        }

        //釋放raw memory
        operator delete (rawMemory);

文章轉載: