c++リファレンス極下層実装
1702 ワード
一、c++で参照される構文は次のとおりです.
int x = 100;
int& _x = x;
変数xに別名を付け、以降のコードで_xは実はxで、この2つは等価です.例えば、「唐伯虎点秋香」では、唐伯虎は華安と呼ばれ、9527と呼ばれていますが、実はこの3つの名前は同じ人で、引用はこの意味です.
注意事項:
初期化を参照するときは必ず変数をバインドします.
参照が初期化されると、一生この変数にサービスされます.
ローカル変数の参照を返すことはできません.ポインタのように、ローカル変数のポインタを返すことはできません.
二、引用のいくつかの応用
1、普通の引用
int x = 100;
int& _x = x;
ここでもう一つの問題はint&x=100です.このように書くと、コンパイラはエラーを報告し、定数の参照にはconst修飾を加えなければならない.const int&x=100.
2、関数としてのパラメータ
int max(int&x,int&y)は,実パラメータのコピーを行わず,効率を向上させる利点がある.
3、関数としての戻り値を参照
このような関数int max(int&x,int&y)については、int z=max(1,2)をこのように使用することができます.これは正常です.私たちはこのように使用していますが、max(1,2)=100は絶対に使用できません.すなわち,関数の戻り値は左値としてはならない.しかし、このようにint&max(jint&x,int&y)と書けば、max(1,2)=100という言葉はすぐに合理的です.
上記のコードが参照で接すると、出力のzとyはいずれも1000である、この行を接するために注釈が削除され、接するために接しない場合、出力のzとyは1231000である.
三、引用の実現
参照の特徴は、1つの参照が1つの変数を参照すると、他の変数を参照することはできませんが、参照された変数は再割り当てできます.上記の特徴に基づいて、2つのポインタを見てみましょう.
int x = 100;
1:int const * pi = &x;
2:int * const pi = &x;
最初のポインタは、このポインタpiが現在のバインドを解除して他のポインタにバインドできることを示しますが、バインドされたオブジェクトの値は再割り当てできません.つまりint y=100があればpi=&yは合法ですが*pi=200は合法ではありません.
第2のポインタは第1のポインタとは逆に*pi=200が合法であるがpi=&yは合法ではなく,この2つのポインタの性質によれば,第2のポインタは参照の実現である.
int x = 100;
int& _x = x;
変数xに別名を付け、以降のコードで_xは実はxで、この2つは等価です.例えば、「唐伯虎点秋香」では、唐伯虎は華安と呼ばれ、9527と呼ばれていますが、実はこの3つの名前は同じ人で、引用はこの意味です.
注意事項:
初期化を参照するときは必ず変数をバインドします.
参照が初期化されると、一生この変数にサービスされます.
ローカル変数の参照を返すことはできません.ポインタのように、ローカル変数のポインタを返すことはできません.
二、引用のいくつかの応用
1、普通の引用
int x = 100;
int& _x = x;
ここでもう一つの問題はint&x=100です.このように書くと、コンパイラはエラーを報告し、定数の参照にはconst修飾を加えなければならない.const int&x=100.
2、関数としてのパラメータ
int max(int&x,int&y)は,実パラメータのコピーを行わず,効率を向上させる利点がある.
3、関数としての戻り値を参照
このような関数int max(int&x,int&y)については、int z=max(1,2)をこのように使用することができます.これは正常です.私たちはこのように使用していますが、max(1,2)=100は絶対に使用できません.すなわち,関数の戻り値は左値としてはならない.しかし、このようにint&max(jint&x,int&y)と書けば、max(1,2)=100という言葉はすぐに合理的です.
#include
using namespace std;
int& getmax(int& x1,int& y1){
return x1 > y1 ? x1 : y1;
}
void main(){
int x = 10;
int y = 123;
//int z = getmax(x,y);
int& z = getmax(x,y);// ,
//int z = getmax(x, y);// , ,
getmax(x,y) = 1000;// z y
cout << z << endl;
cout << y <
上記のコードが参照で接すると、出力のzとyはいずれも1000である、この行を接するために注釈が削除され、接するために接しない場合、出力のzとyは1231000である.
三、引用の実現
参照の特徴は、1つの参照が1つの変数を参照すると、他の変数を参照することはできませんが、参照された変数は再割り当てできます.上記の特徴に基づいて、2つのポインタを見てみましょう.
int x = 100;
1:int const * pi = &x;
2:int * const pi = &x;
最初のポインタは、このポインタpiが現在のバインドを解除して他のポインタにバインドできることを示しますが、バインドされたオブジェクトの値は再割り当てできません.つまりint y=100があればpi=&yは合法ですが*pi=200は合法ではありません.
第2のポインタは第1のポインタとは逆に*pi=200が合法であるがpi=&yは合法ではなく,この2つのポインタの性質によれば,第2のポインタは参照の実現である.