结构体的定义与声明
在C++中,结构体(struct)是一种用户自定义的数据类型,用于将不同类型的数据组合成一个单一的复合类型。结构体的定义方式如下:
struct StructName { type1 member1; type2 member2; // 更多成员... };例如:
struct Person { std::string name; int age; float height; };结构体的初始化
结构体可以通过多种方式初始化:
- 直接初始化:
Person p1 = {"Alice", 25, 1.65f};- 成员逐个赋值:
Person p2; p2.name = "Bob"; p2.age = 30; p2.height = 1.75f;- C++11统一初始化:
Person p3 {"Charlie", 35, 1.80f};结构体的访问
结构体的成员通过点运算符(.)访问:
std::cout << p1.name << " is " << p1.age << " years old." << std::endl;如果结构体变量是指针,则使用箭头运算符(->)访问:
Person* ptr = &p1; std::cout << ptr->name << std::endl;结构体与类的区别
在C++中,struct和class非常相似,主要区别在于默认访问权限:
struct的成员默认是public。class的成员默认是private。
例如:
struct ExampleStruct { int x; // 默认为 public }; class ExampleClass { int x; // 默认为 private };结构体的嵌套
结构体可以嵌套其他结构体或类:
struct Address { std::string city; std::string street; }; struct Employee { std::string name; Address address; };结构体与函数
结构体可以作为函数的参数或返回值:
void printPerson(const Person& p) { std::cout << p.name << ", " << p.age << std::endl; } Person createPerson(std::string name, int age, float height) { return {name, age, height}; }结构体的大小与内存对齐
结构体的大小由其成员的总大小和内存对齐决定。可以使用sizeof运算符获取结构体的大小:
std::cout << sizeof(Person) << std::endl;内存对齐可以通过#pragma pack或alignas关键字调整:
#pragma pack(1) // 取消对齐 struct PackedStruct { char c; int i; }; #pragma pack() // 恢复默认对齐结构体的高级特性
C++11及更高版本为结构体引入了更多特性:
- 成员函数: 结构体可以包含成员函数:
struct Point { int x, y; void print() { std::cout << "(" << x << ", " << y << ")" << std::endl; } };- 构造函数: 结构体可以定义构造函数:
struct Point { int x, y; Point(int x, int y) : x(x), y(y) {} };- 运算符重载: 结构体可以重载运算符:
struct Point { int x, y; Point operator+(const Point& other) { return {x + other.x, y + other.y}; } };结构体的应用场景
结构体常用于以下场景:
- 组织相关数据(如坐标、配置参数)。
- 作为轻量级的数据容器(与类相比)。
- 与C语言兼容的数据结构(如网络协议、文件格式)。