首先我们举个例子。在
struct studentInfo {
int id;
char name[20];
}stu;
中,我们先定义一个studentInfo的结构体变量,然后对其中的元素逐一赋值。例如:
//第一种方法
stu.id = 1;
stu.genger = 'M';
//第二种方法
scanf("%d %c",&stu.id, &stu.gender);
但这两种方法都太麻烦。
接下来给大家介绍一种构造函数的方法,它直接定义在结构体中,不需要写返回类型,且函数名与结构体名相同。其实每一个普通的结构体中,内部都自动生成了一个默认的构造函数“studentInfo(){}”(但是不可见的)。
struct studentInfo {
int id;
char gender; //'F' or 'M'
char name[20];
//默认的构造函数
studentInfo() {}
};
它看起来和C++中的类的构造函数十分相似。是的,接下来你也可以这么来学习。这是一个空的构造函数,里面没有任何东西,他会初始化结构体中的变量,赋上默认参数。如果你不想按照系统默认的构造函数初始化参数,想要自己手动提供id和gender的初始化参数,只需要重写构造函数就可以了。(
注意:如果重写了构造函数,就会自动覆盖系统提供的默认构造函数,下次定义结构体的时候就必须按照自己写的构造函数来定义结构体变量)。
为了既可以按照自己写的结构体的构造函数初始化结构体变量,也可以使用系统默认的结构体的构造函数初始化变量,那么可以同时写多个构造函数。把系统的默认构造函数和自己写的构造函数都放在结构体里面,就可使用这几种不同的构造函数初始化结构体中的变量。具体用到的是哪一种,就要看你调用了哪个构造函数,因为每个构造函数的参数个数和类型不能完全相同,所以在构造函数中出入不同的参数时,系统就会去找和你传入的参数类型和个数相同的构造函数。例如:
struct studentInfo {
int id;
char gender; //'F' or 'M'
char name[20];
//默认的构造函数
studentInfo() {}
//只初始化gender的构造函数
studentInfo(char _gender) {
gender = _gender;
}
//同时初始化id和gender的构造函数
studentInfo(int _id, char _gender) {
id = _id;
gender = _gender;
}
};
最后是一个应用实例。其中结构体Point用于存放平面点的坐标x,y。
#include <stdio.h>
#include <stdlib.h>
struct Point {
int x, y;
Point() {} //不同初始化的定义结构体
Point(int _x, int _y) {
x = _x;
y = _y;
}
}pt[10];
int main()
{
int num = 0;
for(int i = 0; i <= 3; i++) {
for(int j = 1; j <= 3; j++) {
pt[num++] = Point(x,y); //直接使用自己写的构造函数
}
}
for(int i = 0; i < num; i++) {
printf("%d,%d\n", pt[i].x, pt[i].y);
}
return 0;
}