目录
- 结构体概述
- 结构体的声明与定义
- 结构体成员访问
- 结构体与类的区别
- 结构体的初始化
- 嵌套结构体
- 结构体作为函数参数和返回值
- 参考资料
1. 结构体概述
结构体(struct)是一种用户自定义的数据类型,用于将多个相关数据组合在一起,形成一个整体。结构体中的每个数据称为成员,它们可以具有不同的数据类型。结构体常用于描述具有相同属性的一组数据,如表示一个“学生”的姓名、年龄和成绩等。
2. 结构体的声明与定义
结构体的声明和定义语法如下:
struct 结构体名 {
数据类型 成员1;
数据类型 成员2;
// 更多成员...
};
示例:
#include <iostream>
using namespace std;
struct Student {
string name; // 姓名
int age; // 年龄
double score; // 成绩
};
int main() {
// 定义一个 Student 类型的变量
Student s1;
// 通过成员访问赋值
s1.name = "张三";
s1.age = 20;
s1.score = 88.5;
// 输出学生信息
cout << "姓名: " << s1.name << endl;
cout << "年龄: " << s1.age << endl;
cout << "成绩: " << s1.score << endl;
return 0;
}
3. 结构体成员访问
结构体的成员可以使用点操作符(.
)来访问。如果结构体变量的地址已知,可以使用指针和箭头操作符(->
)来访问成员。
示例:
Student s1 = {"李四", 22, 91.2};
Student* ptr = &s1;
cout << "姓名: " << s1.name << endl; // 直接访问
cout << "年龄: " << ptr->age << endl; // 使用指针访问
4. 结构体与类的区别
在 C++ 中,结构体和类非常相似,主要区别在于默认的访问控制权限:
- 结构体:默认成员权限为 public。
- 类:默认成员权限为 private。
例如:
struct MyStruct {
int x; // 默认 public
};
class MyClass {
int x; // 默认 private
};
可以通过在类中使用 public
、private
和 protected
显式指定访问权限,使得结构体和类在语义上趋于一致。
5. 结构体的初始化
结构体可以在声明时进行初始化。C++11 后支持列表初始化:
Student s1 = {"王五", 19, 85.0}; // 使用初始化列表
也可以分别对各个成员赋值:
Student s2;
s2.name = "赵六";
s2.age = 21;
s2.score = 90.0;
6. 嵌套结构体
结构体可以嵌套,即在一个结构体中定义另一个结构体,用于描述更复杂的数据结构。
示例:
struct Date {
int year;
int month;
int day;
};
struct Person {
string name;
Date birthday; // 嵌套结构体
};
int main() {
Person p = {"孙七", {1995, 12, 5}};
cout << "姓名: " << p.name << endl;
cout << "生日: " << p.birthday.year << "-" << p.birthday.month << "-" << p.birthday.day << endl;
return 0;
}
7. 结构体作为函数参数和返回值
结构体可以作为函数参数传递,可以通过值传递、引用传递或指针传递,也可以作为函数返回值返回。
示例:传递结构体引用:
#include <iostream>
using namespace std;
struct Student {
string name;
int age;
};
void printStudent(const Student &s) {
cout << "姓名: " << s.name << ", 年龄: " << s.age << endl;
}
int main() {
Student s = {"钱八", 23};
printStudent(s);
return 0;
}
8. 参考资料
总结
结构体是 C++ 中将相关数据组合在一起的重要工具,它通过为变量创建一个整体数据结构,帮助程序员更直观地组织和管理数据。通过理解结构体的声明、初始化、成员访问以及它与类的区别,可以更高效地设计和实现数据模型。结构体在实际编程中广泛应用于描述复杂数据类型、数据传递和面向对象设计等场景。
发表回复