参照は関数引数としてよく使われます。
イメージはポインタと同じですから、特に戸惑う事は無いと思います。
サンプルを書いてみましょう。
<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で領域を確保する時などには、ポインタ変数が必要です。