整形、长整形、字符型以及浮点型等这些数据类型指南记录单一的数据,而这些数据只能被称为基础数据类型。如果需要定义某种类型,同时包含以上几种的基本数据类型。比如一个人同时含有身高、体重以及年龄的属性。而结构体就是将这些变量类型包含在一起,大大减少程序代码的离散性,使程序代码阅读更加符合逻辑。其一般的定义格式如下:
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},
};