参照およびアドレス&演算子の使用方法について
2846 ワード
C言語に慣れたプログラマーの目には、&という記号の意味はアドレスとビットを取って演算することですが、C++では、&が重荷されているという意味で、引用です.
ここではビットと演算を紹介しません.まずアドレスを取る演算を紹介します.ポインタを勉強するときはアドレスを取る記号を使っています.変数の前に&を付けるといいです.
次に、参照について説明します.簡単に言えば、参照は被引用変数の別の名前です.参照値を変更すると、被引用値も変更されます.これらの2つは同じ値です.また、参照はオブジェクトから離れて単独で存在することはできません.参照はオブジェクトに依存して存在します.参照は定義後に使用される可能性があります.したがって、リファレンスはオブジェクトなしではいけないので、リファレンスは定義時に初期化する必要があります.
参照は変数の別名であるため、char&int型の変数を付与できないなど、あるタイプの参照を別のタイプのオブジェクトにバインドすることはできません.ただし、同じタイプ間の参照はバインドを切り替えることができます.
次に、参照とアドレスの区別について説明します.このように、参照の&は定義にのみ表示され、変数タイプ(クラス)名の後ろ(ポインタと似ている)に表示され、次のコードでは&記号は表示されず、参照定義の名前を直接使用するだけで、アドレス記号を取るにはクラス名をバインドする必要はありません.変数(オブジェクト)の左側に直接&を書けばいいです(変数はポインタや参照でも構いませんが、変数です).
なぜ引用があるのか、C++のような効率を重視する言語では、必然的にこのようなタイプが必要ですが、関数を呼び出すときは、パラメータをすべてコピーしなければなりません.これにより、時間と空間が浪費されますが、関数リストのパラメータをこのタイプの参照に変更すると、コンパイラはオブジェクト全体をコピーしません.オブジェクトのアドレスを渡すだけで、関数では実パラメータ自体を使用し、値を変更することができます.
注意関数を呼び出すときはオブジェクト名をそのまま使用すればよいので、もう1つ追加しないでください.そうすると、転送先になります(上記参照).
ここでは、なぜ定数を参照に割り当てることができないのかについて説明します.ここでは、左と右の概念を導入する必要があります.文字通り、左の値と右の値を正確に理解することはできません.オブジェクトの用途から言えば、右の値はオブジェクトの中の内容で、オブジェクトが格納されている位置(メモリの中)を気にしないで、左の値は内容も格納されている位置を必要とします.文から言えば、左の値は、付与式の左側に位置して付与することができ、右の値はそうではなく、存在時間から言えば、左の値は役割ドメイン内にずっと存在し、右の値は使用後すぐに破棄されます.以上のことから,左値は使用場面で右値より多く,右値の代わりにもなるが,右値は左値の代わりにはならない.定義された組み込み型変数、オブジェクト、ポインタ、参照などは左の値であり、定数、文字列定数、変数間演算後の値(i=i+5ではなくi+5)、関数が返す非参照値などは右の値です.これがint&ri=5が不正である理由です.参照は左にバインドする必要があります.右の値は(&)を参照して議論を見合わせます.
ここでも引用の基本的な認識と使い方を理解しているだけで、後でゆっくり更新します.
ここではビットと演算を紹介しません.まずアドレスを取る演算を紹介します.ポインタを勉強するときはアドレスを取る記号を使っています.変数の前に&を付けるといいです.
int i = 0 , *pi = &i; // pi i
int ** p_pi = π // p_pi pi
cout << &i << endl
<< &pi << endl << &p_pi; //
次に、参照について説明します.簡単に言えば、参照は被引用変数の別の名前です.参照値を変更すると、被引用値も変更されます.これらの2つは同じ値です.また、参照はオブジェクトから離れて単独で存在することはできません.参照はオブジェクトに依存して存在します.参照は定義後に使用される可能性があります.したがって、リファレンスはオブジェクトなしではいけないので、リファレンスは定義時に初期化する必要があります.
int i = 0 , &ri = i; //
ri++; // i 1
//int &ri2; , ri2 ,
//ri2 = i;
//int &ri3 = 10;
// , ,
参照は変数の別名であるため、char&int型の変数を付与できないなど、あるタイプの参照を別のタイプのオブジェクトにバインドすることはできません.ただし、同じタイプ間の参照はバインドを切り替えることができます.
int i = 0 , j = 0;
//char &rc = i; ,
int & ri = i; // , ri i
ri = j; // , ri j
次に、参照とアドレスの区別について説明します.このように、参照の&は定義にのみ表示され、変数タイプ(クラス)名の後ろ(ポインタと似ている)に表示され、次のコードでは&記号は表示されず、参照定義の名前を直接使用するだけで、アドレス記号を取るにはクラス名をバインドする必要はありません.変数(オブジェクト)の左側に直接&を書けばいいです(変数はポインタや参照でも構いませんが、変数です).
int i = 0;
int &ri = i , *pi = &i; // & , ,
cout << ri << endl; // i
cout << &i << endl; // i
cout << &ri << endl; // ri
cout << &pi << endl; // pi
なぜ引用があるのか、C++のような効率を重視する言語では、必然的にこのようなタイプが必要ですが、関数を呼び出すときは、パラメータをすべてコピーしなければなりません.これにより、時間と空間が浪費されますが、関数リストのパラメータをこのタイプの参照に変更すると、コンパイラはオブジェクト全体をコピーしません.オブジェクトのアドレスを渡すだけで、関数では実パラメータ自体を使用し、値を変更することができます.
void reference_test(int &i){ // , !
cout << i <
注意関数を呼び出すときはオブジェクト名をそのまま使用すればよいので、もう1つ追加しないでください.そうすると、転送先になります(上記参照).
int i = 5;
reference_test(i); // ,i 0
//reference_test(10); , 10
//reference_test(&i); , &i i , int
ここでは、なぜ定数を参照に割り当てることができないのかについて説明します.ここでは、左と右の概念を導入する必要があります.文字通り、左の値と右の値を正確に理解することはできません.オブジェクトの用途から言えば、右の値はオブジェクトの中の内容で、オブジェクトが格納されている位置(メモリの中)を気にしないで、左の値は内容も格納されている位置を必要とします.文から言えば、左の値は、付与式の左側に位置して付与することができ、右の値はそうではなく、存在時間から言えば、左の値は役割ドメイン内にずっと存在し、右の値は使用後すぐに破棄されます.以上のことから,左値は使用場面で右値より多く,右値の代わりにもなるが,右値は左値の代わりにはならない.定義された組み込み型変数、オブジェクト、ポインタ、参照などは左の値であり、定数、文字列定数、変数間演算後の値(i=i+5ではなくi+5)、関数が返す非参照値などは右の値です.これがint&ri=5が不正である理由です.参照は左にバインドする必要があります.右の値は(&)を参照して議論を見合わせます.
int i = 0 , &ri = i , *pi = &i; //
// ,
//ri = 10;
//ri = i + 5;
//ri = return_int(); return_int int
ここでも引用の基本的な認識と使い方を理解しているだけで、後でゆっくり更新します.