整形、长整形、字符型以及浮点型等这些数据类型指南记录单一的数据,而这些数据只能被称为基础数据类型。如果需要定义某种类型,同时包含以上几种的基本数据类型。比如一个人同时含有身高、体重以及年龄的属性。而结构体就是将这些变量类型包含在一起,大大减少程序代码的离散性,使程序代码阅读更加符合逻辑。其一般的定义格式如下:
- struct 结构体类型名称
- {
- 成员类型 成员名;
- ...
- 成员类型 成员名;
-
- };
struct就是定义结构体的关键字。结构体类型名称就是一种标识符,该标识符表示一个新的变量。结构体是以大括号括起来且以分号结尾。例如定义一个学生结构体,包含年龄、分数和姓名属性。
- struct Student {
- string name; //学生姓名
- int age; //学生年龄
- int score; //学生分数
- };
注意一点,结构体由不同类型的数据组成的数据集合,而数组是相同元素的集合。
- struct Student1 {
- int age;
- };
- struct Student2 {
- int age;
- } stu2;
- //也可以同时声明多个变量
- struct Student2 {
- int age;
- } stu2,stu22;
- typedef struct Student3 {
- int age;
- } stu3;
- struct {
- int age;
- } stu4;
- typedef struct {
- int age;
- } Student5;
引用结构体成员有两种方式,一种是声明结构体变量后,通过成员运算符“.”引用;一种是声明结构体指针变量,使用指向"->"运算符引用。
(1)使用“."应用结构体成员。
- struct Student {
- string name;
- int score;
- int age;
- };
- int main() {
-
- struct Student student;//struct可以省略
- student.age = 18;
- student.name = "树哥";
- student.score = 60;
- return 0;
- }
注意:结构体可以在定义时直接对结构体变量赋值,例如:
struct Student student2={ "树哥",60,18};
(2)在定义结构体时,可以同时声明结构体指针变量,例如:
- struct Student {
- string name;//姓名
- int score;//分数
- int age;//年龄
- } * student;
-
- int main() {
-
- student->name = "树哥";
- student->age = 18;
- student->score = 60;
- return 0;
- }
注意:指针结构体指针只有初始化后才可以使用。
结构体数据类型在c++语言中是可以作为函数参数传递的,可以直接使用结构体变量做函数的参数,也可以使用结构体指针变量做函数参数。
- #include
- using namespace std;
-
- //定义学生结构体定义
- struct student {
- string name;
- int age;
- int score;
- };
- //自定义函数,打印学生信息
- void printfStudent(student stu) {
- cout << "姓名:" << stu.name << " 年龄: " << stu.age << " 分数:"
- << stu.score << endl;
- }
-
- int main() {
- //声明结构体
- student stu = {"张三", 18, 100};
- //调用自定义函数
- printfStudent(stu);
-
- return 0;
- }
使用结构体指针变量做函数参数时传递的只是地址,这样的方式减少了时间和空间上的开销,能够有效提高程序的运行效率。
- #include
- using namespace std;
-
- //定义学生结构体定义
- struct student {
- string name;
- int age;
- int score;
- };
- //自定义函数 打印学生信息
- void printfStudent2(student* stu) {
- cout << "姓名:" << stu->name << " 年龄: " << stu->age << " 分数:"
- << stu->score << endl;
- }
-
- int main() {
- student stu = {"张三", 18, 100};
-
- //地址传递
- printfStudent2(&stu);
- return 0;
- }
注意:两者的最主要的区别是结构体指针作为函数参数时,如果函数内部修改了结构体内的数值,则会修改成员结构体的数据,而结构体变量则不会。废话少说,少说废话,直接上代码。
- #include
-
- using namespace std;
- //全局变量声明区
-
- //学生结构体定义
- struct Student
- {
- string name;
- int age;
- int score;
- };
- //函数声明
- void printfStudent(student stu);
- void printfStudent2(student* stu);
-
- int main()
- {
- Student stu = { "张三", 18, 100 };
- //值传递
- printfStudent(stu);
- cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
-
- cout << endl;
-
- //地址传递
- printfStudent2(&stu);
- cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
-
-
- return 0;
- }
-
- //值传递
- void printfStudent(student stu)
- {
- stu.age = 28;
- cout << "子函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
- }
-
- //地址传递
- void printfStudent2(student* stu)
- {
- stu->age = 28;
- cout << "子函数中 姓名:" << stu->name << " 年龄: " << stu->age << " 分数:" << stu->score << endl;
-
- }
以上代码唯一的区别就是函数传入的参数类型不同,一个结构体变量参数一个结构体指针变量参数,然后同样在函数中修改age的值并且结构体中age初始值都是18,一起看下运行结果:
- 开始运行...
- 子函数中 姓名:张三 年龄: 28 分数:100
- 主函数中 姓名:张三 年龄: 18 分数:100
-
- 子函数中 姓名:张三 年龄: 28 分数:100
- 主函数中 姓名:张三 年龄: 28 分数:100
-
- 运行结束。
可以看到函数参数作为结构体指针进行地址传递修改数据时,student的age从18被修改为28了。
定义完结构体后形成一个新的数据类型,c++中在定义结构体时可以声明其他已定义好的结构体变量,也可以在定义结构体时定义子结构体。
- struct Student {
-
- struct StudentCar {
-
- string car_name;
- };
- //结构体内的变量和方法默认都是public的
- string name;
- int age;
- int score;
- //设置学生信息
- void setStuMsg(string name, int age, int score) {
- this->name = name;
- this->age = age;
- this->score = score;
- }
- //展示学生信息
- void showStuMsg() {
-
- cout << "name=" << name << ",age=" << age << ",score=" << score << endl;
- }
- };
定义了一个名为Student结构体里面包含学生的姓名、年龄和分数,同时在Student里面定义了一个StudentCar的结构体,里面有car_name属性。然后看下这种结构体嵌套如何调用:
- int main() {
- Student::StudentCar we ;//声明结构体Student内部的结构体StudentCar的对象
- we.car_name = "bmw";//对car_name进行赋值操作
- cout << we.car_name << endl;//打印car_name的值
- Student stu;//声明外部Student的对象
- stu.setStuMsg("jack", 38, 88); //设置Student的属性值
- stu.showStuMsg();//调用自定义函数 打印结构体Student的值
- return 0;
- }
- //打印输出结果:
- bmw
- name=jack,age=38,score=88
可以看到我们使用“::"引用到结构体内部的结构体变量进行操作。当然输了基本数据类型的访问,自定义的函数也是能访问的,操作也是一样的。
- struct StudentCar {
-
- string car_name;
- };
- struct Student {
- StudentCar studentCar;
-
- //结构体内的变量和方法默认都是public的
- string name;
- int age;
- int score;
- //设置学生信息
- void setStuMsg(string name, int age, int score) {
- this->name = name;
- this->age = age;
- this->score = score;
- }
- //展示学生信息
- void showStuMsg() {
-
- cout << "name=" << name << ",age=" << age << ",score=" << score << endl;
- }
- };
以上这种结构体嵌套的话就比较好理解了,把它当成基本数据类型调用使用就行了。先调用studentCar对象,再访问里面的属性,例如
- Student stu;
- stu.studentCar.car_name="benz";
结构体数组可以在定义结构体时声明,可以使用结构体变量声明,也可以直接声明结构体数组而无需定义结构体名。
- struct Student {
-
- string name; //学生姓名
- int age; //学生年龄
- int score; //学生分数
- }student[5];
- struct Student {
-
- string name; //学生姓名
- int age; //学生年龄
- int score; //学生分数
- };
-
- Student student[2]= {
- {"tome", 67, 88},
- {"jerry", 86, 99},
- };
- struct Student {
-
- string name; //学生姓名
- int age; //学生年龄
- int score; //学生分数
- } student[2] = {
- {"tome", 67, 88},
- {"jerry", 86, 99},
- };