C++ 为什么将函数参数声明为";X*const"; 让我们考虑这样的应用: 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; }

C++ 为什么将函数参数声明为";X*const"; 让我们考虑这样的应用: 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; },c++,C++,让我们删除const关键字: void foo (char* pointerToChar) { pointerToChar = "foo"; } int _tmain(int argc, _TCHAR* argv[]) { char* str = "hello"; foo(str); printf(str); return 0; } 输出为hello。所以,即使允许函数更改指针,它也会更改指针的副本,而原始指针并没有更改 这是预期的,因为指针是按值传递

让我们删除
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
是无用的,对吗?

顶级限定符将在函数声明中被丢弃(因此它不参与函数签名),但将在函数定义中强制执行

有一些编码标准建议您将值参数作为
const
(并返回
const
值),以避免对参数进行可能不需要的修改。我不太同意这个理由,但确实如此

但为什么调用方应该关心他从未看到和使用过的变量会发生什么呢

他没有。事实上,您可以将
const
保留在函数声明之外,并且只将其包含在实现中

将函数参数声明为
X*const
是无用的,这一点正确吗


不,它与声明任何其他局部变量
const
一样有用。阅读函数的人会知道指针值不应该改变,这会使逻辑更容易理解;没有人会在不应该的时候改变逻辑,从而意外地破坏逻辑。

const
有两个一般效果:

  • 它迫使程序员遵守标准。由于不能在不声明非常量变量为可变变量的情况下将其传递到常量参数中,因此调用函数的程序员知道其变量不会被函数更改
  • 更重要的是,编译器可以根据这些信息进行优化,并在内部保存一些副本,或者进行内联扩展,或者其他任何操作,如果事先不知道被调用函数将永远不会更改数据,因为它根本无法更改数据,这是不可能的

在我看来,没有充分的理由以这种方式声明参数。是的,这是“毫无意义的”,你总结得很好。但是,你知道,这是一个风格问题,所以几乎可以肯定有人会告诉我我完全错了。已经被问了好几次了。可能的重复。此外,如果您错误地编写了更改参数的语句,编译器应该警告您。因此,它是一种错误预防技术。由于它不影响调用代码,所以C++也允许从声明中省略< <代码> const <代码>,并且只在定义中指定。