1.构造函数的优势
众所周知,在结构体内部可以定义变量、函数等,但结构体内部的变量有一个特点:无法被初始化。因此我们需要初始化变量时可以通过函数实现。
struct student{
string name;
int score;
void pre(){
name="Tom";
score=4;
}
};
int main(){
student a;
a.pre();
printf("%d\n",a.score);
}
但每定义一个student类型的变量时,我们就需要调用pre函数一次,操作略为繁琐。因此我们可以采用构造函数。
2.构造函数的写法
构造函数是一类较为特别的成员函数,它必须先声明在结构体的内部,其函数名与该结构体类型的名字一样,如此处结构体类型名为student,则构造函数的名字便为student。另外,构造函数没有返回值,不需要用户调用(用户也无法调用),而是在创建对象时自动执行。
struct student{
string name;
int score;
student(){
name="Tom";
score=6;
}
};
int main(){
student a;
printf("%d\n",a.score);
}
构造函数可以与其他函数一样传入参数,根据参数来进行初始化。在调用时必须在定义结构体类型的变量时同时传入参数,故不能定义为\(student\;a;\)
struct student{
string name;
int score;
student(string s,int val){
name=s;
score=val;
}
};
int main(){
student a("Tom",5);
printf("%d\n",a.score);
}
有时参数可以不是通过我们手工输入,而是自动为其赋一个值作为参数,如下代码:
struct student{
string name;
int score;
student(string s,int val=4){
name=s;
score=val;
}
};
int main(){
student a("Tom");
printf("%d\n",a.score);
}
此处构造函数的val已经被我们赋值为4,故在定义时不需传入val的参数。但如仍要传入,则最后以我们传入的参数为准,例:
struct student{
string name;
int score;
student(string s,int val=4){
name=s;
score=val;
}
};
int main(){
student a("Tom",6);
printf("%d\n",a.score); //输出6
}
3.构造函数的初始化列表
构造函数在给成员变量赋值时,可以不把赋值操作写在函数体内部,而是把它们放到函数名与函数体之间,具体格式如下:
struct student{
string name;
int score;
student(string s,int val):name(s),score(val){}
};
int main(){
student a("Tom",6);
printf("%d\n",a.score);
}
在函数名之后用冒号引起,不同的成员变量之间用逗号隔开,每个成员变量用括号表示赋值。此种方法较为简便,被较多人采用。
注:给成员变量赋值时赋值顺序与构造函数中成员变量书写的顺序无关,而是与成员变量在结构体内被定义的顺序有关
struct student{
string name;
int score1,score2;
student(int val):score2(val),score1(score2){}
};
int main(){
student a(6);
printf("%d %d\n",a.score1,a.score2);
//输出0 6
}
虽然在构造函数中score2的赋值操作写在了score1之前,但实际进行中先进行score1的赋值操作,此时score2未被赋值,因此score1得到的值是随机的。
4.构造函数的种类
构造函数的名称全部相同,所以区分不同的构造函数只能依靠参数的种类、数目。
struct student{
int val1,val2;
string s;
student(int x){
val1=x;
}
student(int x,int y){
val1=x;
val2=y;
}
student(string s1){
s=s1;
}
};
int main(){
student a(1),b(1,2);
printf("%d\n",a.val1);
printf("%d\n",b.val2);
}
注意:在我们未定义构造函数的时候,系统会自动帮我们定义构造函数,此时的构造函数为空,没有参数也没有函数体,不执行任何操作。