让我们考虑一下这样的应用:

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是无用的?

===============>>#1 票数:9 已采纳

但是为什么调用者应该关心他从未见过和使用的变量会发生什么?

他没有。 实际上,您可以将该const保留在const的声明之外,并且只将它包含在实现中。

我是否正确声明函数参数为X* const是无用的?

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

===============>>#2 票数:2

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

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

===============>>#3 票数:0

const有两个一般效果:

  • 它迫使程序员遵守标准。 由于您不能将非const变量传递给const参数而不声明它是mutable ,因此调用该函数的程序员知道该函数不会更改其变量。
  • 更重要的是 - 编译器可以根据这些信息进行优化,并在内部保存一些副本,或进行内联扩展,或者其他任何事情,如果事先不知道被调用的函数永远不会改变数据,这是不可能的,因为它只是简单地“T。

  ask by javapowered translate from so

未解决问题?本站智能推荐: