当前位置: 首页 > news >正文

C++的struct里面可以放函数,讨论一下C++和C关于struct的使用区别

我们来看一个C++代码下面的struct结构体:

struct UserValue {float lx;float ly;float rx;float ry;float L2;// 【构造函数】UserValue() {setZero();}// 【成员函数】void setZero() {lx = 0;ly = 0;rx = 0;ry = 0;L2 = 0;}
};

在这篇文章中,我们将来详细解释一下为什么 UserValue 结构体里面还能放函数,以及这是怎么工作的。


1. C++ 结构体和类的关系

这一个代码是 C++ 语法,不是传统 C 语言。

  • 在 C 语言里struct 只能放变量(成员),不能放函数,因为 C 语言不支持面向对象。
  • 在 C++ 里struct 本质上和 class 是一样的,唯一的区别是:
    • struct 默认的成员访问权限是 public
    • class 默认的成员访问权限是 private
  • 因此,C++ 的 struct 同样可以包含:
    • 成员变量(数据)
    • 成员函数(方法)
    • 构造函数 / 析构函数
    • 运算符重载
    • 静态成员
    • 甚至还能有继承、模板等特性

所以,在 C++ 里,struct 可以写函数并不奇怪。


2. 代码分析

struct UserValue {float lx;float ly;float rx;float ry;float L2;// 【构造函数】UserValue() {setZero();}// 【成员函数】void setZero() {lx = 0;ly = 0;rx = 0;ry = 0;L2 = 0;}
};
  • UserValue()构造函数
    当你创建一个 UserValue 对象时,这个函数会自动执行,这里是调用 setZero() 来把所有变量置为 0。

  • setZero()普通成员函数
    你可以在对象创建后手动调用它,比如:

    UserValue uv;
    uv.setZero(); // 手动清零
    

3. 运行过程举例

int main() {UserValue uv; // 会自动调用 UserValue() 构造函数// 构造函数里调用 setZero() -> 所有成员 = 0
}

过程顺序:

  1. UserValue uv; 触发构造函数 UserValue()
  2. 构造函数内部调用 setZero()
  3. setZero()lx, ly, rx, ry, L2 全部清零

4. 为什么把函数放在结构体里

这样做的好处是 数据和操作绑定在一起,符合面向对象(OOP)思想:

  • 数据 (lx, ly, rx, ry, L2)
  • 操作(setZero、构造函数)

代码更 模块化,方便使用和维护。


总结

  • C++ 里,structclass 并无本质区别,因此可以包含函数。
  • 构造函数让对象在创建时自动执行初始化。
  • 把函数放在结构体里可以让数据和操作绑定,更易用。
http://www.dtcms.com/a/347661.html

相关文章:

  • 基于TimeMixer现有脚本扩展的思路分析
  • 网络参考模型操作指南
  • 大数据接口 - 企业风险报告(专业版)API接口文档
  • 【Vue✨】Vue 中的 diff 算法详解
  • Compose笔记(四十七)--SnackbarHost
  • 14.Shell脚本修炼手册--玩转循环结构(While 与 Until 的应用技巧与案例)
  • 使用sys数据库分析 MySQL
  • 2015-2018年咸海流域1km归一化植被指数8天合成数据集
  • 【大模型应用开发 4.RAG高级技术与实践】
  • LeetCode算法日记 - Day 20: 两整数之和、只出现一次的数字II
  • 《P3623 [APIO2008] 免费道路》
  • Java22 stream 新特性 窗口算子 与 虚拟线程map操作:Gatherer 和 Gatherers工具类
  • 告别静态网页:我用Firefly AI + Spline,构建次世代交互式Web体验
  • 学习Java24天
  • React学习(十二)
  • IDEA相关的设置和技巧
  • C语言第十一章内存在数据中的存储
  • Redis资料
  • JAVA读取项目内的文件或图片
  • springboot项目结构
  • Axure:如何打开自定义操作界面
  • 顺序表(ArrayList)
  • 刷题日记0823
  • [特殊字符] 数据库知识点总结(SQL Server 方向)
  • MySQL:事务管理
  • games101 作业0 环境搭建与熟悉线性代数库
  • H264编解码过程简述
  • 数据结构 -- 哈希表
  • RAGFlow (一) 开发环境搭建
  • imx6ull-驱动开发篇37——Linux MISC 驱动实验