【问题标题】:Should I declare method "const" if it is "shallow const" only, not "deep const"?如果它只是“浅常量”而不是“深常量”,我应该声明方法“常量”吗?
【发布时间】:2020-10-18 23:58:24
【问题描述】:

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

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

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

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

【问题讨论】:

  • 希望这可以解释:stackoverflow.com/a/37881475/12861639
  • 这里没有普遍的规律来说明类方法应该或不应该在哪里const。这由您决定。
  • 类可以有mutable 成员,const 函数可以 修改。一个函数是否应该是 const 真的取决于它是否是“逻辑上的 const”——不会以任何有意义的可观察方式修改对象。
  • 根据 Herb Sutter 的说法,对于现代 C++,const 也应该对于多线程是健壮的。因此,使用 const 具有可变状态应该是安全逻辑 const 的有力保证。这还需要更多的工作,例如使用原子或互斥保护。
  • @Eljay 至少这通常是一个好主意,因为多线程是一回事。尽管如此,不使组件线程安全可以显着节省成本。

标签: c++ constants shallow-clone


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多