news 2026/4/23 12:10:18

结构体的初认识

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
结构体的初认识

C++ 结构体(struct)是用户自定义的数据类型,核心用于封装多个不同类型的数据成员,也支持成员函数和访问控制。

核心特性

  1. 默认访问权限为 public,结构体间可直接访问成员(类 class 默认 private)。
  2. 能包含数据成员(如 int、string 等)和成员函数,还支持构造函数、析构函数。
  3. 可用于定义变量、作为函数参数或返回值,也能实现继承和多态(与类功能几乎一致)。

一、构造函数(初始化结构体)

结构体支持自定义构造函数(无参 / 有参 / 拷贝),替代传统的 “赋值初始化”,让初始化更规范。

cpp

运行

#include <iostream> #include <string> using namespace std; struct Student { string name; int age; float score; // 1. 无参构造函数(默认构造) Student() { name = "未知"; age = 0; score = 0.0; } // 2. 有参构造函数(推荐) Student(string n, int a, float s) : name(n), age(a), score(s) {} // 3. 拷贝构造函数(复制已有对象) Student(const Student& other) { name = other.name; age = other.age; score = other.score; cout << "拷贝构造被调用" << endl; } void showInfo() { cout << "姓名:" << name << ",年龄:" << age << ",成绩:" << score << endl; } }; int main() { Student stu1; // 调用无参构造 stu1.showInfo(); // 输出:姓名:未知,年龄:0,成绩:0 Student stu2("李四", 19, 92.0); // 调用有参构造 stu2.showInfo(); // 输出:姓名:李四,年龄:19,成绩:92 Student stu3 = stu2; // 调用拷贝构造 stu3.showInfo(); // 输出:姓名:李四,年龄:19,成绩:92 return 0; }

二、指针 / 引用访问结构体成员

结构体变量的指针 / 引用需用->(指针)或.(引用)访问成员,是数组、函数参数传递的高频用法。

cpp

运行

#include <iostream> #include <string> using namespace std; struct Book { string title; float price; }; // 引用传参(避免拷贝,可修改原数据) void updatePrice(Book& book, float newPrice) { book.price = newPrice; } // 指针传参 void printBook(const Book* book) { // const 防止误修改 cout << "书名:" << book->title << ",价格:" << book->price << endl; } int main() { Book b1 = {"C++ Primer", 89.9}; // 引用访问 Book& refB = b1; refB.title = "C++ Primer 中文版"; updatePrice(refB, 79.9); // 指针访问 Book* ptrB = &b1; printBook(ptrB); // 输出:书名:C++ Primer 中文版,价格:79.9 return 0; }

三、结构体数组

批量管理结构体对象,常用于存储列表数据(如学生列表、商品列表)。

cpp

运行

#include <iostream> #include <string> using namespace std; struct Product { string name; int stock; // 库存 float price; }; int main() { // 初始化结构体数组 Product products[3] = { {"手机", 50, 2999.9}, {"耳机", 200, 199.9}, {"充电器", 500, 49.9} }; // 遍历数组并修改/输出 for (int i = 0; i < 3; i++) { products[i].price *= 0.9; // 打9折 cout << "商品:" << products[i].name << ",库存:" << products[i].stock << ",折后价:" << products[i].price << endl; } return 0; }

四、结构体继承(与类一致)

结构体支持继承(默认 public 继承),可复用父结构体的成员,实现 “扩展”。

cpp

运行

#include <iostream> #include <string> using namespace std; // 父结构体(基类) struct Person { string name; int age; void basicInfo() { cout << "姓名:" << name << ",年龄:" << age << endl; } }; // 子结构体(派生类):继承 Person struct Teacher : Person { // 默认 public 继承 string subject; // 新增成员 int salary; // 新增成员 void teachInfo() { basicInfo(); // 调用父结构体成员 cout << "授课科目:" << subject << ",薪资:" << salary << endl; } }; int main() { Teacher t1; t1.name = "王老师"; // 访问父结构体成员 t1.age = 35; t1.subject = "数学"; t1.salary = 8000; t1.teachInfo(); return 0; }

五、静态成员(共享数据)

结构体的静态成员属于 “整个结构体”,而非单个对象,所有对象共享该值(如统计结构体对象数量)。

cpp

运行

#include <iostream> #include <string> using namespace std; struct Car { string brand; static int count; // 静态成员:统计创建的汽车数量 // 构造函数:创建对象时计数+1 Car(string b) : brand(b) { count++; } // 静态成员函数:只能访问静态成员 static void showCount() { cout << "已创建 " << count << " 辆汽车" << endl; } }; // 静态成员必须在全局作用域初始化 int Car::count = 0; int main() { Car c1("宝马"); Car c2("奔驰"); Car c3("奥迪"); Car::showCount(); // 输出:已创建 3 辆汽车 cout << "直接访问静态成员:" << Car::count << endl; // 输出:3 return 0; }

六、运算符重载(自定义结构体运算)

重载+==<<等运算符,让结构体支持 “类原生类型” 的运算(如比较、输出)。

cpp

运行

#include <iostream> #include <string> using namespace std; struct Point { int x; int y; // 重载 + 运算符:两个点相加 Point operator+(const Point& other) const { return {x + other.x, y + other.y}; } // 重载 == 运算符:判断两个点是否相等 bool operator==(const Point& other) const { return x == other.x && y == other.y; } }; // 重载 << 运算符:直接输出结构体(全局函数) ostream& operator<<(ostream& os, const Point& p) { os << "(" << p.x << ", " << p.y << ")"; return os; } int main() { Point p1 = {1, 2}; Point p2 = {3, 4}; Point p3 = p1 + p2; cout << "p1 + p2 = " << p3 << endl; // 输出:(4, 6) if (p1 == p2) { cout << "p1 和 p2 相等" << endl; } else { cout << "p1 和 p2 不相等" << endl; // 执行此分支 } return 0; }

七、结构体嵌套(复合数据)

结构体内部可包含其他结构体,实现 “复杂数据模型”(如 “学生” 包含 “地址” 结构体)。

cpp

运行

#include <iostream> #include <string> using namespace std; // 嵌套的子结构体 struct Address { string province; string city; string detail; }; // 主结构体 struct Student { string name; int age; Address addr; // 包含 Address 结构体 void showAll() { cout << "姓名:" << name << ",年龄:" << age << endl; cout << "地址:" << addr.province << "省" << addr.city << "市" << addr.detail << endl; } }; int main() { Student stu; stu.name = "赵五"; stu.age = 20; stu.addr = {"广东", "深圳", "南山区XX路XX号"}; stu.showAll(); // 输出: // 姓名:赵五,年龄:20 // 地址:广东省深圳市南山区XX路XX号 return 0; }

核心总结

C++ 结构体与类的功能几乎完全一致,唯一核心区别是默认访问权限

  • struct:成员默认 public;
  • class:成员默认 private。

实际开发中:

  • 若仅封装 “纯数据”(无复杂行为),优先用 struct;
  • 若需封装 “数据 + 复杂逻辑”(如多态、严格访问控制),优先用 class。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:46:00

AutoGPT实战指南:从目标设定到任务完成的全流程自动化

AutoGPT实战指南&#xff1a;从目标设定到任务完成的全流程自动化 在信息爆炸的时代&#xff0c;知识工作者每天都在与碎片化数据、重复性任务和跨系统操作疲于奔命。一个典型的场景是&#xff1a;你需要为团队准备一份AI行业趋势报告&#xff0c;于是打开浏览器搜索资料、切换…

作者头像 李华
网站建设 2026/4/20 18:23:45

Qwen3-8B vs 其他8B模型:中英文对话性能对比实测

Qwen3-8B vs 其他8B模型&#xff1a;中英文对话性能对比实测 在当前大语言模型高速演进的背景下&#xff0c;一个现实问题日益凸显&#xff1a;我们真的需要动辄上百亿参数的“巨无霸”模型来完成日常任务吗&#xff1f;对于大多数企业、开发者甚至研究团队而言&#xff0c;算…

作者头像 李华
网站建设 2026/4/23 12:10:17

当论文焦虑遇上AI救星:Paperzz如何用“智能协作”重构毕业季的学术生产力——一位工科生的真实复盘与效率革命

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 前言&#xff1a;在deadline边缘挣扎的我们&#xff0c;其实缺的不是努力&#xff0c;而是“正确打开方式”…

作者头像 李华
网站建设 2026/4/19 1:51:59

收藏必备:大模型应用开发全攻略 - 让人人都能成为AI应用开发者

文章提出了一种大模型应用研发框架&#xff0c;通过多智能体系统(MultiAgent System)降低模型应用研发成本和技术门槛&#xff0c;让非专业人员也能开发大模型应用。该框架覆盖从建模、数据准备、模型调试到部署的全流程&#xff0c;实现了研发效率提升和成本下降&#xff0c;推…

作者头像 李华
网站建设 2026/4/18 10:55:53

文件批量重命名”:高效文件更名工具 —— 支持拖入 选文件,可编序号、插字符、替换内容,一键批量改文件名

在日常办公与资料整理中&#xff0c;文件命名杂乱、编号无序往往会大幅降低工作效率 —— 比如摄影素材、文档资料堆积时&#xff0c;手动逐个重命名不仅耗时&#xff0c;还易出现编号错误。大飞哥批量重命名软件正是为解决这一痛点而生的轻量工具&#xff0c;它以简洁直观的界…

作者头像 李华