总览
主要讲了 c++ 中结构体的定义、嵌套使用以及和函数、const 的结合使用
定义和使用
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
语法:struct 结构体名 { 结构体成员列表 };
通过结构体创建变量的方式有三种,见下代码:
c++
#include <iostream>
using namespace std;
struct Student {
string name;
int age;
int score;
}s3;
int main() {
// 创建方式一:创建空的然后赋值
struct Student s1;
s1.name = "John";
s1.age = 18;
s1.score = 10;
cout << s1.name << " " << s1.age << " " << s1.score << endl;
// 创建方式二
struct Student s2 = {"River", 18, 100 };
// 创建方式三:定义结构体的时候顺手的事
s3.name = "Jewel";
s3.age = 18;
s3.score = 10;
}
一种 Java 没有的数据类型,Java 里万物皆类
- 创建结构体变量的时候,struct 关键字可以省略
- 结构体通过 . 来访问成员
结构体指针
通过指针->来访问结构体的成员
c++
#include <iostream>
using namespace std;
struct Student {
string name;
int age;
int score;
}s3;
int main() {
Student s = {"River", 20, 100};
Student * p = &s;
// 使用 -> 箭头来访问
cout << p->name << " " << p->age << " " << p->score << endl;
}
结构体嵌套结构体
结构体的成员可以是另一个结构体
c++
#include <iostream>
using namespace std;
struct Student {
string name;
int age;
int score;
};
struct Teacher {
int id;
string name;
int age;
Student student;
};
int main() {
Teacher t;
t.id = 2;
t.name = "John";
t.age = 10;
t.student = {"River", 10, 20};
return 0;
}
结构体做函数参数
将结构体作为参数向函数中传递: 值传递 or 引用传递
c++
#include <iostream>
using namespace std;
struct Student {
string name;
int age;
int score;
};
// 值传递
void printStudent1(Student student) {
student.age = 10; // 值传递:原来的对象值不变
cout << student.name << student.age << student.score << endl;
}
// 地址传递
void printStudent2(Student * p) {
p->age = 10; // 地址传递:原来的对象值会变
cout << p->name << p->age << p->score << endl;
}
int main() {
Student student = {"River", 10, 20};
printStudent1(student);
Student * p = &student;
printStudent2(p);
return 0;
}
结构体中 const 的使用
作用:用 const 来防止误操作
c++
#include <iostream>
using namespace std;
struct Student {
string name;
int age;
int score;
};
// 地址传递
void printStudent2(const Student * p) {
p->age = 10; // 报错,因为是 const,解决了引用误操作的问题
cout << p->name << p->age << p->score << endl;
}
int main() {
Student student = {"River", 10, 20};
Student * p = &student;
printStudent2(p);
return 0;
}
值传递每次都要复制一份,在结构体较大以及调用次数较多的时候,会非常占用空间;而引用传递每次只需要 8 字节,可以很好的解决这个问题
但是引用传递有一个隐患就是会修改实参,所以有时候需要加个 const 来防止误修改