将变量设为常量的重要性是什么?

11

在什么情况下需要将变量设置为常量?

如果你希望一个变量始终保持相同的值,难道你不可以只是不改变它吗?


2
一次咖啡桌讨论引起了关注 - 欢迎 @Asthon - Ted Lyngmo
1
关于 private 的相关问题:https://dev59.com/hW855IYBdhLWcg3wJg1y - L. F.
5个回答

12

保证

如果你是一个完美的程序员,那么可以不改变变量。但是六个月后,当你很久没有看过这个文件并需要进行微小更改时,你可能不记得你的变量不应该改变。如果其他代码基于这个假设编写,那就可能会导致灾难。

如果你在项目中与其他人合作,这种情况可能会更加复杂。注释说“/* plz don't change this variable kthx */”是一回事,但是让编译器强制执行这个约束条件则更难被忽视。

优化

常量是不能修改的,这使得编译器可以对它们进行许多聪明的操作。如果我写下以下代码:

const int foo = 5;

int some_function() {
    return foo;
}

编译器可以直接让some_function返回5,因为foo永远不会改变。如果foo不是constsome_function总是需要读取变量的当前值。此外,如果我有:
const char foo[] = "Ashton Bennett is a cool C++ programmer";
...
// Somewhere else in the file
const char bar[] = "Ashton Bennett is a cool C++ programmer";

没有必要让这两个字符串都存在。如果编译器可以证明你从未引用它们中的任何一个,它可以将常量折叠成一个,节省空间。


2
你展示了编译时常量的例子,这些在现代 C++ 中应该使用 constexpr。这将允许进行更多的优化。 - val is still with Monica

8
最重要的原因是避免出现错误。通过将某些东西标记为 const,您可以使编译器捕获任何试图更改它的尝试。例如,想象一下,如果通过引用将某个变量传递给一个会更改它的函数。如果您将该变量标记为 const,编译器将捕获到这一点。如果不这样做,您将有一个错误,必须找到并修复它——希望在它引起严重问题之前能够修复。
将变量、类成员函数、参数和引用标记为const,可以在编译时检测到可能会无意中添加到复杂代码中的大量错误,而不会导致程序执行不正确。编写没有错误的代码很难,任何可以显着帮助我们完成这项工作的工具都受到欢迎。

3

是的,但你并没有考虑到很少有人会独自完成一个项目,而且你编写的代码可能在你离开后还会存在,所以别人可能无法询问关于变量及其使用的问题。通过将它标记为常量,你告诉所有人:“这个值在代码中不应该被改变”。


1
同意接受的答案,但一个不太常见的考虑是这样的:
静态const数据可以放在只读内存段中。在某些系统上,这实际上意味着它可以驻留在ROM中。
你可能会想,那为什么要这样做呢?好吧,以Ardruino Nano为例,它只有2KB的RAM。
将程序的只读数据映射到ROM段只能在程序的内存映射包括ROM段的情况下完成,在许多计算机上,这只适用于引导加载程序,因为所有其他代码都是从文件中加载的(即使这些文件驻留在ROM中,如手机)。然而,我见过像这样的做法,但我也见过系统在启动时将只读段(和代码段)复制到RAM中以提高速度。

1

虽然我目前无法想出一个可能的/好的实践案例,但需要考虑成员函数(当然还有自由函数)可以重载const

struct Foo {
  void Bar() {
    // One thing
  }
  void Bar() const {
    // Another thing
  }
};

// Later somewhere;
// which function gets called depends on
// whether the_foo is const or not
the_foo.Bar();

因此,将变量设为const可以在重载解析期间更改调用的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接