C++の基礎 : 参照
参照
参照 (リファレンス) は C 言語のポインタとよく似ていますが、ポインタよりも扱いやすくなっています。
参照変数
参照変数は型名に & をつけて宣言します。
SIntN x = 10; SIntN& r = x; // r は x の別名になる r = 20; // x の値は 20 になる
参照変数は宣言と同時に代入されなければなりません。代入された参照変数は、元の変数の別名として機能します。その意味でも参照はポインタとよく似ています。
SIntN x = 10; SIntN* p = &x; // *p は x の別名になる *p = 20; // x の値は 20 になる
ただし、参照変数には "NULL" を代入することはできません。参照変数は常に有効なメモリアドレスを指していなければならないのです。
参照渡し
関数にポインタを渡す代わりに、参照を渡すことができます。
Void Swap(SIntN& x, SIntN& y) { SIntN temp; temp = x; x = y; y = temp; }; Void MyFunction() { SIntN x = 10; SIntN y = 20; Swap(x, y); // x = 20, y = 10 となります }
参照渡しの関数を呼び出し方は、ポインタ渡しの関数の呼び出し方と似ていますが、変数のアドレスを指定するのではなく、変数そのものを指定します。
上記 Swap() 関数をポインタを使って実装したものと比べてみて下さい。参照とポインタはほとんど同じものであることがわかるでしょう。
Void Swap(SIntN* px, SIntN* py) { SIntN temp; temp = *px; *px = *py; *py = temp; } Void MyFunction() { SIntN x = 10; SIntN y = 20; Swap(&x, &y); // x = 20, y = 10 となります }
【Java では】Java のメソッドの引数は、基本型は値渡しですが、オブジェクトはすべて参照渡しとなります。
この章のまとめ
- 参照変数は型名に & をつけて宣言します。
- 参照変数は宣言と同時に代入しなければなりません。
- 参照変数はポインタと同じように使うことができますが、 "NULL" を代入することはできません。
- 参照渡しの関数を呼び出すには、引数に変数そのものを指定します。
やってみよう
次のようなコードを実行してみよう!
参照引数によりちゃんと値が書き換えられるでしょうか?
class Circle { public: SIntN x, y, r; Circle(SIntN x0, SIntN y0, SIntN r0) { x = x0; y = y0; r = r0; } }; Void SwapRadius(Circle& c1, Circle& c2) { SIntN temp = c1.r; c1.r = c2.r; c2.r = temp; } Void TestReference(Void) { Circle c1(10, 20, 30); Circle c2(5, 5, 60); SwapRadius(c1, c2); SFXHelper::dbgprintf("c1.r=%d, c2.r=%d", c1.r, c2.r); }