第37章 参照

 ポインタを使った変数の操作の欠点は、& や * を付けなければならないことです。一言でいうと「面倒」ということです。

 今回はそれを解消する方法について話していきたいと思います。


 では、今回の要点です。


 では、いってみましょう。


 ポインタで変数を参照するときは、アドレスを渡し、そしてポインタに * を付けて行いました。

void Zero(int* p)
{
    *p = 0;
}
    .
    .
    .
int a;
Zero(&a);

 そうそう、こんな感じです。

 これを初めて見たとき、誰もが口にする感想は「面倒」です。関数の定義の中では * を付けなくてはなりませんし、関数を使うときには & を付けなくてはなりません。これは確かに面倒です。

 (おそらく)そういったことから、C++言語にはこれらを付けなくてよい方法が追加されました。その名もズバリ参照です。

 では、次のプログラムを見て下さい。

プログラム実行結果例
// Ref1.cpp
#include <iostream.h>

int main()
{
    int a;
    int& r = a;

    a = 0;
    cout << "a  = " << a << endl
         << "r  = " << r << endl << endl;

    r = 100;
    cout << "a  = " << a << endl
         << "r  = " << r << endl << endl;

    cout << "&a = " << (unsigned int)&a << endl
         << "&r = " << (unsigned int)&r << endl;

    return 0;
}
a  = 0
r  = 0

a  = 100
r  = 100

&a = 6618612
&r = 6618612

 r が参照です。そして、定義は

int& r = a;

の部分です。

 こう書くと、r は a と全く同じになります。どこまで同じかというと、インラインアセンブラでも使わない限り全てが同じです。

 では、それを検証してみましょう。方法はポインタの時と同じようにします。

 先ず、a に 0 を代入してみましょう。すると、r も 0 になっています。

 次に、今度は r のほうに 100 を代入してみましょう。すると、a も 100 になっています。

 最後に、アドレスを表示してみましょう。何と、&a も &r も同じ値になっています

 同じ変数に別の名前を付けたかのような感覚で変数を参照できるようにしたもの、それが参照なのです。


 これは、上で書いたポインタによる参照を簡便化するために使います。つまり、

void Zero(int& r)
{
    r = 0;
}
    .
    .
    .
int a;
Zero(a);

のように使うのが普通です。

 こうすれば、関数の定義の中で * を付けたり、変数を関数に渡すとき & を付けたりしなくてよいようになります。唯一必要なのは、int& r の & です。たったこれだけで、参照が可能になってしまうのです。


 最後に、参照の細かいことをいくつか話して終わりにします。

 先ず、参照は、引数でないときは、必ず初期化しなくてはなりません。また、それは定義の部分で行わなくてはなりません。

int a;
int& r;

r = a;

のようにはできません。これはエラーになります。

 また、このように、参照する変数を途中で変更することもできません。

int a, b;
int& r = a;

b = 0;
r = b;

とやっても、r が b の参照になったりはしません。a に b の値が代入されるだけです。

 ポインタと違って、融通は利かないということです。


 では、今回の要点です。


 では、また次回まで。


第36章 配列再々考 | 第38章 参照のしくみ

Last update was done on 1999.4.15

この講座の著作権はロベールが保有しています