让我们考虑一下这样的应用:
void foo (char* const constPointerToChar) {
// compile-time error: you cannot assign to a variable that is const
constPointerToChar = "foo";
}
int _tmain(int argc, _TCHAR* argv[])
{
char* str = "hello";
foo(str);
printf(str);
return 0;
}
我们删除const
关键字:
void foo (char* pointerToChar) {
pointerToChar = "foo";
}
int _tmain(int argc, _TCHAR* argv[])
{
char* str = "hello";
foo(str);
printf(str);
return 0;
}
输出为hello
。因此,即使允许函数更改指针,它也会更改指针的副本,并且原始指针没有更改。
这是预期的,因为指针是按值传递的。
我确实理解为什么事情会这样,但我不明白为什么有人需要将参数声明为X* const
。
当我们将函数参数声明为X* const
时,我们会说“好吧,我保证在我的函数内部,我不会修改我自己的指针副本。”但是为什么调用者应该关心他从未见过和使用的变量会发生什么呢?
我是否更正为X* const
声明函数参数是无用的?
答案 0 :(得分:9)
但是为什么调用者应该关心他从未见过和使用的变量会发生什么呢?
他没有。实际上,您可以将const
保留在函数的声明之外,并且只将其包含在实现中。
我是否更正为
X* const
声明函数参数是无用的?
不,它与声明任何其他局部变量const
一样有用。读取函数的人会知道指针值不应该改变,这可以使逻辑更容易理解;没有人可以在他们不应该的时候通过改变来意外打破逻辑。
答案 1 :(得分:2)
顶级限定符将在函数声明中被丢弃(因此它不参与函数签名),但将在函数定义中强制执行。
有一些编码标准建议你应该将值参数作为const
(并返回const
值),以避免对参数进行可能不必要的修改。我不完全同意这个理由,但确实如此。
答案 2 :(得分:0)
const
有两个一般影响:
mutable
的情况下无法将非const变量传递给const参数,因此调用该函数的程序员知道该函数不会更改其变量。