一、一般对象数组初始化
对象数组中的元素同样需要用构造函数初始化。具体哪些元素用哪些构造函数初始化,取决于定义数组时的写法。
#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 类的构造函数。