如果方法“const”只是“浅常量”,而不是“深常量”,我应该声明它吗?

IBa*_*hov 2 c++ constants shallow-clone

我有类Foo,它的成员bar_是指向某些数据的指针。方法modify修改数据,但不修改指针本身。因此我可以将该方法声明为const

class Foo {
public:
    Foo() : bar_(new double) {};
    void modify() const {*bar_ += 1;};
private:
    double *bar_;
};
Run Code Online (Sandbox Code Playgroud)

如果我将该方法声明为const,则可以从其他 const 方法访问它,这更加灵活。同时,我可以删除const作为其他开发人员和用户的提示,该方法间接修改数据(并认为数据归类所有)。所以我在这里有一个选择:声明modifyconst或删除const :void modify() constvoid modify().

每种方法的优缺点是什么?指导方针怎么说?我该怎么办?

rus*_*tyx 6

const在方法声明之后是意图声明 -const方法意味着是幂等的;它们不会修改对象的状态,并且可以在const实例上调用。

如果指向的值bar_是对象状态的一部分,则const方法不应修改它。

此外,即使名称modify()听起来像是以某种方式修改了对象,因此不应声明const

但另一种方式也很重要——如果一个方法不修改状态,建议声明它const(参见 C++ Core Guideline Con.2)。