トップC++入門 > 参照
参照

1.参照型

C言語のポインタは特に初心者には難しい。中級者でも、間違いをおかす危険性を秘めている。 C言語に慣れても、アロー演算子(->)、ドット演算子(.)、添え字演算子([]) が入り混じった式は 見ずらいことに変わりない。 このために導入されたのが参照である。

最初にポインタを使ったプログラム例を示す。 '-' 演算子とアロー演算子に含まれる '-' が同じこともあり、式が見づらい。

// 1.ポインタ
long Distance_EUC_2D(Node* Na, Node* Nb) {
    double xd = Na->X - Nb->X, yd = Na->Y - Nb->Y;
    return sqrt(xd * xd + yd * yd) + 0.5;
}

C++ではこれを次のように記述することができる。 記述が変わるだけで、プログラムの動作は全く同じである。

アロー演算子を使わなくて済むため、C言語 に比べると C++ のプログラムは見やすくなる。

// 2.参照渡し
long Distance_EUC_2D(Node& Na, Node& Nb) {
    double xd = Na.X - Nb.X, yd = Na.Y - Nb.Y;
    return sqrt(xd * xd + yd * yd) + 0.5;
}

仮引数のデータ型を次のように記述してもエラーとはならない。 この場合、二つの関数の戻り値は同じとなる。 しかし、参照渡しではアドレスだけが引き渡されるのに対して、 値渡しの場合はNodeクラスのインスタンス全体が関数に引き渡される。 一般的には、大きなサイズのため、関数コールに時間がかかる。 関数の中で、クラスNodeの要素X、Yの値を変更しても、呼び出し元の実引数 Na、Nb には何も影響を与えない。 参照渡しの場合には、呼び出し元の実引数 Na、Nb に変更が反映される。

// 3.値渡し
long Distance_EUC_2D(Node Na, Node Nb) {
    double xd = Na.X - Nb.X, yd = Na.Y - Nb.Y;
    return sqrt(xd * xd + yd * yd) + 0.5;
}

ところで、Java や C# には、値渡しはなく、常に参照渡しである。このため、& がなくても参照渡しである。 C++ と Java/C# では記述方法が同じでも、意味に違いがあるため、注意しなければならない。

A.リファレンス

[1]