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

时间:2013-04-16 16:55:46

标签: c++

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

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声明函数参数是无用的?

3 个答案:

答案 0 :(得分:9)

  

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

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

  

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

const有两个一般影响:

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