3

Let's consider such application:

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;
}

Let's remove const keyword:

void foo (char* pointerToChar) {
    pointerToChar = "foo";
}

int _tmain(int argc, _TCHAR* argv[])
{
    char* str = "hello";
    foo(str);
    printf(str);
    return 0;
}

And output is hello. So even if function is allowed to change pointer it changes it's copy of pointer and original pointer was not changed.

This is expected because pointers are passed by value.

I do understand why things works this way but I do not understand why someone need to declare parameter as X* const.

When we declare function parameter as X* const we say that "Ok I promise inside my function i will not modify my own copy of your pointer." But why caller should care what happens with variables he never see and use?

Am I correct that declaring function parameter as X* const is useless?

4

3 に答える 3

9

しかし、なぜ発信者は、自分が決して見たり使用したりしない変数で何が起こるか気にしなければならないのでしょうか?

彼はしません。const実際、関数の宣言からそれを除外し、実装にのみ含めることが許可されています。

関数パラメーターを宣言するのX* constは役に立たないということを修正しますか?

いいえ、他のローカル変数を宣言するのと同じくらい便利ですconst。関数を読んでいる人は、ポインター値が変更されるべきではないことを知っているため、ロジックを追跡するのが少し簡単になります。ロジックを変更してはならないときに誤ってロジックを壊してしまうことはありません。

于 2013-04-16T16:59:10.163 に答える
2

最上位の修飾子は関数宣言では破棄されますが (関数シグネチャには含まれません)、関数定義では強制されます。

潜在的に不要な引数の変更を避けるために、値の引数をそのまま受け取るconst(そして値も返す)ことを提案するコーディング標準がいくつかあります。const私はその理論的根拠に完全には同意しませんが、そうです。

于 2013-04-16T16:58:30.880 に答える
0

const2 つの一般的な効果があります。

  • プログラマーに標準への準拠を強制します。非 const 変数を宣言せずに const パラメーターに渡すことはできないためmutable、関数を呼び出すプログラマーは、自分の変数が関数によって変更されないことを知っています。
  • さらに重要なことに、コンパイラはこの情報に基づいて最適化し、内部的にいくつかのコピーを保存したり、インライン展開を行ったりすることできます。だ。
于 2013-04-16T16:59:53.110 に答える