参照型の引数について
関数の引数を参照型でとることには、ポインタを使うのと比べていくつかの利点がある。
1.呼び出す際にアドレスを渡さなくていい
変数の交換を行う関数でa
とb
を交換することを考える。
その関数をswap
とする。
ポインタで実装したswap
関数は、次のようにつかう。
swap(&a,&b);
一方で、参照で実装したswap
関数は、次のようにつかう。
swap(a,b);
違いは明確で、ポインタ実装ではアドレスを渡すのに対し、参照実装では変数(オブジェクト)を渡している。
ひと手間減るわけだ。
2.書き方を変えないで済む
int型に対して、ポインタで実装したswap
関数はこんなようなのだった。
void swap(int* a, int* b){ int c = *a; *a = *b; *b = c; }
一方で、参照で実装すると
void swap(int& a, int& b){ int c = a; a = b; b = c; }
参照実装のほうは、関数の中身をそのままmain関数などに貼り付けても問題なく動作する。
ポインタ実装のほうはそうはいかない。
これらの利点は、要するに「変数に直接アクセスする」ことを楽に行える、とか意識せずに行える、ということである。
逆に、変数が変更される可能性があることに気付きづらくなるので、企業のコーディングスタイルではconst属性の参照(参照先の値を変更できない)以外を引数の型にすることは禁止されていることもある。