最近几周,我发现自己到处都使用了很多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
而滥用?或者只是我一直在查看错误的样本?
答案 0 :(得分:21)
在局部变量上使用const
可以提高代码清晰度,因此这是一个好主意。您看到const
并且您立即知道该变量后来在范围内永远不会更改。它与使函数简短和returning early。
开发人员很懒惰 - 他们常常认为这是一个无用的词,不会改变任何东西。 IMO他们错了。
答案 1 :(得分:5)
这实际上与断言很少使用的原因相同。接口上的const
是必需的,实现中的const
是自愿的。程序员很懒惰。
编辑:如果不清楚,你的方法会更好。
答案 2 :(得分:3)
我个人会说,const
永远不会太多,我会大量使用它们来表示局部变量。我可以添加const
的唯一上下文但不是内置类型的参数:
void foo(const int);
在这里,我相信(但这确实是个人品味的问题),它无意中使界面变得混乱。
答案 3 :(得分:2)
我不认为这纯粹是程序员懒惰的情况 - 简洁也是一个考虑因素。有些人可能会发现int x;
心理负荷低于“const int x”;在审查功能时:这个额外的空间可能有助于他们同时发表评论。我提到这不是一个建议,而是因为我认为理解影响人们态度的所有“成本”是很重要的,因为人们不会在这里一直使用const,实在令人困惑。
考虑到在函数中使用变量的某些时候,可能有必要调整它。例如,你计算一些东西,但是你会进入一些if语句和东西,并且有一些边缘情况,你需要从字符串中删除尾随元素,处理一个逐个问题,清除值等。如果您最初创建了变量const,那么您的工作流会中断更多以返回并从定义中删除const,然后将光标返回到您正在工作的位置。对此,在可能的情况下使用const的习惯是一个红色标记,一些这样的调整隐藏在函数体中,非常对以后的理解和维护很有用。
尽管如此,我仍然积极鼓励你继续使用const:我通常这样做并认为是最佳实践。您明白了解其中的原因,并在其他答案中列举过。
答案 4 :(得分:1)
这样做没有错误,但是当你知道不应该被修改时,你可以使用const来帮助你强制执行约束。如果对象被修改,则 care ,而不是多余的。
答案 5 :(得分:1)
在C ++中,如果可以的话,这是一个很好的方法来构造变量。但是说到这一点,在变量作为参数传递或者在不同的代码片段(如类变量)之间共享的情况下,这更有意义。主要思想是阻止其他代码意外修改变量,而这些代码并不知道这个变量不会被改变。
因此,鉴于上述情况,对于函数的局部变量,对它们的认识是一种矫枉过正。但是,这样做不会对任何事情造成伤害。
答案 6 :(得分:1)
在我看来,你应该抓住每个机会利用强类型语言的编译器。我将const
用于临时,局部变量,不可变引用等。
Const Correctness C++ FAQ可能会提供更多有用信息。