C++中的Const函数和接口

58g*_*h1z 3 c++ interface const-correctness member-functions

我将使用以下(普通)接口作为示例:

struct IObject
{
  virtual ~IObject() {}

  virtual std::string GetName() const = 0;
  virtual void ChangeState() = 0;
};
Run Code Online (Sandbox Code Playgroud)

逻辑规定GetName应该是const成员函数,而不ChangeState应该.

到目前为止,我见过的所有代码都没有遵循这个逻辑.也就是说,GetName在上面的例子中不会被标记为const成员函数.

这种懒惰/粗心大意还是有正当理由的?const在逻辑上要求我强制客户实现成员函数的主要缺点是什么?


编辑:感谢您的回复.我认为这几乎是一致的:懒惰/无知是我所看到的原因.

Tho*_*mas 9

我认为这是懒惰/粗心.GetName()应该对对象的状态没有影响,合同IObject应该明确说明这个事实.

如果继承类以某种方式被迫GetName()产生(隐藏!)副作用,它们总是可以将相应的字段声明为mutable.

  • 我认为人们忘记了'const'并不意味着对象的内部状态应该改变,但外部状态应该没有.我应该能够存储一个实例的副本,调用const函数,原始和副本仍应比较相等.假设平等实际上意味着其他任何事情都可以改变 (2认同)

sbi*_*sbi 5

这种懒惰/粗心大意还是有正当理由的?

前者.如果你真的没有看到任何代码做到这一点,立即获得一份新工作.

const在逻辑上要求我强制客户实现成员函数的主要缺点是什么?

它允许编译器在编译时发现常见错误.(没有比在编译时发现的错误更好的了.桌面上发生故障的所有内容都不会在客户端站点失败.)


十多年前,在我加入一家新公司并在他们的一个项目中进行黑客攻击后不久,我发现一个应该没有的方法const,阻止我的一些const正确的代码进行编译.我考虑过把我const扔掉然后继续前进,但我不能自己带来这样做.
所以我创建了这个方法const- 只是为了发现它调用了其他方法,它们也应该是const,但也不是.所以我也改变了它们 - 只是为了发现......
最后,我花了好几天时间搜索所有项目,const左右添加.
同事们嘲笑我 - 直到我向他们展示了由于我添加而编译器发现的一些错误const.有趣的是,在此之后,没有人花费时间进行彻底调查的一些长期存在的错误也不再具有可再现性.

  • +1对于非常规正确的代码,没有什么比修复const修正更正确的灵魂破坏了. (7认同)
  • 我希望我能为战争故事再给你+1. (2认同)