一、一般對象數組初始化
對象數組中的元素同樣需要用構造函數初始化。具體哪些元素用哪些構造函數初始化,取決於定義數組時的寫法。
#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]; // array1 數組中的兩個元素沒有初始化,調用無參構造函數初始化,
cout<<"stepl"<<endl;
CSample array2[2] = {3}; //array2 數組中array3[0]初始化了,array3[1] 無初始化,故分別用構造函數 2 和構造函數 1 進行初始化。
cout<<"step2"<<endl;
CSample* array3 = new CSample[2]; //動態分配了一個 CSample 數組,這兩個元素無參,都用無參構造函數初始化
delete [] array3;
return 0;
}
============輸出結果=============
Constructor 1 Called
Constructor 1 Called
stepl
Constructor 2 Called
Constructor 1 Called
step2
Constructor 1 Called
Constructor 1 Called
二、多參數對象數組初始化
在構造函數有多個參數時,數組的初始化列表中要顯式包含對構造函數的調用
class CTest{
public:
CTest(int n){ } //構造函數(1)
CTest(int n, int m){ } //構造函數(2)
CTest(){ } //構造函數(3)
};
int main()
{
CTest arrayl [3] = { 1, CTest (1, 2) }; //三個元素分別用構造函數(1)、(2)、(3) 初始化
CTest* pArray[3] = { new CTest(4) , new CTest(1,2) }; //兩個元素指向的對象分別用構造函數(1)、(2)初始化
return 0;
}
pArray 數組是一個指針數組,其元素不是CTest 類的對象,而是 CTest 類的指針。對 pArray[0] 和 pArray[1] 進行了初始化,把它們初始化爲指向動態分配的 CTest 對象的指針,而這兩個動態分配出來的 CTest 對象又分別是用構造函數(1)和構造函數(2)初始化的。
pArray[2] 沒有初始化,其值是隨機的,不知道指向哪裏。故只生成了兩個 CTest 對象,而不是三個,所以也只調用了兩次 CTest 類的構造函數。