为什么将函数参数声明为“X* const”?

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


1
在我看来,没有什么好的理由去那样声明一个参数。所以是的,这是“无意义的”,而且你总结得很好。但是,你知道,这是一个风格问题,所以几乎可以肯定会有人告诉我我完全错了。 - john
已经被问了很多次。可能是函数参数使用'const'的重复问题 - AnT stands with Russia
1
同样的,http://stackoverflow.com/questions/5385754/is-it-true-that-const-t-v-is-never-necessary-in-c - AnT stands with Russia
3个回答

9
但是,为什么调用者要关心他从未见过和使用的变量发生了什么?
实际上,他并不关心。事实上,在函数声明中可以省略那个const,在实现中才包含它。
我是否正确地认为将函数参数声明为X * const是无用的?
不,这与声明其他任何局部变量为const一样有用。阅读函数的人会知道指针值不应该改变,这可以使逻辑更容易理解;并且没有人可以在不应该更改时意外破坏逻辑。

6
此外,编译器应该会在你错误地编写修改参数的语句时提醒你,这是一种防止 bug 的技术。 - Eric Postpischil
由于它不会影响调用代码,因此C++还允许在声明中省略const并仅在定义中指定。 - Drew Dormann

2

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

有一些编码标准建议您将值参数作为const(并且返回值也是const),以避免对参数的意外修改。我不完全同意这种理由,但它确实存在。


0

const 有两个一般效果:

  • 它强制程序员遵守标准。由于您不能将非 const 变量传递到 const 参数中而不声明它为 mutable,因此调用函数的程序员知道他的变量将不会被函数更改。
  • 更重要的是——编译器可以根据这些信息进行优化,并在内部保存一些副本,或者进行内联扩展,或者进行其他操作,如果没有先前知道被调用的函数将永远不会更改数据,这些操作都不可能实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接