news 2026/4/12 6:40:42

C++ 中的 struct vs class:不是语法差异,而是工程语义的选择

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 中的 struct vs class:不是语法差异,而是工程语义的选择

很多刚学 C++ 的人,都会被一个问题卡住:

👉 struct 和 class 到底有什么区别?
👉 只是默认 public / private 不同吗?

如果只停在“默认权限不同”,那你永远用不好 C++。

真正重要的不是它们能干什么,而是你在表达什么设计意图

一、先给工程结论(一句话)

👉struct 更偏“数据容器 / 数据结构 / 模型载体”
👉class 更偏“对象抽象 / 行为封装 / 业务逻辑 / 模块边界”

不是能力差异,是语义分工

二、语法层面:它们几乎一模一样

在 C++ 中:

struct A { int x; void foo() {} }; class B { int x; void foo() {} };

从语言能力看:

  • 都可以有成员变量
  • 都可以有成员函数
  • 都可以有构造/析构
  • 都可以继承、多态、模板

👉class 能做的,struct 全都能做。

唯一硬性语法差异

1️⃣ 默认访问权限

struct A { int x; // 默认 public }; class B { int x; // 默认 private };

2️⃣ 默认继承方式

struct A : Base {}; // public 继承 class B : Base {}; // private 继承

👉 这就是书上常说的“唯一区别”,但这只是表象

三、为什么 C++ 要同时保留 struct 和 class?

因为 C++ 不是推翻 C,而是:

👉在 C 的内存模型之上,叠加对象模型。

C 语言里只有:

struct Point { int x; int y; };

C++ 选择:

  • 不废掉 struct
  • 而是“升级 struct”

于是:

👉 C 的 struct → C++ 的 struct(可以有函数、构造、多态)

struct 自然成为:

👉“偏数据、偏结构、偏内存模型”的类型入口

而 class 从一开始就是:

👉“偏对象、偏抽象、偏封装”的类型入口

四、真正的分界线:这是“数据”,还是“对象”?

4.1 struct 的典型定位

👉 数据结构
👉 参数对象
👉 DTO / VO
👉 协议包
👉 配置模型
👉 数学结构 / POD 类型

例子:

struct Point { float x; float y; }; struct UserInfo { int id; std::string name; };

特点:

  • 成员基本全 public
  • 很少复杂不变式
  • 职责是“承载数据”

👉 更像 JSON / 协议 / 结构体。

4.2 class 的典型定位

👉 业务对象
👉 模块抽象
👉 引擎组件
👉 管理器
👉 多态基类

例子:

class UserManager { public: void login(int id); void logout(int id); private: std::map<int, User> users_; };

特点:

  • 强封装

  • 明确职责

  • 维护状态合法性

  • 对外暴露行为而不是数据

👉 更像“对象”和“模块”。

五、工程设计准则(非常实用)

✅ 优先用 struct,当:

  • 这是一个“数据模型”
  • 成员天然就是 public
  • 用来传参 / 存储 / 组合
  • 没有复杂行为和约束

👉 目标是:直观、透明、可读。

✅ 优先用 class,当:

  • 这是一个“对象”
  • 需要封装实现
  • 需要保证不变式
  • 需要控制访问边界
  • 承担业务/模块职责

👉 目标是:抽象、隔离、可维护。

六、一个非常典型的工程对比例子

struct:数据载体

struct Config { int port; std::string host; };

👉 像配置文件 / 协议 / DTO。

class:对象抽象

class Server { public: explicit Server(const Config& cfg); void start(); void stop(); private: int port_; std::string host_; };

👉 像模块 / 服务 / 系统组件。

七、和不同语言的对齐理解

C 语言

只有 struct → 一切都是“数据结构”。

Java / Kotlin

只有 class → 一切都是“对象”。

C++

同时保留 struct 和 class:

👉 struct 负责“数据语义”
👉 class 负责“对象语义”

这正是 C++ 既能做系统,又能做框架的根本原因。

八、现代 C++ 中 struct 的真实地位

在现代 C++ 工程中:

  • 各种参数对象
  • STL 的 value_type
  • 协议模型
  • POD / trivial 类型
  • 算法输入输出结构

👉大量使用 struct。

而:

  • 引擎核心
  • 框架边界
  • 管理器
  • 多态体系

👉几乎清一色 class。

九、别再问“用 class 还是 struct”

真正该问的是:

👉“我在表达数据,还是在表达对象?”

  • 数据 → struct
  • 对象 → class

十、一句话总结全文

👉 struct 是“可升级的数据结构”
👉 class 是“完整的对象抽象单元”

语法几乎一样,工程语义完全不同。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 15:43:44

MiDaS快速上手:无需GPU的3D感知解决方案

MiDaS快速上手&#xff1a;无需GPU的3D感知解决方案 1. 技术背景与核心价值 在计算机视觉领域&#xff0c;从单张2D图像中恢复3D空间结构一直是极具挑战性的任务。传统方法依赖多视角几何或激光雷达等硬件设备&#xff0c;成本高且部署复杂。近年来&#xff0c;基于深度学习的…

作者头像 李华
网站建设 2026/3/19 4:48:34

探索埃斯顿量产伺服控制器:从代码到硬件的深度剖析

埃斯顿量产伺服控制器C代码和硬件图纸 1&#xff09;TMS320F28335FPGA全套代码&#xff1b;全C写的DSP代码&#xff0c;VHDL写的FPGA代码(Lattice MXO1200)。 2&#xff09;AD电路图和PCB图&#xff0c;主控板、显示板、驱动板(含1KW、2KW和5KW)&#xff0c;增量式编码器。 3&a…

作者头像 李华
网站建设 2026/4/9 0:49:11

AI视觉新工具:MiDaS深度估计模型使用教程

AI视觉新工具&#xff1a;MiDaS深度估计模型使用教程 1. 引言&#xff1a;让AI“看见”三维世界 在计算机视觉领域&#xff0c;如何从一张普通的2D图像中感知真实世界的三维结构&#xff0c;一直是极具挑战性的任务。传统方法依赖双目立体视觉或多传感器融合&#xff0c;而近…

作者头像 李华
网站建设 2026/3/31 8:14:32

【Java毕设全套源码+文档】基于springboot的个性化课程推荐系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/8 9:35:11

【Java毕设全套源码+文档】基于springboot的学院摄影社团管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/9 18:36:29

深度估计技术实战:MiDaS模型参数调优全指南

深度估计技术实战&#xff1a;MiDaS模型参数调优全指南 1. 引言&#xff1a;单目深度估计的现实挑战与MiDaS的破局之道 在计算机视觉领域&#xff0c;从单张2D图像中恢复3D空间结构一直是极具挑战性的任务。传统方法依赖多视角几何或激光雷达等硬件支持&#xff0c;成本高且部…

作者头像 李华