参照を学ぶ
ポインタとよく一緒に語られる存在として、C++の参照がある。
ただC++の参照というのはオブジェクトに別の名前を付けることらしく、実装にポインタを必ずしも使う必要はないらしい。
参照型変数
参照型の変数は、次のように宣言する。
参照先の型 &変数名 = 参照先オブジェクト;
たとえば、int
型の変数a
への参照であるra
を宣言するには…
int& ra = a;
とする。
参照型の性質として、次のことがあげられる。
1.宣言時に必ず初期化する必要がある。
宣言する際に、必ず参照先を指定しなければならない。
つまり、参照型の変数は宣言のみを行うことはできない。
2.参照先は変更できない
ポインタと違い、示す先、もしくは参照先を変更することはできない。
参照型引数(参照渡し)
参照型は、ポインタ同様に仮引数の型としても使える。
しかも、ポインタのようにアドレス演算子を使って引数を渡さなくてもいいのが利点となる。
これを使えば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++なんだからほんとはテンプレートで型汎用的に書いたほうがいいんだろうけど)
ただし参照型引数では、引数が関数によって変更されるのかどうかが分かりづらいという欠点もある。
実際 google のC++スタイルガイドでは、引数を変更する際にはポインタ型引数として取るようにせよとの記述がある。
実はあんまり使い道ない?