在什么情况下需要使变量恒定?
如果您希望变量始终保持相同的值,就可以不更改它吗?
答案 0 :(得分:11)
如果您是一个完美的程序员,那么可以肯定的是,不要更改变量。但是六个月后,当您很长一段时间没有查看此文件并且需要进行较小的更改时,您可能不记得您的变量不应该更改。而且,如果其他代码是以此假设编写的,那将是灾难的根源。
如果您正在与项目中的人 一起工作,那么这会增加十倍。说/* plz don't change this variable kthx */
的评论是一回事,但是让编译器强制执行该约束要难得多。
不能修改常量。这使编译器可以对它们进行很多巧妙的处理。如果我写
const int foo = 5;
int some_function() {
return foo;
}
编译器只能让some_function
返回5
,因为foo
永远不会改变。如果foo
不是const
,则some_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";
没有理由同时存在这两个字符串。如果编译器可以证明您从未引用过它们中的任何一个,则它可以将常量折叠为一个,从而节省空间。
答案 1 :(得分:8)
最重要的原因是避免错误。通过标记const
,可以允许编译器捕获任何尝试对其进行更改的尝试。例如,假设某个变量是否通过引用传递给更改它的函数。如果标记了变量const
,则编译器将捕获该变量。如果不这样做,您将有一个必须查找和修复的错误-希望在它引起一些严重问题之前。
通过标记变量,类成员函数,参数和引用const
,可以在编译时检测到可能容易在无意中将大量错误添加到复杂代码中的错误,从而避免它们导致程序执行不正确。产生没有错误的代码非常困难,欢迎使用任何可以显着帮助我们做到这一点的工具。
答案 2 :(得分:3)
是的,但是您没有考虑到很少有您自己从事项目,并且编写的代码可能在您离开后就在身边,所以一个人将无法向您提出有关变量的问题及其用法。通过将其标记为常量,您可以告诉所有人“该值永远不能在代码中更改”
答案 3 :(得分: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
可以更改在重载解析期间调用哪个函数。
答案 4 :(得分:1)
同意接受的答案,但这是一个较不普遍的考虑因素:
可以将静态const数据放入只读内存段中。在某些系统上,这从字面上意味着它可以驻留在ROM中。
您可能会想,为什么要这样做?例如,考虑一下Ardruino Nano之类的东西,它具有高达2KB的RAM。
仅在程序的内存映射包含ROM段的情况下,并且在许多仅适用于引导程序的计算机上,才可以映射程序的只读数据,因为所有其他代码都是从文件中加载的(即使这些文件位于ROM中,就像在手机上一样)。但是,我看到它是这样做的,但是我也看到了一些系统,其中在启动时将只读段(和代码段)复制到RAM中以提高速度。