C++参照型

参照型について

参照型(reference)とは

参照型とは、変数に別名を付けて参照することが可能となるC++の機能です。


int x;      // int型変数の定義
int &y = x; // yをint型への参照として定義(参照先がx)
y = 30;     // xの値も30になる

参照型の宣言

参照型を宣言するには、宣言時に変数の前に アンパサンド「&」を指定します

変数のアドレスを出力する「&」演算子とは異なるので注意が必要です。


データ型 &別名 = 変数名

参照型を用いる場合には、定義時に初期化を行う必要があります。

以下のように宣言と代入を分けることはできません。


int x;
int &y;
y = x;  // コンパイルエラーとなる。

参照型とポインタ

参照型はポインタと類似した機能ですが、動作は異なります。


参照は独自のアドレスを持たず、変数のアドレスそのものを指します。つまり、名前が違うだけで変数そのものを表します。

ですので、一度初期化した後、指すアドレスを変更できません。


// 参照型で変数を参照する。
int &ref = bar;

ポインタは物理的なメモリアドレスを指す独立した変数ですので、アドレスを変更することで参照先を変更することができます。


// ポインタで変数を参照する。
int *pref = &bar;

参照型の利点は、ポインタのように指し先が曖昧になることもないし、NULLポインタのような特殊な状態を持つこともないことです。

参照型は、変数の参照において、ポインタよりも安全に利用することが可能な機能といえます。


参照型を関数で用いる

参照型を仮引数に用いる

C言語では、呼ばれた関数内で実引数を操作するにはポインタを利用することで実現しましたが、C++では参照型を利用することが可能です。

間接演算子「*」を用いることなく実引数の操作が可能であるため、すっきりしたプログラムを記述することが可能となります。


#include <cstdio>

// 参照型でスワップ
void swap(int &a, int &b)
{
    int temp;
    temp = a; a = b; b = temp;
}

// C言語的なポインタを利用したスワップ
void swap_pointer(int *a, int *b)
{
    int temp;
    temp = *a; *a = *b; *b = temp;
}

int main(void)
{
    int x = 5;
    int y = 8;

    // 参照型では変数をそのまま渡します。
    swap(x, y);
    printf("%d, %d\n", x, y);

    // ポインタへはアドレスを渡す必要があります。
    swap_pointer(&x, &y);
    printf("%d, %d\n", x, y);

    return(0);
}

参照型を関数の戻り値に用いる

関数の戻り値として参照型を返すことが可能です。

この場合、参照型の性質により、関数を代入先として利用することが可能です。

これは、変数に値を格納する場合のテクニックとなります。


#include <cstdio>

int val = 1234;

int& show_val(){
    return(val);
}

int main(void)
{
    printf("%d\n", show_val());

    // 代入する
    show_val() = 5678;
    printf("%d\n", show_val());

    return(0);
}

関連ページ