C++学习-结构体
结构体
1. 数据封装————结构体
1.1 结构体类型的定义:
结构体定义的格式如下:
struct 结构体类型名{
类型名1 成员1;
类型名2 成员2;
... ...;
};
例如,我用一个结构体储存学生的信息:
struct studentT{
char no[10];
char name[10];
int chinese;
int math;
int english;
};
字段名可以和程序中的变量名相同,不同结构体内的字段名也可以相同。
结构体的成员类型可以是任意类型,可以是整型,浮点型,数组,也可以是其他的结构体类型(不能是自己,但可以是指向自己这一结构体类型的指针),如:
struct dateT{
int month;
int day;
int year;
};
struct studentT{
char no[10];
char name[10];
int chinese;
int math;
int english;
dateT birthday;//一个类型为dateT的成员
};
1.2 结构体类型变量的定义
结构体类型的变量定义方式与普通的内置类型的变量的定义完全相同。如我们定义一个 studentT 类型的变量 student1 和数组 studentArray :
studentT student1,studentArray[10];
//或者在定义结构体类型的时候初始化:
struct { //可以不写名字,不过无法继续定义结构体变量
char no[10];
char name[10];
int chinese;
int math;
int english;
dateT birthday;
}studentT student1,studentArray[10];
当然也可以初始化:
studentT student1={"00001","铃兰",89,96,77};//该变量里储存了铃兰的学号,名字,三门科的成绩
studentT studentArray[10]={{"00001","博士",150,150,150},{"00002","史尔特尔",100,100,100},......}; //该变量数组存了10名同学的....(省略)
初始化后数组的状态可以这么理解:
| 序号 | 学号(no) | 名字(name) | 语文(chinese) | 数学(math) | 英语(english) |
|---|---|---|---|---|---|
| 0(studentArray[0]) | 00001 | 博士 | 150 | 150 | 150 |
| 1(studentArray[1]) | 00002 | 史尔特尔 | 100 | 100 | 100 |
| ... (studentArray[...]) | |||||
| 就是花名册嘛,,, | |||||
| 当然我们都想给铃兰小姐庆祝生日,但生日是结构体类型变量中的结构体类型变量,如何初始化?这样子: |
studentT student1={"00001","铃兰",89,96,77,{0,10,9}};//再内置一个大括号,如有需要可以继续套娃
1.2 结构体类型变量的使用
不同的结构体类型变量无法进行整体操作,只能用运算符'.'和成员的名称把这个结构体 ”打开“:
student1.chinese; //铃兰小姐的语文成绩
cout<<student1.birthday.month<<student1.birthday.day;//输出铃兰小姐的生日
输入同理。
相同类型的结构体变量可以互相赋值,例如对于 studentArray 的元素,可以用 studentArray[0] = studentArray[5] ,赋值,其意义是把 studentArray[5] 的所有成员的值全部对应赋给 studentArray[0] 。
结构体同样也可以通过指针访问,也可以申请动态变量或数组
studentT student1,*sp=&student1;
studentT sp1=new studentT;
studentT sp2=new studentArray[10];
不过使用的时候要用括号:
(*sp).chinese;
否则编译器会认为sp。chinese是一个指针。数组则无所谓。
不过这样子加括号过于麻烦,C++提出了一个更加简洁明了的运算符->,用法如下
指针变量名->成员名;
2 结构体作为函数的参数(写sort的cmp函数排列结构体)
先介绍一下,以下方式都可以:
struct pointT{ //定义一个结构体类型,方便存入平面上的点
double x,y;
};
void f1(pointT d){;};
void f2(const pointT &d){;}; //传引用,且不能通过引用改变A成员的值
void f3(pointT *p){;}; //传给指针
int main()
{
point A;
cin>>A.x>>A.y;
f1(A);
f2(A);
f3(&A);
}
当然也可以把一个成员的值传给函数,这就和一般变量的传递一样了。
如何写sort的cmp函数?
struct node{
string str1,str2;
}arr[100];
bool cmp(node arr1[],node arr2[])
{
if(arr1.str1>arr2.str1) return 1;
if(arr1.str1==arr2.str1&&arr1.str2>arr2.str2) return 1;
return 0;
}//现根据str1排序,若相等再根据str2排序。
这个是降序,把大于改为小于就变成升序了。

浙公网安备 33010602011771号