references c
C ++で参照を宣言して使用する方法を理解します。
参照は、C ++プログラミング言語の主要な概念です。ポインタほど強力ではありませんが、それでも効率的なプログラムを作成するために使用できます。参照変数の主な用途は、関数にパラメーターを渡すことです。
人気のある「参照渡し」パラメータ受け渡し手法は、参照を利用します。このチュートリアルでは、参照とは何か、および参照を宣言して使用する方法を説明します。また、ポインタと参照の違い、および関数との間の参照の受け渡しについても説明します。
=> 完全なC ++チュートリアルリストについては、こちらをご覧ください。
学習内容:
参照とは何ですか?
参照は、変数のエイリアスまたは別の名前です。識別子を持つ変数が与えられた場合、この変数に別の識別子を提供して、この変数を元の名前または別の名前で参照できるようにすることができます。この「別名」は、参照と呼ばれるものです。
値が17の変数「i」があるとします。jが参照の場合、変数iと参照jのメモリ表現を以下に示します。
上の図に示すように、変数とそのエイリアス、つまり参照ポイントは同じ値を指します。
参照変数の宣言
参照は、「&」演算子を使用して宣言できます。
参照の宣言を以下に示します。
int a = 10; int& refvar = a;
したがって、上記のコードでは、値10の整数変数を宣言しました。次に、別の変数refvarを宣言し、それに変数を割り当てます。 refvarを宣言する際に、変数名の直前に&演算子を使用していることに注意してください。これは、refvarが既存の変数への参照であることを示しています。
変数名aを使用するか、参照名「refvar」を使用して、変数「a」を参照できます。
C ++の単純なマージソートプログラム
以下に、参照の簡単な例を示します。
#include #include using namespace std; int main() { int age = 22; int& numYears = age; double salary = 10000.00; double& wages = salary; cout<<'Age: '< 出力:
年齢:22歳
NumYears:22
給与:10000
賃金:10000
上記のコードでは、整数変数ageがあります。次に、年齢変数への参照整数変数numYearsを宣言します。タイプdoubleの別の変動給与があります。次に、変数salaryへの二重参照変数wagesを宣言します。
次に、変数を出力します。最初に年齢、次にその参照の後に給与とその参照が続きます。プログラムの出力を確認すると、変数とそれへの参照が同じ値を指していることがわかります。したがって、AgeとnumYears、および給与と賃金は同じ値になります。
参照対ポインタ
ポインタと比較すると、参照はより安全で使いやすいです。
ポインタと参照のいくつかの違いについて説明します。
- ポインタとは異なり、参照にnull値を含めることはできません。参照には値を割り当てる必要があります。
- 参照は、作成された瞬間に初期化されます。これとは異なり、ポインタはいつでも初期化でき、必ずしも宣言中に初期化できるとは限りません。
- ポインタは簡単に値に再割り当てできます。しかし、参考文献では、これを行うことはできません。変数の値が割り当てられると、つまり変数のエイリアスが作成されると、この参照に別の変数を割り当てることはできません。
- 無効な参照はありません。定義上、参照は変数のエイリアスであり、作成自体の間に初期化されます。したがって、参照が無効になり、後で具体的なデータ型を持つ変数が割り当てられる可能性はありません。対照的に、voidポインタを持つことができます。
上記のこれらの制限により、C ++の参照は、リンクリストのようなデータ構造では使用できません。 Javaでは、これらすべての制限や参照に対する制限がないことに注意してください。
関数への参照の受け渡し
関数に関する以前のチュートリアルでは、「参照渡し」パラメータ手法についてすでに説明し、この手法を使用した2つの数値の交換の例を見てきました。このセクションではこの手法の説明をスキップし、例としてもう一度スワップ関数のみを示します。
ただし、今回は数値を交換する代わりに、2つの文字列を交換します。
#include #include using namespace std; void swap(char * &str1, char * &str2) { char *temp = str1; str1 = str2; str2 = temp; } int main() { char *str1 = 'references'; char *str2 = 'pointers'; cout<<'str1 = '< 出力:
int c ++への文字
str1 =参照str2 =ポインタ
交換後…。
str1 =ポインタstr2 =参照
したがって、このプログラムでは、文字列(char *)をスワップ関数に渡します。仮パラメーターは、char *型の変数への2つの参照です。 2つの値が交換されると、パラメーターに参照/エイリアスを使用しているため、それらの変更が呼び出し元の関数に反映されることに注意してください。
参照を返す
関数からポインタを返すのと同じように、関数から参照を返すこともできます。関数から参照を返すと、戻り値への暗黙のポインターも返されます。このため、割り当ての左側で参照を返す関数を使用できます。
関数から参照を返す例を見てみましょう。
#include using namespace std; int myarray[] = {1, 0, 2, 3, 5}; int& setValues( int i ) //returns reference to the array { return myarray[i]; } int main () { cout << 'myarray before change' << endl; for ( int i = 0; i < 5; i++ ) { cout << 'myarray[' << i << '] = '; cout << myarray[i] << endl; } setValues(1) = 1; setValues(3) = 8; cout << 'Value after change' << endl; for (int i = 0; i < 5; i++ ) { cout<< 'myarray[' << i << '] = '; cout << myarray[i] << endl; } return 0; }
出力:
変更前のmyarray
myarray [0] = 1
myarray [1] = 0
myarray [2] = 2
myarray [3] = 3
myarray [4] = 5
変更後の値
myarray [0] = 1
myarray [1] = 1
myarray [2] = 2
myarray [3] = 8
myarray [4] = 5
同じもののスクリーンショットを以下に示します。
上記のコードに見られるように、参照と整数であるパラメーターを返す関数setValuesを定義します。関数内では、C ++の位置Iへの配列参照を返すだけです。
main関数では、配列の値を出力します。次に、setValues関数を使用して、配列内の2つの要素の値を変更します。ここでも、配列の値を出力します。
参照に関して注意しなければならないことの1つは、データが静的またはグローバルの場合にのみ、関数に参照を返すようにできることです。 C ++でローカル変数への参照を返すことは違法です。
結論
読者は、参照の主な用途はパラメーターを関数に渡すことであることに注意する必要があります。
今後のチュートリアルでは、C ++のオブジェクト指向プログラミングにジャンプする前に、C ++のラムダ関数/式について説明します。
=> ここで最高のC ++トレーニングチュートリアルをチェックしてください。
推奨読書