参照 (C++)
参照は、ポインターと同じように、メモリ内の他の場所に位置するオブジェクトのアドレスを格納します。 参照は、ポインターとは異なり、初期化された後で別のオブジェクトを参照するように指定したり、null に設定したりすることはできません。 参照には、左辺値参照 (名前が付いた変数を参照する) と、右辺値参照 (一時オブジェクトを参照する) という 2 種類の参照があります。 & 演算子は左辺値参照を示し、&& 演算子は、コンテキストによって右辺値参照またはユニバーサル参照 (右辺値または左辺値) を示します。
参照は次の構文を使用して宣言できます。
[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier] declarator [=expression];
参照を指定する任意の有効な宣言子を使用できます。 参照が関数または配列型への参照でない限り、次の簡略化された構文が適用されます。
[storage-class-specifiers] [cv-qualifiers] type-specifiers [& or &&] [cv-qualifiers] identifier [=expression];
参照は次の順序で宣言します。
宣言指定子:
ストレージ クラスの指定子 (省略可能)。
オプションで
const
やvolatile
の修飾子があります。型指定子: 型の名前。
宣言子:
オプションの Microsoft 固有の修飾子。 詳細については、「Microsoft 固有の修飾子」を参照してください。
& 演算子または && 演算子。
オプションで
const
やvolatile
の修飾子があります。識別子。
初期化子 (省略可能)。
配列と関数へのポインターに対するより複雑な宣言子の形式は、配列と関数の参照にも適用されます。 詳細については、「ポインター」を参照してください。
1 つの宣言指定子の後のコンマ区切りリストに、複数の宣言子と初期化子を含めることができます。 次に例を示します。
int &i;
int &i, &j;
次のように、参照、ポインター、およびオブジェクトをまとめて宣言できます。
int &ref, *ptr, k;
参照は、オブジェクトのアドレスを保持しますが、構文的にはオブジェクトと同様に動作します。
次のプログラムでは、オブジェクトの名前 s
とオブジェクトへの参照 SRef
を、プログラム内で同じように使用できることに注意してください。
例
// references.cpp
#include <stdio.h>
struct S {
short i;
};
int main() {
S s; // Declare the object.
S& SRef = s; // Declare and initialize the reference.
s.i = 3;
printf_s("%d\n", s.i);
printf_s("%d\n", SRef.i);
SRef.i = 4;
printf_s("%d\n", s.i);
printf_s("%d\n", SRef.i);
}
3
3
4
4