equal_l2’s blog

※記載されている内容の正確性は保証しませんが、間違いを指摘していただければ直します。

参照型の引数について

関数の引数を参照型でとることには、ポインタを使うのと比べていくつかの利点がある。

1.呼び出す際にアドレスを渡さなくていい

変数の交換を行う関数でabを交換することを考える。
その関数を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属性の参照(参照先の値を変更できない)以外を引数の型にすることは禁止されていることもある。