假设有如下的student类型结构体
class student{
private:
int a;
int b;
int c;
public:
student(int s1,int s2,int s3):a(s1),b(s2),c(s3){}
};
定义一个student类型的数组,数组中包含三个学生元素
第一种写法(构造函数为含参构造函数时):
student s[3]={student(1,2,3),student(4,5,6),student(7,8,9)};
不能写成如下形式:
//错误的写法
student s[3];
s[0]=new student(1,2,3);
s[1]=new student(4,5,6);
s[2]=new student(7,8,9);
因为在结构体定义中只有一个含有三个参数的构造函数,所以定义时必须给出三个参数,student s[3]会调用无参构造函数,但是结构体定义中没有无参构造函数,所以会出错。
后面的三条语句也有错,因为s[0]=new student(1,2,3)的语句是赋值语句,不会调用构造函数,但是要重载=运算符,才能进行赋值。
还有一个错误的地方,就是student s[3]已经调用构造函数构造了对象,后面各个元素就不用new了。
第二种写法(构造函数为无参构造函数时):
student *ps;
ps=new student[3];
delete []ps;//析构写法
还有一个关于数组的不易理解的地方:
student * ps[3]={ new student(1,2,3), new student(4,5,6), new student(7,8,9)}
这里的ps是指针数组,不是对象数组,它的三个元素都是指针,每个指针都指向一个student类型的对象。如果只写student ps[3]而不写等号后面的部分则没有对象生成,也不会引发student构造函数的调用。括号里面new student(1,2,3)的返回类型是student ,赋值给数组的第一个元素,也就是把新构造的对象的地址赋值给指针数组的第一个元素。