成员函数定义后面加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 引用,函数可能通过此引用修改外部传入的对象。