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

成员函数定义后面加const是什么功能:C++中const成员函数的作用

成员函数定义后面加const是什么功能:C++中const成员函数的作用

  • 前言
  • C++中const成员函数的作用
  • 总结

在这里插入图片描述

前言

在PX4的代码中的位置控制模块中,有这样一个成员函数

void getAttitudeSetpoint(vehicle_attitude_setpoint_s &attitude_setpoint) const;

该函数的功能是:在位置控制器经过更新后得到了期望的油门向量,通过这个函数转换为期望姿态值。

可以看到函数的声明和定义时,后面都加了一个const关键字在这个地方这个关键字是做什么用的呢?

在C++中,成员函数后的 const 关键字表示该函数是常量成员函数。

C++中const成员函数的作用

在C++中,成员函数后的 const 关键字表示该函数是常量成员函数,其作用如下:

1、不可修改对象状态

  • const 成员函数承诺不会修改类的非静态成员变量(除非成员被 mutable 修饰)。
  • 在函数内部尝试修改成员变量会导致编译错误(除非变量是 mutable 的)。

2、允许在const 对象上调用

  • 只有 const 成员函数才能被 const 对象调用。例如:
const PositionControl controller;
controller.getAttitudeSetpoint(...);  // 正确:调用 const 成员函数
PositionControl controller;
controller.getAttitudeSetpoint(...);  // 正确:非const对象也可以调用 const 成员函数
  • 非 const 成员函数无法在 const 对象上调用。
const PositionControl controller;
controller.setInputSetpoint(...);  // 错误:const对象只能调用 const 成员函数,而setInputSetpoint为非const 成员函数

3、 明确设计意图

  • 函数名后的 const 明确告知调用者:此函数仅用于查询或获取数据,不会改变对象内部状态。
  • 在示例中,getAttitudeSetpoint 用于获取姿态设定点,而非修改控制器状态,因此标记为 const 是合理的。

4、参数与 const 的关系

  • 示例中的参数 vehicle_attitude_setpoint_s &attitude_setpoint 是一个非 const 引用,函数可能通过此引用修改外部传入的对象。

  • 但函数本身的 const 仅约束对类内部状态的修改,不影响参数的行为。

总结

const 成员函数是 C++ 的常量正确性(const-correctness)机制,确保函数:

  • 不意外修改对象状态。
  • 可在 const 上下文中安全使用。
  • 提升代码可读性和安全性。

在示例中,getAttitudeSetpoint 用于获取姿态设定点,而非修改控制器状态,因此标记为 const 是合理的。

示例中的参数 vehicle_attitude_setpoint_s &attitude_setpoint 是一个非 const 引用,函数可能通过此引用修改外部传入的对象。

相关文章:

  • DP-最长上升子序列
  • 【git】提交修改、回撤、回滚、Tag 操作讲解,与reset (--soft、--mixed、--hard) 的区别
  • sharpGL的openGL兼容性
  • Python的那些事第二十七篇:Python中的“数据魔法师”NumPy
  • 安利:外文文献翻译插件
  • Eclipse自动排版快捷键“按了没有用”的解决办法
  • 正则表达式–断言
  • 前端导出word文件,并包含导出Echarts图表等
  • 影刀RPA中级证书-Excel进阶-开票清单
  • 开放表格式和对象存储架构指南
  • MySQL系列之身份鉴别(安全)
  • 分巧克力(二分查找)
  • flutter在安卓模拟器上运行
  • ECMAScript6------数组扩展
  • 某手sig3-ios算法 Chomper黑盒调用
  • DeepSeek_部署
  • 单例模式【C++设计模式】
  • Python time模块和datatime模块的区别
  • 谷粒商城—分布式高级②.md
  • 文字识别软件cnocr学习笔记
  • 五粮液一季度净利增长5.8%,今年营收与宏观经济指标保持一致
  • 美联储官员:货币政策不会立即改变,金融市场波动或致美国经济增长承压
  • 博物馆有一项活动40岁以上不能参加?馆方回应
  • 牛市早报|商务部:目前中美之间未进行任何经贸谈判
  • 南宁市委常委、组织部部长陈川已任广西医科大学党委书记
  • 全国党委和政府秘书长会议在京召开,蔡奇出席并讲话