引例
类没有无参构造器时
#include <iostream>
using namespace std;
class Stu
{
public:
Stu(string n):_name(n){}
void dis()
{
cout<<_name<<endl;
}
private:
string _name;
};
int main()
{
// Stu s; //没有无参构造器
// Stu s[5]= {Stu("zhangsan"),Stu("lisi")}; 不能指定个数,或部分初始化,否则会报错。
Stu s[]= {Stu("zhangsan"),Stu("lisi")};
// Stu * ps = new Stu[4]{Stu("zhangsan")};
// C11 中支持此种初始化方法,但必须对指定的类个数初始化,否则会报错。
Stu * ps = new Stu[1]{Stu("zhangsan")};
return 0;
}
栈对象数组
如果生成的数组,未初始化,则必调用无参构造器。或手动调用带参构造器。
堆对象数组
如果生成的数组,未初始化,则必调用无参构造器。或手动调用带参构造器。
修改引例后
#include <iostream>
using namespace std;
class Stu
{
public:
Stu(){
_name="123";
}
Stu(string n):_name(n){}
void dis()
{
cout<<_name<<endl;
}
private:
string _name;
};
int main()
{
Stu s;
Stu b[5]= {Stu("zhangsan"),Stu("lisi")};
Stu c[]= {Stu("zhangsan"),Stu("lisi")};
Stu * sp = new Stu[4]{Stu("zhangsan")};
Stu * ps = new Stu[1]{Stu("zhangsan")};
return 0;
}
结论
构造器无论是重载还是默认参数,一定要把系统默认的无参构造器包含进来。不然生成数组的时候,会有些麻烦。