news 2026/3/21 8:11:08

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/3/15 11:25:04

从文本到结构化信息|利用AI智能实体侦测服务实现人名地名自动抽取

从文本到结构化信息&#xff5c;利用AI智能实体侦测服务实现人名地名自动抽取 在当今信息爆炸的时代&#xff0c;非结构化文本数据&#xff08;如新闻、社交媒体、公文、邮件&#xff09;占据了企业与机构数据总量的80%以上。如何从中高效提取关键信息&#xff0c;成为提升自动…

作者头像 李华
网站建设 2026/3/15 11:10:40

AI感知新工具:MiDaS深度估计模型使用指南

AI感知新工具&#xff1a;MiDaS深度估计模型使用指南 1. 引言&#xff1a;AI 单目深度估计的现实意义 在计算机视觉领域&#xff0c;从单张2D图像中恢复3D空间结构一直是极具挑战性的任务。传统方法依赖多视角几何或激光雷达等硬件设备&#xff0c;成本高且部署复杂。近年来&…

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

单目视觉深度估计MiDaS:环境配置指南

单目视觉深度估计MiDaS&#xff1a;环境配置指南 1. 引言 1.1 AI 单目深度估计 - MiDaS 在计算机视觉领域&#xff0c;从单张二维图像中恢复三维空间结构一直是极具挑战性的任务。传统方法依赖多视角几何或激光雷达等硬件支持&#xff0c;而近年来&#xff0c;基于深度学习的…

作者头像 李华
网站建设 2026/3/17 13:52:13

基于MiDaS的深度估计:部署与实战案例

基于MiDaS的深度估计&#xff1a;部署与实战案例 1. 引言&#xff1a;AI 单目深度估计的现实意义 在计算机视觉领域&#xff0c;从单张2D图像中恢复3D空间结构一直是极具挑战性的任务。传统方法依赖多视角几何或激光雷达等硬件设备&#xff0c;成本高且部署复杂。近年来&…

作者头像 李华
网站建设 2026/3/18 13:42:19

信息抽取效率翻倍提升|AI 智能实体侦测服务技术揭秘

信息抽取效率翻倍提升&#xff5c;AI 智能实体侦测服务技术揭秘 在当今信息爆炸的时代&#xff0c;非结构化文本数据&#xff08;如新闻、社交媒体、企业文档&#xff09;呈指数级增长。如何从海量杂乱文本中快速、准确地提取关键信息&#xff0c;成为自然语言处理&#xff08…

作者头像 李华
网站建设 2026/3/16 3:05:22

Windows用户必看:绕过CUDA安装直接玩AI分类器

Windows用户必看&#xff1a;绕过CUDA安装直接玩AI分类器 引言 作为一名Windows用户&#xff0c;你是否曾经被AI开发中的CUDA配置折磨得焦头烂额&#xff1f;那些复杂的Linux命令、版本冲突问题和漫长的安装过程&#xff0c;让很多想尝试AI开发的Windows用户望而却步。今天我…

作者头像 李华