【问题标题】:Am I abusing `const`?我在滥用`const`吗?
【发布时间】:2011-05-07 03:56:36
【问题描述】:

最近几周,我发现自己到处都在使用很多 const。不仅在方法或参数声明中,甚至在临时变量中也是如此。

让我用一个简单的函数来说明。

我曾经写过:

// A dummy function that sums some computation results
unsigned int sum_results(const Operation& p1, const Operation& p2)
{
  unsigned int result1 = p1.computeResult();
  unsigned int result2 = p2.computeResult();

  // Well this function could be in one single line but
  // assume it does more complex operations
  return result1 + result2;
}

但现在更像是:

// A dummy function that sums some computation results
unsigned int sum_results(const Operation& p1, const Operation& p2)
{
  const unsigned int result1 = p1.computeResult();
  const unsigned int result2 = p2.computeResult();

  // Well this function could be in one single line but
  // assume it does more complex operations
  return result1 + result2;
}

后者对我来说更有意义,而且似乎不太容易出错。 (我承认在这个例子中,这并不重要)但是我见过 很少 代码示例,其中 const 用于临时/局部变量。我想知道为什么。

这不是常见的情况有什么原因吗?我滥用const 吗?还是只有我看错了样本?

【问题讨论】:

  • int in unsigned int 没有提供新的或有用的信息,您应该删除不必要的噪音。

标签: c++ variables constants


【解决方案1】:

我不认为这纯粹是程序员懒惰的情况 - 简洁也是一个考虑因素。有些人可能会发现int x; 的精神负担比“const int x;”要少。在查看函数时:那一点额外的空间可能会帮助他们在旁边添加评论。我提到这不是作为建议,而是因为我认为了解影响人们态度的所有“成本”很重要,因为人们在这里并不始终使用 const 确实令人困惑。

考虑到在某个时候在函数中使用变量时,可能需要对其进行调整,这也很有趣。例如,你计算了一些东西,但是你进入了一些 if 语句和一些东西,并且有一些边缘情况,你需要从字符串中删除一个尾随元素,处理一个非一个问题,清除值等。如果您最初创建了变量 const,那么您的工作流程将被更多地中断以返回并从定义中删除 const,然后将光标返回到您正在工作的位置。与此相反,尽可能使用 const 的习惯是一个危险信号,一些此类调整隐藏在函数体中,非常对以后的理解和维护很有用。

不过,我仍然积极鼓励您继续使用 const:我通常这样做并认为它是最佳实践。原因显然你已经理解,并且已经在其他答案中列举出来了。

【讨论】:

    【解决方案2】:

    这样做并没有错误,但是当你知道一个对象不应该被修改时,你可以使用 const 让编译器帮助你强制执行一个约束。如果您不关心对象是否被修改,那就是多余的。

    【讨论】:

    • 即使这个虚拟示例、result1result2 都不会被修改。他们持有一个不应该改变的价值。只要我可以使我的代码不易出错,我不介意有更多的击键。
    • "result1 或 result2 也不应该被修改。它们持有一个不应该改变的值" 那么它们应该是 const。我的观点只是你这样做是有原因的,如果你知道这个原因,你就不会觉得自己在滥用任何东西。
    【解决方案3】:

    我个人会说,const 永远不会太多,我大量使用它们作为局部变量。我可以添加const但不能添加的唯一上下文是内置类型的参数:

    void foo(const int);

    在这里,我相信(但这确实是个人喜好问题)它会毫无用处地弄乱界面。

    【讨论】:

      【解决方案4】:

      以我的拙见,您应该抓住一切机会利用强类型语言的编译器。我将const 用于临时、局部变量、不可变引用等。

      Const Correctness C++ FAQ 可能有更多有用的信息。

      【讨论】:

        【解决方案5】:

        在 C++ 中,如果可以的话,这是一个很好的组合变量的方法。但是话虽如此,这在变量作为参数传递或在不同代码段(如类变量)之间共享的情况下更有意义。主要思想是阻止其他不知道该变量不应该更改的代码对变量的意外修改。

        因此,鉴于上述情况,对于函数的局部变量,将它们构造为一种矫枉过正的做法。但是,这样做并没有什么害处。

        【讨论】:

          【解决方案6】:

          这实际上与很少使用断言的原因相同。接口上的const 是强制性的,实现上的const 是自愿的。程序员很懒。

          编辑:以防万一不清楚,您的方法更好。

          【讨论】:

            【解决方案7】:

            在局部变量上使用const 可以提高代码的清晰度,所以这是个好主意。您看到const 并且您立即知道该变量在以后的范围内永远不会更改。它与使函数简短化和returning early 来自同一系列。

            开发人员很懒惰 - 他们经常认为这是一个无用的词,不会改变任何事情。 IMO 他们错了。

            【讨论】:

            • +1。将 const 放在不会更改(或不应更改)的局部变量上可以在错误发生之前(在编译时)捕获错误,并清楚地向下一个必须查看您的代码的程序员显示您的意图。
            • 但它会导致更好的性能或编译器更好的优化。
            • @DumbCoder:也许吧,但不太可能。现代编译器非常擅长优化代码。如果有人真的关心,他们应该同时尝试并检查发出的机器代码。
            • @DumbCoder:极不可能,CLang 和 gcc 都使用 SSA 表示,因此知道变量是否曾经更改。但是它向编译器表明了意图,因此稍后尝试访问它会引发错误并迫使开发人员考虑它是否合适。
            猜你喜欢
            • 2018-04-26
            • 2018-06-14
            • 2015-07-30
            • 2014-10-30
            • 2011-05-31
            • 2016-07-03
            • 2015-03-29
            • 2014-03-31
            • 1970-01-01
            相关资源
            最近更新 更多