当前位置: 首页 > 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 引用,函数可能通过此引用修改外部传入的对象。

http://www.lryc.cn/news/540344.html

相关文章:

  • QSNCTF-WEB做题记录
  • UE引擎游戏加固方案解析
  • 统计函数运行时间的python脚本
  • 大模型WebUI:Gradio全解11——使用transformers.agents构建Gradio UI(3)
  • spring boot知识点5
  • 【C++】面向对象的三大特性
  • Docker构建时,设定默认进入的工作目录的方法
  • DeepSeek等大模型功能集成到WPS中的详细步骤
  • 教学资料档案管理系统
  • linux core分析---TLS读取异常
  • SpringBoot 排除一些包的注入
  • PHP Composer:高效项目依赖管理工具详解
  • 第四届图像、信号处理与模式识别国际学术会议(ISPP 2025)
  • 【设计模式精讲】创建型模式之工厂方法模式(简单工厂、工厂方法)
  • python:多重继承、MRO(方法解析顺序)
  • Oracle RAC数据库单节点轮流重启
  • 电脑想安装 Windows 11 需要开启 TPM 2.0 怎么办?
  • Vue 3 中如何注册全局自定义组件:一个 SVG 图标的例子
  • SpringBoot+Vue3-学习笔记
  • 银河麒麟系统安装mysql5.7【亲测可行】
  • 为什么WP建站更适合于谷歌SEO优化?
  • ue----git局域网内部署裸仓库,别的机器进行访问
  • leetcode876.链表的中间结点
  • 旧手机热点无法提供ipv6解决方法(emui 8 热点提供ipv6)
  • 解决DeepSeek服务器繁忙问题的实用指南
  • 新数据结构(12)——代理
  • 记一次一波三折的众测SRC经历
  • Laravel从入门到上云
  • 【小游戏】C++控制台版本俄罗斯轮盘赌
  • 【前端】使用WebStorm创建第一个项目