★引数としての参照★


参照は関数引数としてよく使われます。

イメージはポインタと同じですから、特に戸惑う事は無いと思います。

サンプルを書いてみましょう。

<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で領域を確保する時などには、ポインタ変数が必要です。


次へ

戻る

目次へ