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

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.xdnf.cn/news/18536.html

相关文章:

  • leetcode算法刷题的第十六天
  • 力扣热题之技巧
  • 雷卯针对香橙派Orange Pi 3G-IoT-B开发板防雷防静电方案
  • 云原生、容器及数据中心网络相关名词记录
  • 无人机光伏巡检误检率↓79%!陌讯多模态融合算法在组件缺陷检测的落地优化
  • 为什么存入数据库的中文会变成乱码
  • 浙江龙庭翔新型建筑材料有限公司全屋定制:畅享品质生活新境界!
  • 【小沐学GIS】基于C++绘制三维数字地球Earth(osgEarth、三维瓦片地球)第十期
  • 如何使用和优化SQL Server存储过程:全面指南
  • PETR/PETRv2
  • 从 M4S 到 MP4:用 FFmpeg 轻松合并音视频文件
  • C++矩阵类设计与实现:高效、健壮的线性代数工具
  • 2025年音乐创作大模型有哪些?国内国外模型汇总以及优点分析
  • 5G物联网的现实与未来:CTO视角下的成本、风险与破局点
  • Stm32通过ESP8266 WiFi连接阿里云平台
  • Spring Boot 校验分组(Validation Groups)高级用法全指南
  • 从0到1:数据库进阶之路,解锁SQL与架构的奥秘
  • 32位内部数据通路是什么?
  • 基于llama.cpp的量化版reranker模型调用示例
  • 【golang】制作linux环境+golang的Dockerfile | 如何下载golang镜像源
  • 避开MES实施的“坑”:详解需求、开发、上线决胜点
  • openharmony之启动恢复子系统详解
  • Doxygen是什么?
  • Neural Network with Softmax output|神经网络的Softmax输出
  • 深入剖析Spring Boot应用启动全流程
  • 第七章 利用Direct3D绘制几何体
  • flink常见问题之非法配置异常
  • Hive Metastore和Hiveserver2启停脚本
  • jetson ubuntu 打不开 firefox和chromium浏览器
  • Python 实战:内网渗透中的信息收集自动化脚本(2)