C++物件陣列中使用建構函式

2020-07-16 10:04:20
物件陣列中的元素同樣需要用建構函式初始化。具體哪些元素用哪些建構函式初始化,取決於定義陣列時的寫法。
#include<iostream>
using namespace std;
class CSample{
public:
    CSample(){  //建構函式 1
        cout<<"Constructor 1 Called"<<endl;
    }
    CSample(int n){  //建構函式 2
        cout<<"Constructor 2 Called"<<endl;
    }
}
int main(){
    CSample arrayl[2];
    cout<<"stepl"<<endl;
    CSample array2[2] = {4, 5};
    cout<<"step2"<<endl;
    CSample array3[2] = {3};
    cout<<"step3"<<endl;
    CSample* array4 = new CSample[2];
    delete [] array4;
    return 0;
}
程式的輸出結果是:
Constructor 1 Called
Constructor 1 Called
stepl
Constructor 2 Called
Constructor 2 Called
step2
Constructor 2 Called
Constructor 1 Called
step3
Constructor 1 Called
Constructor 1 Called

第 13 行的 array1 陣列中的兩個元素沒有指明如何初始化,要用無參建構函式初始化,因此輸出兩行 Constructor 1 Called。

第 15 行的 array2 陣列進行了初始化,初始化列表 {4, 5} 可以看作用來初始化兩個陣列元素的引數,所以 array2[0] 以 4 為引數,呼叫建構函式 2 進行初始化;array2[1] 以 5 為引數,呼叫建構函式 2 進行初始化。這導致輸出兩行 Constructor 2 Called。

第 17 行的 array3 只指出了 array3[0] 的初始化方式,沒有指出 array3[1] 的初始化方式,因此它們分別用建構函式 2 和建構函式 1 進行初始化。

第 19 行動態分配了一個 CSample 陣列,其中有兩個元素,沒有指出和引數有關的資訊,因此這兩個元素都用無參建構函式初始化。

在建構函式有多個引數時,陣列的初始化列表中要顯式包含對建構函式的呼叫。例如下面的程式:
class CTest{
public:
    CTest(int n){ }  //建構函式(1)
    CTest(int n, int m){ }  //建構函式(2)
    CTest(){ }  //建構函式(3)
};
int main(){
    //三個元素分別用建構函式(1)、(2)、(3) 初始化
    CTest arrayl [3] = { 1, CTest (1, 2) };
    //三個元素分別用建構函式(2)、(2)、(1)初始化
    CTest array2[3] = { CTest(2,3), CTest (1,2), 1};
    //兩個元素指向的物件分別用建構函式(1)、(2)初始化
    CTest* pArray[3] = { new CTest(4) , new CTest(1,2) };

    return 0;
}
上面程式中比較容易令初學者困惑的是第 13 行。pArray 陣列是一個指標陣列,其元素不是CTest 類的物件,而是 CTest 類的指標。第 13 行對 pArray[0] 和 pArray[1] 進行了初始化,把它們初始化為指向動態分配的 CTest 物件的指標,而這兩個動態分配出來的 CTest 物件又分別是用建構函式(1)和建構函式(2)初始化的。pArray[2] 沒有初始化,其值是隨機的,不知道指向哪裡。第 13 行生成了兩個 CTest 物件,而不是三個,所以也只呼叫了兩次 CTest 類別建構函式。