参照変数は、それがすでに存在している別の変数の名前である、と言うことです別名、です。参照が変数に初期化されたら、参照名または変数を指すように変数の名前を使用することができます。
次のポインタとの違いに注意してください。
- null参照は存在しません。リファレンスは、正当なメモリに接続する必要があります。
- 参照がターゲットに初期化されると、それは他のオブジェクトに向けることができません。ポインタは、任意の時点で別のオブジェクトを指すことができます。
- 作成時に参考に初期化する必要があります。ポインタは、任意の時に初期化することができます。
参照によって渡されたパラメータの関数として、1、
以下を見てください:
#include <iostreamの> 使用して 名前空間STD; // 関数定義 ボイドスワップ(int型のx、int型のY) { int型のTEMP、 TEMP = X; / * Xアドレス値を保存* / X = Y; / * xとyのPUT * / Y = TEMP; / * Yに割り当てられたX * / リターン; } int型のmain() { // ローカル変数宣言 のint A = 100 ; INT B = 200である。 COUT<< " 交換前の値:" << A << ENDL; COUT << " 交換前に、B値:" << B << ENDL; / * 交換価値の関数呼び出し* / スワップ(A、 B); COUT << " 交換後の値:" << << ENDL; COUT << " 交換後、Bの値:" << B << ENDL; 戻り 0 ; }
恒常為替bの値、今回は、なぜ明らかにスワップ()関数を呼び出し、ABの値が変更されていませんか?あなたは次のことを知っている必要があります:
(1は、関数、Xの定義において、Yはメモリ宣言を占有しないパラメータであるが、唯一の引数は、値が、パラメータメモリに割り当てられている場合にのみ与えられます。
。(2、関数の本体には、いずれかのパラメータを変更するパラメータ引数の値を受け取るパラメータ引数の手の届かないところにある、意志引数ではありませんすぐに連絡先:
例えば上記ルーチン= 100、B = 200です。スワップ()関数を呼び出した後、X = 100、Y = 200(AB値を通過し、それらがXY接触を持たない後に)、スワップ()関数では、この時間は、XY値の交換が完了する。しかし、それは何の関係もしてABを持っていないので、ABの値は同じです。
それでは、どのようにb値の変更?以下のコードを参照してください。
#include <iostreamの> 使用して 名前空間STD; // 関数の定義が 無効スワップ(INT&X、INT&Y) { int型、TEMP TEMP = X; / * xのアドレス値を保存* / X = Yを; / * yがに割り当てX * / Y = TEMP; / * Yに割り当てられたX * / リターン; } int型のmain() { // ローカル変数宣言 のint A = 100 ; INT B = 200です。 COUT << " 交換前の値:" << A << ENDL; COUT << " 交換前に、B値:" << B << ENDL; / * 交換価値の関数呼び出し* / スワップ( 、B)、 COUT << " 交換後の値:" << << ENDL; COUT << " 交換B値、後:" << B << ENDL; 戻り 0 ; }
XYは、個々の名前から引用された参考文献を参照値の対応を追加しました。
上記のコード例は、Xと呼ばれる名前の個体から、B個々の名前に、Yと呼ばれます。したがって、XYの値を交換する過程は、実際に交換がABです。
図2に示すように、戻り値が組み込まれています
関数は暗黙のリターンへの参照を返す場合、ポインタ値が返されます。このように、それは代入文の左側に機能することができます。同様のダブル&setValues (int型I )。コードは以下の通りであります:
#include <iostreamの> 使用して名前空間STD; ダブルヴァルス[] = { 10.1、12.6、33.1、24.1、50.0 }; ダブル&setValues(INT I) { 戻り [I]ヴァルスを; //は、i番目の要素への参照を返します} //は、主機能上で定義された関数の呼び出しにINTをメイン() { COUT << " 値変更前の" << ENDL; のための(INT I = 0 ; I < 5 ; I ++ ) { COUT << " ヴァルス[ " << << I " ] = " ; COUT <<ヴァルス[I] << ENDL; } setValues(1 =)20.23 ; // の第2の要素に変更 (setValuesを。3)= 70.8。 // 第4要素の変更 COUT << " 値変更" << ENDLと、 のための(INT I = 0 ; I < 5。I ++ ) { coutの "<< ヴァルス[ " << I << " ] = " ; COUT <<ヴァルス[I] << ENDL; } 戻り0 ; }
得られた結果は以下のとおりです。
変更前の値 ヴァルス[ 0 ] = 10.1 ヴァルス[ 1 ] = 12.6 ヴァルス[ 2 ] = 33.1 ヴァルス[ 3 ] = 24.1 ヴァルス[ 4 ] = 50 変更値 ヴァルス[ 0 ] = 10.1 ヴァルス[ 1 ] = 20.23 ヴァルス[ 2 ] = 33.1 ヴァルス[ 3 ] = 70.8 ヴァルス[ 4 ] = 50
参照を返す場合は、参照されるオブジェクトへの注意を払うには、スコープを超えることはできません。ローカル変数への参照を返すようにすることは正当ではありませんので、しかし、静的変数への参照を返すことができます。
INT&FUNC(){ int型のQ; // 戻りQ ;! // エラーは、コンパイル時に発生する 静的 INT ; X 戻り Xの; // セキュリティは、機能Xが有効な外部スコープのまま }