参照は関数引数としてよく使われます。
イメージはポインタと同じですから、特に戸惑う事は無いと思います。
サンプルを書いてみましょう。
<sample program cpp043-01>
#include <iostream> void Twice(int &ref); int main() { int value = 12; Twice(value); std::cout << "value = " << value << std::endl; return 0; } void Twice(int &ref) { ref *= 2; } |
<実行結果>
value = 24 続行するには何かキーを押してください・・・
ポインタとは違いますので、呼び出し元も
Twice(value); |
と書き、「&」は不要です。
受け取った後も、
ref *= 2; |
のように、refの前に「*」はいりません。
次に構造体を渡してみます。
<sample program cpp043-02>
#include <iostream> struct Player { int hp; int mp; }; void Heal(Player &refPlayer); int main() { Player player = { 20, 30 }; Heal(player); std::cout << "HP = " << player.hp << std::endl; std::cout << "MP = " << player.mp << std::endl; return 0; } void Heal(Player &refPlayer) { refPlayer.hp += 50; refPlayer.mp -= 5; } |
<実行結果>
HP = 70 MP = 25 続行するには何かキーを押してください・・・
Playerという構造体を作り、初期値を入れます。
Healという関数にPlayer構造体playerへの参照(refPlayer)を渡します。
ポインタとは違いますので、「->演算子」は使いません。
次は配列です。
<sample program cpp043-03>
#include <iostream> static const int ELEMENTS = 5; void Twice(int(&refData)[ELEMENTS]); int main() { int data[ELEMENTS] = { 1, 2, 3, 4, 5 }; Twice(data); for (int i = 0; i < ELEMENTS; i++) { std::cout << "data[" << i << "] = " << data[i] << std::endl; } return 0; } void Twice(int(&refData)[ELEMENTS]) { for (int i = 0; i < ELEMENTS; i++) { refData[i] *= 2; } } |
<実行結果>
data[0] = 2 data[1] = 4 data[2] = 6 data[3] = 8 data[4] = 10 続行するには何かキーを押してください・・・
配列は、
void Twice(int(&refData)[ELEMENTS]); |
のように渡します。
ただ、変数や構造体と違って配列を参照で渡しても、ポインタの時と書き方が変わりません。
変数は「&」や「*」を使わなくても使えるようになりましたし、構造体は「->」を使わなくてもよくなりました。
配列は変わりませんので、積極的に使うべきか悩みます。
これから先は参照が使えるところは参照を使います。
しかし、ポインタ変数が不要になった訳ではありません。
newで領域を確保する時などには、ポインタ変数が必要です。