应该在类方法上使用const
关键字来指示此方法未修改调用对象。但是后者的确切语义是什么?我可以想到三个选项:当且仅当
什么是"权利"办法?编程社区是否有共同的共识?
例如,标准库的容器const语义明显满足至少2个。另一方面,奇怪的是,std :: unique_ptr的* -operator甚至不满足2:它是const但是返回对指向对象的非const引用,尽管该对象是std :: unique_ptr对象所拥有的按照定义。
另一个例子:
class X
{
private:
int& intref;
public:
X(int& intref): intref(intref) {};
void modifyRef(int& another) const
{
this->intref = another;
}
};
在2之后,方法上的const是可以的,因为intref引用了不属于对象的东西。在3之后,应该删除const。
答案 0 :(得分:2)
这三者都没有。
请记住,C ++ const
表示逻辑常量,而不是物理常量。
当然,如果对象被声明为常量,您可能只修改mutable
成员,但除此之外,您只需要保留逻辑状态。
那么,您的方法是否会更改对象的逻辑状态?
答案 1 :(得分:1)
0级(逻辑常量)允许您不透明地修改对象状态。
考虑一个Cache
类的示例,该类具有find()方法,并且在本地地图中找到一个元素,无法在本地地图中找到它继续并在DB中搜索等等。最后用检索到的值更新它的本地地图。
find()
类中的Cache
方法可以是const,它将为类提供更清晰的接口。类的用户不会受到元素检索的内部机制的困扰。
您提供的示例不满足logical const-ness
答案 2 :(得分:0)
这是一个很好的参考,作为我的问题的答案,补充其他答案: https://isocpp.org/wiki/faq/const-correctness