【问题标题】:A few questions about const methods in my class [duplicate]关于我课堂上的 const 方法的几个问题[重复]
【发布时间】:2015-07-06 17:49:09
【问题描述】:

我刚开始在公司使用 C++ 编写企业软件,在成员函数中使用 const 让我很困惑。比如我有以下方法:

string DAC::impulse_find(int i)

变量 i 不会被修改。当我使用将 const 添加到上述方法的这三种变体时,我的代码编译完美:

const string DAC::impulse_find(const int i) const

const string const DAC::impulse_find(const int i) const

string const DAC::impulse_find(const int i) const

那么这三者之间究竟有什么区别呢?我查看了一些过去的答案并说“它适用于左边的任何东西”,但这仍然令人困惑。它是否适用于任何东西,例如类的名称?

【问题讨论】:

  • 返回一个不是引用的常量变量是没有价值的。不需要const,因为该函数会返回一个副本。
  • 你可以改用const string& DAC::impulse_find(int i) const
  • 当您不知道const 的词法规则时,您似乎不太可能编写“用C++ 编写的企业软件”... 此外,通过猜测进行编程也行不通。你用哪本书来学习 C++?
  • @TheSalamander “我不擅长学习”这是对您在此处阅读的内容的相当荒谬的看法。
  • @TheSalamander 我们只是不明白您为什么要尝试将 const 修饰符添加到返回值。返回值是一个临时副本,也就是说你无论如何都不能修改它

标签: c++ constants


【解决方案1】:

没有区别

const std::string  
std::string const

const 的顺序无关紧要,因为您不处理指针。

将许多 const 作为限定符是没有意义的。您是否将编译器的警告级别调到最大?

编辑 1:指针和常量
由于您要返回变量的副本,const 的有效性毫无价值。无法修改函数中的原始项目,因为您要返回副本。

也许你对 pointer 语法感到困惑,const 的位置很重要:

string const * const -- constant pointer to a constant (read-only string).  Pointer cannot be modified.
string const *       -- Mutable pointer to a constant (read-only) string.  Pointer value can change.
string       * const -- Constant pointer to a read/write string.  Pointer value cannot be changed.
string       *       -- Mutable pointer to a read/write string.  Pointer value can be changed.  

只读数据的const可以放在类型之前或之后:

const string *  
string const *

以上两者是等价的。

【讨论】:

  • 谢谢!这帮助很大。
  • @TheSalamander:如果答案有帮助,请点击复选标记。
【解决方案2】:

三个版本

const string …
const string const …
string const …

相同

const 的位置在这里无关紧要。第二个版本中重复的const 是多余的,你的编译器应该给出警告。

此外,consts 在这里没有意义,因为字符串返回作为副本。返回 const 值不会给您带来任何好处(请参阅 KABoissonneault 的评论),只有 引用或指针const 的返回类型才有意义。

【讨论】:

  • 当我使用第二个版本时,Visual Studio 2010 编译器没有给我任何警告。
  • 这是 GCC 主干的错误。 MSVS 在这里可能是非标准的宽松。
  • @TheSalamander 那么我强烈建议您打开所有警告以帮助编写更好的代码。
  • [C++14: 7.1.6.1/1]: [..] 每个 cv-qualifiercv-qualifier- 中最多出现一次序列[..]
猜你喜欢
  • 2020-08-01
  • 1970-01-01
  • 2016-01-09
  • 2019-01-03
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 2016-08-02
  • 2021-11-08
相关资源
最近更新 更多