C++ 中的结构体(struct)是一种复合数据类型,用于将多个不同类型的变量组合成一个逻辑单元。它和 class非常相似,但有一些关键区别(主要是默认访问权限)。
一、核心概念与用法
1. 定义结构体
struct Person {
std::string name; // 成员变量(字段)
int age;
double height;
}; // 注意分号!
2. 初始化结构体
// 列表初始化(按成员声明顺序)
Person p1 = {"Alice", 25, 1.65};
// C++20 指定成员初始化(顺序无关)
Person p2 { .name="Bob", .height=1.80, .age=30 };
// 构造函数初始化(自定义构造逻辑)
struct Point {
int x, y;
Point(int a, int b) : x(a), y(b) {}
};
Point p3(10, 20);
3. 访问成员
// 点运算符(对象)
p1.name = "Carol";
cout << p1.age;
// 箭头运算符(指针)
Person* ptr = &p1;
cout << ptr->height;
二、 结构体 vs 类(class)
|
特性 |
|
|
|---|---|---|
|
默认访问 |
|
|
|
继承 |
默认 |
默认 |
|
典型用途 |
数据聚合(无复杂行为) |
封装数据+行为(OOP) |
💡 实际开发中:
- 若只需打包数据 → 用
struct- 若需封装、继承、多态 → 用
class
三、 高级用法
1. 嵌套结构体
struct Address {
string city;
string street;
};
struct Employee {
string name;
Address homeAddr; // 嵌套结构体
};
2. 成员函数
struct Rectangle {
int width, height;
// 成员函数
int area() const {
return width * height;
}
};
3. 作为函数参数/返回值
// 传引用避免拷贝(加 const 防修改)
void printPerson(const Person& p) {
cout << p.name << " is " << p.age << " years old.";
}
// 返回结构体(可直接构造返回)
Person createPerson() {
return {"Dave", 40, 1.75};
}
四、关键注意事项
- 内存对齐
结构体大小可能大于成员总和(编译器填充字节对齐):
struct Example { char c; // 1字节 int i; // 4字节 }; // 大小可能是 8 字节(而非 5 字节) - 传递开销
大型结构体传值时拷贝代价高 → 始终用引用传递:
// 推荐做法 ✅ void process(const BigStruct& data); // 避免做法 ❌ void process(BigStruct data);
五、实际应用场景
- 数据记录:存储数据库条目、配置文件
- 图形处理:
Point(x,y),Color(r,g,b) - 硬件交互:寄存器映射、协议数据包
- 轻量对象:不需要复杂行为的简单对象
六、完整示例
#include <iostream>
#include <string>
struct Book {
std::string title;
std::string author;
int pages;
void print() const {
std::cout << title << " by " << author
<< " (" << pages << " pages)\n";
}
};
int main() {
Book myBook = {"The C++ Programming Language", "Bjarne Stroustrup", 1360};
myBook.print();
// 修改成员
myBook.pages = 1400;
std::cout << "Updated pages: " << myBook.pages;
return 0;
}
输出:
The C++ Programming Language by Bjarne Stroustrup (1360 pages)
Updated pages: 1400
七、最佳实践建议
- 优先用
struct组织纯数据集合 - 超过 16 字节的结构体用引用传递
- 对不修改成员的函数使用
const(如print()) - C++20 起使用指定初始化增强可读性
结构体是 C++ 中构建复杂数据模型的基石,合理使用能让代码更清晰高效!

被折叠的 条评论
为什么被折叠?



