通常会看到带有指针的关键字const
:
void function(const char *string)
{
const char *other_string = "some string";
}
但是为什么我们每次声明一个我们不会改变的变量时都不使用const?很难看到:
void function(const int i)
{
const double j = 1.2;
// i and j will not be changed in this function
}
我试图理解为什么我们不经常使用const
,在我们能否使用时使用它总是一件好事吗?
This post似乎回答“是”,但实际上这种情况似乎并非如此......
答案 0 :(得分:2)
在大多数情况下,它不再有所作为。
编译器通常能够推断变量实际上是只读的,并在优化过程中将其视为常量。
无论哪种方式,您通常会在const
之类的内容使用const char *string
,以避免意外修改参数。
由于所有参数都是按值传递的,因此这不是整数所不能发生的事情。仅指针指针本身就是值。
实际上,const char *string
尚未完全不变。只有指针所指向的char
是,但指针不是变量。只有在将其指定为const char * const string
时才会成为。现在,string
变量对于函数的范围是完全恒定的。
答案 1 :(得分:2)
如果你给的话,我会总是说
void function(const int i)
在i
的作用是参数化函数行为的情况下 - 这几乎总是如此。如果我在函数体中更改i
,我要么犯了错误,要么写了一些其他人以后会发现难以理解的内容。
故意修改函数中i
的值不是"危险"通过指针修改实体 - 它不会在函数外部创建副作用。我猜这就是为什么大多数开发人员都没有感受到将原始参数定义为const
的压力。但是,我坚持认为,如果一个人关心长期维护,这是明智之举。
答案 2 :(得分:1)
在第二个示例中,参数按值传递,使const
基本没有意义。通过引用传递参数时,const
最方便。
const
称为" const中毒"还有另一个问题。请考虑以下事项:
int foo(char * str, int n)
{
...
bar(str);
...
}
如果我们将str
设为const
,那么我们必须确保该栏还需要const
等(这会影响多个文件和模块)。如果您正在编辑旧的和不一致的代码(情况并非如此,但应该考虑),这尤其令人痛苦。