参照は C++ のデータ型で、既存の変数を使用して新しい名前またはエイリアスを作成し、このエイリアスを通じて元の変数の値にアクセスして変更できるようにします。参照の本質は、別名または変数の別名です。
記事ディレクトリ
基本的な文法
C++ の参照は、既存の変数を使用して新しい参照変数を作成できるようにするエイリアスです。参照は宣言時に初期化する必要があり、初期化されると他の変数を参照できなくなります。
引用符の基本的な構文は次のとおりです。
type &ref = variable;
このうち、type は参照の型、ref は参照変数の名前、variable は既存の変数です。
サンプルコード:
#include <iostream>
int main() {
int num = 10;
int &ref = num; // 创建一个整型引用ref,引用变量num
std::cout << "num: " << num << std::endl; // 输出:num: 10
std::cout << "ref: " << ref << std::endl; // 输出:ref: 10
ref = 20; // 修改引用变量ref的值,也会修改num的值
std::cout << "num: " << num << std::endl; // 输出:num: 20
std::cout << "ref: " << ref << std::endl; // 输出:ref: 20
return 0;
}
上の例では、整数変数 num を作成し、ref を使用してそれを参照しました。参照変数 ref の値を変更すると、num の値も変更されます。したがって、最後に出力されるnumとrefの値は両方とも20になります。
参照は単なるエイリアスであり、追加のメモリ空間を占有せず、既存の変数を指すだけであることに注意してください。参照は、関数にパラメーターを渡したり、関数の戻り値を渡したり、大きなオブジェクトのコピーを回避したりするなどのシナリオで非常に役立ちます。
引用に関する注意
-
参照は宣言時に初期化する必要があります。 参照は宣言時に初期化する必要があり、初期化されると他の変数を参照できなくなります。たとえば、
int &ref;
は間違っており、 と書かなければなりませんint &ref = num;
。 -
参照は一時変数を参照できません: 参照は一時変数を参照できません。つまり、参照を一時オブジェクトにバインドすることはできません。たとえば、
int &ref = 5;
は間違っています。 -
参照はバインドされた変数を変更できない: 変数が参照によってバインドされると、バインドされた変数は変更できません。たとえば、
int num1 = 10; int num2 = 20; int &ref = num1; ref = num2;
このコードは、num1 の値を num2 の値に変更する代わりに、num1 の値を 20 に変更します。 -
参照を関数パラメータとして使用する場合の注意: 参照が関数パラメータとして渡される場合、関数内で参照を変更すると元の変数に影響します。これを使用すると、関数が複数の値を返したり、渡されたパラメーターを変更したりする効果を実現できます。ただし、関数パラメーターが参照型の場合、渡されるパラメーターは定数や一時変数ではなく、変更可能な左辺値である必要があることに注意してください。
-
参照を関数の戻り値として使用する場合の注意事項: 参照は関数の戻り値として使用できますが、ローカル変数は関数が返された後に破棄されるため、返された参照はローカル変数を指すことができないことに注意してください。参照を返す場合は、必ず静的変数、グローバル変数、または new 演算子を介してヒープに割り当てられたメモリを返してください。
関数パラメータとしての参照
- 参照パラメータを通じて複数の値を返す: 関数が複数の値を返す必要がある場合、参照パラメータを使用できます。パラメータを参照することにより、関数は関数の戻り値を使用せずに、渡されたパラメータに計算結果を直接格納できます。これにより、一時変数を作成したり、結果を渡すためにポインターを使用したりする必要がなくなります。
たとえば、次の関数は 2 つの整数の合計と差を参照によって返します。
void calculateSumAndDifference(int a, int b, int& sum, int& difference) {
sum = a + b;
difference = a - b;
}
int main() {
int num1 = 10;
int num2 = 5;
int sum, difference;
calculateSumAndDifference(num1, num2, sum, difference);
std::cout << "Sum: " << sum << std::endl; // 输出:Sum: 15
std::cout << "Difference: " << difference << std::endl; // 输出:Difference: 5
return 0;
}
- 参照パラメータによって渡された変数を変更する: 参照パラメータによって、関数は渡された変数の値を変更できます。これにより、ポインターを使用して変数のアドレスを渡すことがなくなり、渡された変数を関数内で直接変更できるようになります。
たとえば、次の関数は、参照引数によって渡された整数変数を 2 倍にします。
void doubleNumber(int& num) {
num *= 2;
}
int main() {
int num = 10;
doubleNumber(num);
std::cout << "Doubled number: " << num << std::endl; // 输出:Doubled number: 20
return 0;
}
参照が関数パラメータとして使用される場合、渡されるパラメータは定数や一時変数ではなく、変更可能な左辺値である必要があることに注意してください。参照は既存の変数にバインドする必要があるためです。受信パラメータが定数または一時変数の場合、const 参照パラメータを使用してそれを受け取り、変更を避けることができます。
void printValue(const int& num) {
std::cout << "Value: " << num << std::endl;
}
int main() {
int num = 10;
printValue(num); // 输出:Value: 10
printValue(20); // 输出:Value: 20
return 0;
}
上の例では、printValue 関数は const 参照パラメーターを受け取ります。渡されたパラメーターが定数または一時変数であっても、const 参照を通じてその値にアクセスできますが、その値を変更することはできません。
引用の性質
参照の本質は、別名または変数の別名です。参照は C++ のデータ型で、既存の変数を使用して新しい名前またはエイリアスを作成し、このエイリアスを通じて元の変数の値にアクセスして変更できるようにします。
内部実装では参照はポインタを介して実装されるのが一般的ですが、参照を使用する場合はポインタの詳細を意識する必要がなく、プリミティブ変数と同様に参照を使用できます。コンパイラは、参照の基礎となるポインタ操作を自動的に処理します。
引用の性質は、次の特徴を通じて理解できます。
-
参照は宣言時に初期化する必要があり、初期化されると、参照がバインドされている変数は変更できません。これは、参照が常に同じ変数を指しており、別の変数に再バインドできないことを意味します。
-
参照は、バインドされている変数と同じメモリ空間を共有し、同じアドレスを指します。したがって、バインドされた変数の値は、参照を通じて直接アクセスして変更できます。
-
参照を使用すると、代入、関数への渡し、関数の戻り値として機能するなど、通常の変数と同様に操作できます。
-
参照は関数パラメータとして渡すことができ、複数の値を返す関数の効果を実装したり、渡されたパラメータを変更したりするために使用できます。
定数参照
定数参照は、参照によって定数オブジェクトにバインドされる参照です。定数参照を宣言する場合は、キーワード const を使用して参照型を変更します。これは、参照されるオブジェクトが定数であり、変更できないことを示します。
定数参照の主な特徴は次のとおりです。
-
定数参照は定数オブジェクトまたは非定数オブジェクトにバインドできますが、参照されたオブジェクトの値を定数参照を通じて変更することはできません。
-
関数パラメータに定数参照を使用すると、関数内の受信パラメータの変更を回避できます。
-
定数参照は、定数オブジェクト、非定数オブジェクト、および一時オブジェクトを受け取ることができます。
定数参照の例をいくつか示します。
void printValue(const int& num) {
std::cout << "Value: " << num << std::endl;
}
int main() {
int num1 = 10;
const int num2 = 20;
printValue(num1); // 输出:Value: 10
printValue(num2); // 输出:Value: 20
printValue(30); // 输出:Value: 30
return 0;
}
上記の例では、printValue 関数は定数参照パラメーターを受け取ります。このパラメーターは定数オブジェクト、非定数オブジェクト、および一時オブジェクトを受け取ることができます。パラメータは定数参照であるため、渡されたパラメータの値を関数内で変更することはできません。
関数パラメーターで定数参照を使用すると、渡されるパラメーターの変更を回避でき、定数参照では一時コピーを作成する必要がないため、プログラムのパフォーマンスも向上します。さらに、不必要なコピー操作を回避し、プログラムの効率を向上させるために、定数参照を使用することもできます。