equal_l2’s blog

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

参照を学ぶ

ポインタとよく一緒に語られる存在として、C++の参照がある。

ただC++の参照というのはオブジェクトに別の名前を付けることらしく、実装にポインタを必ずしも使う必要はないらしい。

参照型変数

参照型の変数は、次のように宣言する。

参照先の型 &変数名 = 参照先オブジェクト;

たとえば、int型の変数aへの参照であるraを宣言するには…

int& ra = a;

とする。

参照型の性質として、次のことがあげられる。

1.宣言時に必ず初期化する必要がある。

宣言する際に、必ず参照先を指定しなければならない。
つまり、参照型の変数は宣言のみを行うことはできない。

2.参照先は変更できない

ポインタと違い、示す先、もしくは参照先を変更することはできない。

3.参照先の変数の代わりとして使える

参照型変数は、参照先オブジェクトと全く同じように扱える。
(ポインタのように間接演算子でアクセスする必要はない
もっとも、参照型変数はWindowsのショートカットとかUnix系のシンボリックリンクのようなものなので当然といえば当然なのだが。

参照型引数(参照渡し)

参照型は、ポインタ同様に仮引数の型としても使える。
しかも、ポインタのようにアドレス演算子を使って引数を渡さなくてもいいのが利点となる。
これを使えばswapの素朴な実装が動くようになる。

#include <cstdio>
void swap(int& a, int& b){
 int c = a;
 a = b;
 b = c;
}

int main(){
 int a=10, b=20;
 printf("before:%d %d \n",a,b);
 swap(a,b);
 printf("after :%d %d \n",a,b);
}

(C++なんだからほんとはテンプレートで型汎用的に書いたほうがいいんだろうけど)

ただし参照型引数では、引数が関数によって変更されるのかどうかが分かりづらいという欠点もある。
実際 googleC++スタイルガイドでは、引数を変更する際にはポインタ型引数として取るようにせよとの記述がある。

実はあんまり使い道ない?