読者です 読者をやめる 読者になる 読者になる

参照が使えるときはいつでも参照を使いましょう

TBをいただいたのと今日はたまたま早く帰宅できたので反応!
はてなダイアリー
素晴らしい事にお気づきになられました。

誰だC++に参照なんていう概念を持ち込んだカスは。

びょーんすっぽすっぽ先生を虐めないで><


ということで、マジレスをすると、
参照は良い物です。
C++で問題となる「ポインタ」という悪魔をちょっとだけ和らげてくれる癒し系です。

こうなると、C++の参照渡しってコピーコンストラクタとか演算子のオーバーロードみたいな時にしか使い道ないかも知れないね。

そんなことは全然なくて、
寧ろ「参照が使えるときは参照を使いましょう」が正解。
ええー、って思うかもしれないけれど、
参照はポインタと比べて「安全」である事が利点。
・無茶をしなければNULLにはならない(何も参照していない状態というのが赦されない=コンパイラチェックが厳密になる)
・演算ができない(有らぬ演算をしてメモリを破壊してしまうことはない、ただし決してメモリを壊さない訳ではない)
・参照を受ける変数は必ず初期化されなければならない(故に、ポインタを引き回すような構造になりにくい)
という点が不自由のように見えて「セーフティ」なのがキモ。

戻り値なども、ポインタを返すより参照を返すべき。
const Hoge* getHoge()
より、
const Hoge& getHoge()
が正義。

寧ろ、C++ではポインタはスマートポインタか、
どうしてもポインタ演算が必要なときにだけ使われるべき。
(例えばバイナリデータの先頭アドレスをstructとして扱いたいとか、または配列だとか)

元々、C++という言語は「アドレスさえ解れば」privateだろうと、
なんだろうとデータ破壊、ないしは変更、取得、なんでも行える言語。
要するに、「メモリアドレスこそがすべて」であり、
ポインタありきであり、
それを(比較的)安全にラップしたものが「C++の参照」
ここがテストにでます!!!!!!

ただし、出力パラメータとして、

void GetHoge(Hoge& hoge)
{
    hoge = hoge_;
}
や
void GetX(int& x)
{
    x = x_;
}

と書いてはいけないよ!
(こういうときはどうしてもならポインタで、普通なら値か参照を返せば良い)
何故かというと、
int x;
hoge.getX(x);
というのがxにhogeのxを入れるという意味に採りづらいから。

参照はとてもとても良い物です。