news 2026/2/4 11:24:34

结构体的初认识

作者头像

张小明

前端开发工程师

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/2/3 6:39:33

「学术协作者图谱」:PaperZZ领衔的9款AI毕业论文辅助工具全景测评——以“认知脚手架”为轴心的功能解构与伦理适配指南

——不是工具清单&#xff0c;而是一张帮你定位自身学术需求坐标的“认知导航图” 引子&#xff1a;我们不需要更多“代写广告”&#xff0c;需要一张“认知适配地图” 在2025年的高校图书馆里&#xff0c;一个有趣的现象正在发生&#xff1a; ——有人用语音口述半小时&#…

作者头像 李华
网站建设 2026/1/27 4:17:47

transformer模型详解:以Qwen3-32B为例剖析架构设计

Transformer模型架构深度解析&#xff1a;以Qwen3-32B为实践范本 在当前大模型技术快速演进的背景下&#xff0c;一个现实问题正日益凸显&#xff1a;如何在有限算力条件下&#xff0c;实现对复杂任务的高质量推理与长文本精准理解&#xff1f;这不仅是企业部署AI系统的成本考量…

作者头像 李华
网站建设 2026/2/2 23:44:35

清华源加速下载Qwen3-8B模型文件及依赖组件

清华源加速下载Qwen3-8B模型文件及依赖组件 在大模型落地越来越频繁的今天&#xff0c;开发者最常遇到的问题之一并不是“怎么训练”&#xff0c;而是——怎么把模型快速、完整地下载下来&#xff1f; 尤其是像 Qwen3-8B 这样参数量达80亿、模型文件动辄十几GB的轻量级大模型…

作者头像 李华