news 2026/11/2 19:06:01

结构体的初认识

作者头像

张小明

前端开发工程师

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/11/2 23:01:17

当AI成为你的学术副驾驶:PaperZZ如何在不越界的前提下,帮你把毕业论文从“焦虑源”变成“高光时刻”——一个工科生的真实复盘与深度体验

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 引言&#xff1a;写论文不是一个人的战斗&#xff0c;但你得先找到靠谱的队友 凌晨两点&#xff0c;屏幕幽…

作者头像 李华
网站建设 2026/11/3 8:03:19

paperzz AI 文献综述藏的 “学术懒癌救星”:从文献堆里扒逻辑,3000 字拆透它的 “轻量学术辅助”

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 文献综述https://www.paperzz.cc/journalsReviewed 写文献综述大概是学术写作里最 “磨人” 的环节&#xff1a;翻几十篇文献却理不清脉络、相同观点重复堆砌、研究缺口找不准…… 当 “熬夜扒…

作者头像 李华
网站建设 2026/11/2 14:27:48

LobeChat部署常见错误汇总及解决方案(新手避坑指南)

LobeChat部署常见错误汇总及解决方案&#xff08;新手避坑指南&#xff09; 在如今大语言模型&#xff08;LLM&#xff09;快速普及的背景下&#xff0c;越来越多开发者希望将强大的AI能力落地为实际可用的聊天助手。但现实往往是&#xff1a;模型跑得起来&#xff0c;前端却连…

作者头像 李华
网站建设 2026/11/2 5:32:48

【机器学习Rademacher复杂度

目录 1. 引言 2. Rademacher 复杂度是什么 2.1 基本定义与数学表达 2.2 直观理解 3. Rademacher 复杂度的理论性质 3.1 上界性质 3.2 次加性 3.3 缩放性 4. Rademacher 复杂度的计算与估计 4.1 蒙特卡洛估计方法 4.2 常见函数类的复杂度上界 5. Rademacher 复杂度的…

作者头像 李华
网站建设 2026/11/3 2:04:34

LobeChat自动补全与流式输出体验优化技巧分享

LobeChat自动补全与流式输出体验优化技巧分享 在构建现代AI对话系统时&#xff0c;用户对“响应速度”和“交互自然度”的期待早已超越了简单的问答功能。我们不再满足于点击发送后等待几秒才看到整段回复——那种体验像是在和一台缓慢加载的终端通信&#xff0c;而非与一个智能…

作者头像 李华
网站建设 2026/11/2 12:32:29

HuggingFace镜像网站加速下载Qwen3-8B实战经验分享

HuggingFace镜像网站加速下载Qwen3-8B实战经验分享 在大模型开发的日常中&#xff0c;最让人抓狂的瞬间之一莫过于&#xff1a;你兴致勃勃地打开终端&#xff0c;准备加载最新的 Qwen3-8B 模型做一次推理实验&#xff0c;结果 from_pretrained 卡在“Downloading”状态&#x…

作者头像 李华