哪些方法应该是const?

时间:2016-10-01 08:21:05

标签: c++ methods const

应该在类方法上使用const关键字来指示此方法未修改调用对象。但是后者的确切语义是什么?我可以想到三个选项:当且仅当

时,类方法应该是const
  1. (最弱)它不会修改对象商店的位和字节
  2. (更强)它不会修改对象(如1),也不会修改对象拥有的引用对象
  3. (最强)它不会修改对象,也不会修改它引用的任何对象(无论它是否拥有)
  4. 什么是"权利"办法?编程社区是否有共同的共识?

    例如,标准库的容器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。

3 个答案:

答案 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