【问题标题】:Do I always have to declare any method that doesn't affect instance state, as const?我是否总是必须将任何不影响实例状态的方法声明为 const?
【发布时间】:2014-10-02 23:48:02
【问题描述】:

我有一个具有以下方法的类:

int getLength() {
    return length;
}

(这个类叫做String,我定义它是为了练习)。

当我尝试编译时,我收到一条关于调用此方法的代码行的错误:

passing 'const String' as 'this' argument of int String::getLength() discards qualifiers.

在这个网站上的搜索让我意识到我需要在方法声明中添加const。它解决了问题。

我的问题:

我是否总是必须将任何不影响实例状态的方法声明为const?如果我不这样做,我会收到编译时错误吗?看起来很奇怪。

如果我不必总是这样做,那么当我必须将方法声明为 const 时会发生什么情况?

【问题讨论】:

  • 如果您发布错误消息,最好同时发布错误消息所引用的源代码行(+context)。正如您自己所说的那样,错误不会发生因为您将方法声明为非常量,但因为您在非常量对象/引用上使用它。

标签: c++ class constants


【解决方案1】:

编译器错误不是由方法引起的,而是由您调用它的实例的类型引起的。您尝试在 const 对象 (const String) 上调用非常量方法或引用 const 对象 (const String&)。这被编译器理所当然地拒绝了。

而且,是的,您应该将逻辑上为const 的所有方法标记为const

【讨论】:

  • 哦,我明白了。事实上,我在 const String& 对象上调用了这个方法。谢谢
  • @AvivCohn:这种说法不正确。对象永远不是引用。您在 const String 类型的值(特别是左值)上调用方法,大概是通过评估参考变量或右值获得的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 2018-03-15
  • 2019-07-01
  • 2012-05-23
  • 2013-02-04
  • 2013-06-28
  • 1970-01-01
相关资源
最近更新 更多