const成员变量和成员函数
  • 在类成员函数后面加const关键字用于声明const成员函数,它不能改变类的成员变量,也不能调用该类中普通的成员函数,最好不要涉及非const的成员变量

  • const成员变量只能通过成员列表初始化进行初始化,任何成员函数均不能改变它的值

  • 只能调用const成员函数访问const对象,那是它的唯一对外接口

  • 若不希望传入的实参对象被修改,应该将形参定义为const的指针变量或者引用

const成员函数的定义是这样形式:

1
int getConst() const;

前面不用加const了,否则会有报警:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Base
{
public:
void setM(int M) //setter都不能加const
{
m = M;
}
int getM() const
{
return m;
}
private:
int m;
}

const Base b;
b.setM(2);

getM就是常量成员函数,如果给setM加const,那么就会报错,因为它修改m的值。定义的常对象b只能调用getM,调setM会报错。


问题

1
2
3
4
5
6
7
8
9
10
template <typename T>
void registerNav2Action(const BT::BehaviorTreeFactory& factory, const string& action_name, const T& nav2_action)
{
BT::NodeBuilder builder =
[](const std::string & action_name, const BT::NodeConfig & config)
{
return std::make_unique<T>(action_name, config);
};
factory->registerBuilder<T>(action_name, builder);
}

代码会报错: error: passing ‘const xxx’ as ‘this’ argument discards qualifiers

在一个加了const限定符的成员函数中,调用了非const成员函数,报错的意思就是缺少限定符。

factory作为const引用,调用了非const函数 BehaviorTreeFactory::registerBuilder,所以报错