首先看一下两者的区别:
//初始值列表
Student(string n1,int n2,int a):name(n1),num(n2),age(a){};
//赋值
Student(string n1,int n2,int a){
name=n1;
num=n2;
age=a;
}
以上代码中,前者与后者的效果是一样的,有时我们可以忽略构造函数初始值列表和赋值之间的差异,但并非总能这样。如果成员是const或者引用的话,就必须使用初始值列表,若用赋值的方式将产生编译错误:
class Student{
public:
Student(string n1,const int n2,int a){
name=n1; //正确
num=n2; //错误:不能给const赋值
age=a; //错误:a没被初始化
}
private:
string name;
const int num;
int &age;
};
该构造函数初始化的正确形式应该是:
Student(string n1,const int n2,int a):name(n1),num(n2),age(a){};
建议大家养成使用构造函数初始值列表的习惯,这样能避免某些意想不到的错误。