このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

爺感:参照/ポインター引数と変更

爺感:なんだか作法がわからん - 檜山正幸のキマイラ飼育記 メモ編

参照を渡すのは書き換えるためだと思うのだがなー。書き換えない意図こそconstで示すべきじゃないの。

「変更するならポインターを渡す」という人はけっこういるようだ。

参照をもらって、参照先を変更する関数を foo(r) とすると、foo() を呼び出す側では、引数が参照として渡っているのか、それとも実体のコピーかが区別しにくい。実体のコピーが関数側に行くなら、変更なんてあり得ないわけだ。

で、呼び出し構文を見て「あー、これは変更されないな」と誤解される危険を避けるためにポインターにする、と。

まー、言ってることは分かるが、ポインターだってconst付いていれば変更される心配はないので、「参照かポインターか」じゃなくて「constがあるかないか」だと思う。ポインターだから必ず変更する、なんてことはないもんね。

というわけで、僕は「指してる先を変更するか/しないか」でポインター/参照を使い分ける気はないな。

基本的に参照でいいときは参照を使う、だろう(これがジジイには難しい)。ポインターにするのは、既にポインターが使われているとき(これは多い)か、nullptrが必要なときだろう。

ライブラリや既存コードがポインターベースなら、それはしょうがない。ポインターでやりましょ、ってことだ。

引数にnullを渡す、あるいは関数からnullを戻す、ってならポインターしかない。だが、nullを避けられそうなら参照にすべき。いわゆる「出力引数」なんてのは、悪しき習慣かも知れないがイッパイ使っているからね、しょうがない(ポインターでも参照でも出力引数は出来る)。

それと、さらに、コピー埋め込み方式のデメリット - 檜山正幸のキマイラ飼育記 メモ編で書いたように、ポインターを忌避すると、ロクでもないことになったりする。