3

让我们考虑这样的应用程序:

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

4

3 回答 3

9

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

他没有。实际上,您可以将其const从函数声明中删除,而仅将其包含在实现中。

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

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

于 2013-04-16T16:59:10.163 回答
2

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

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

于 2013-04-16T16:58:30.880 回答
0

const有2个一般效果:

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