结构体是将若干个不同的数据类型的变量或数组封装在一起,以存储自定义的数据结构,方便存储一些复合数据。
结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。
在 C++ 中,考虑到 C 语言到 C++ 语言过渡的连续性,对结构体进行了扩展,C++ 的结构体可以包含函数,这样,C++ 的结构体也具有类的功能,与class 不同的是,结构体包含的函数默认为 public,而不是 private。
结构体可以定义除了自身以外的任何数据类型。
基本格式:
struct Name{
//一些基本的数据结构或自定义的数据类型
//基本格式:数据类型 变量名称
};
定义的两种方式:
struct studentInfo{
int id;
char gender;
char name[20];
char major[20];
}Alice,Bob,stu[1000];
struct studentInfo Alice;
struct studentInfo stu[1000];
强调:结构体不能定义自己本身,但可以定义自身类型的指针变量。
struct node{
node n;//不能定义node型变量
node* next;//可以定义node*型指针变量
};
两种方法:
studentInfo类型定义为:
struct studentInfo{
int id;
char name[20];
//指针next用来指向下一个学生的地址
studentInfo* next;
}stu,*p;
访问stu中变量的写法如下:
stu.id
stu.name
stu.next
访问指针变量p中元素的写法如下:
注:以下两种方法完全等价
(*p).id
(*p).name
(*p).next
//更简洁的写法
p->id
p->name
p->next
通过定义studentInfo stu结构体变量,然后对其元素逐一赋值,但若结构体内变量很多将会不便。
构造函数来进行初始化。
构造函数:用来初始化结构体的一种函数,它直接定义在结构体中。特点:不需要写返回类型,且函数名与结构体名相同。
struct studentInfo{
int id;
char name[20];
//默认生成的构造函数
studentInfo(){}
};
构造函数的函数名和结构体类型名相同;
没有返回值;
没有参数;
没有函数体。
但构造函数的存在,才可以直接定义studentInfo类型的变量而不进行初始化。
如何手动提供id和gender的初始化参数?
struct studentInfo{
int id;
char gender;
//下面的参数用以对结构体内部变量进行赋值
studentInfo(int_id,char_gender){
//赋值
id=_id;
gender=_gender;
}
};
_id 和 _gender都是变量名,只要不和已有的变量冲突,用a、b或其他变量名都可以。
构造函数可以将其简化成一行。
struct studentInfo{
int id;
char gender;
//下面的参数用以对结构体内部变量进行赋值
studentInfo(int_id,char_gender): id(_id),gender(_gender){}
};
因此,在需要时就可以直接对结构体变量进行赋值:
构造函数可以将其简化成一行。
struct studentInfo stu = studentInfo(10086,'M');
注意:如果自己重新定义了构造函数,则不能不经初始化就定义结构体变量。
因为默认生成的构造函数“studentInfo(){}”已经被覆盖了。
因此,需要把“studentInfo(){}”手动加上,既能不初始化就定义结构体变量,又能享受初始化带来的便捷。
意味着:只要参数个数和类型不完全相同,就可以定义任意多个构造函数,以适应不同的初始化场合。
struct studentInfo{
int id;
char name[20];
//用以不初始化就定义结构体变量
studentInfo(){}
//只初始化gender
studentInfo(char_gender){
gender=_gender;
}
//同时初始化id和gender
studentInfo(int_id,char_gender){
//赋值
id=_id;
gender=_gender;
}
};
直接使用构造函数:
//结构体Point用于存放平面点的坐标x、y
struct Point{
int x,y;
Point(){}//用以不经初始化地定义pt[10]
Point(int _x,in _y): x(_x),y(_y){}//用以提供x和y的初始化
}p[10];
int main(){
int num=0;
for(int i=1; i<=3; i++){
for(int j=1; j<=3; j++){
pt[num++]=Point(i,j);//直接使用构造函数
}
}
for(int i=0; i<num; i++){
printf("%d,%d\n",pt[i].x,pt[i].y);
}
return 0;
}
构造函数可以在结构体内元素较多的时候使代码显得精炼,不需要临时变量就可以初始化一个结构体,使得代码更工整。