引数にも const や final を付ける
ローカル変数には const
や final
を付けるわけだが、関数 (メソッド) の仮引数というのは一種のローカル変数なわけで、やっぱり、const
やら final
やらを付けるべきだ。
C++ でも Java でもこれらの型修飾子はシグニチャには影響しないので、API 仕様が汚れたりはしない。「やっぱり const
/final
やーめた」となったら、こっそり消して構わない。
C++ で前方宣言をする場合は、こんな感じにするといい:
- 前方宣言
-
T do_something(U argument1, V argument2);
- 実体定義
-
T do_something(U const argument1, V const argument2) { // 実際の処理 }
const
は「実際の処理」の中で引数((厳密に言えば、「実引数で初期化されたローカル変数」。こう捉えると、const
にも納得 (してください)。))が変更されないことの表明なので、宣言に書いても無意味。だから書かない。「U const argument1
」は、キモいかもしれないが正当な書き方で、「const U argument1
」と全く同じ。敢えてこう書くのは:
- 「
const U& argument1
」の間違い?、と思われないように。 - 宣言の「
U argument1
」との呼応。- 「実装上の詳細を言わせてもらえれば、この
argument1
っていう変数はconst
なわけなんですよ。」という呟き的なニュアンス。 - “実装上の都合”なので、使う側の視点である宣言には現れない。
- 「実装上の詳細を言わせてもらえれば、この
とまあ、これだけ書いておいて何ですが、引数を値渡しするのはレアケースですね。