1つ、参照
1.1リファレンスコンセプト
参照は変数の新しい定義ではありませんが、既存の変数のエイリアスです。コンパイラは参照変数のメモリスペースを開かず、参照する変数と同じメモリスペースを共有します。
参照の書き込み形式:
类型& 引用变量名(对象名) = 引用实体;
例:intは参照タイプ、bは参照変数名、aは参照エンティティです。
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& b = a; //b是a的别名,b是a的引用,注意&符号在这里不是取地址!
cout<<&a<<endl;
cout<<"a="<<a<<endl;
cout<<&b<<endl;
cout<<"b="<<b<<endl;
b = 20;
cout<<&a<<endl;
cout<<"a="<<a<<endl;
cout<<&b<<endl;
cout<<"b="<<b<<endl;
return 0;
}
注:
参照タイプは、参照エンティティと同じタイプである必要があります。例:aの型がintの場合、参照型もintである必要があります。
1.2参照特性
-
参照は、定義時に初期化する必要があります
-
変数は複数の参照を持つことができます
-
エンティティを参照すると、他のエンティティを参照できなくなります
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& b = a; //1.引用在定义时必须初始化
//int& b; //没有初始化就会报错
int c = 20;
int& rc = c; //2.一个变量可以有多个引用
int& rrc = c;
int& rrrc = c;
int d = 30;
int& e = d;
//e = c; // 3.引用一旦引用一个实体,再不能引用其他实体
return 0;
}
1.3頻繁に引用される
- 参照型は、参照エンティティと同じ型である必要があります。
- 参照が初期化されて割り当てられると、権限を減らすことはできますが、拡大することはできません。
1.4使用シナリオ
- パラメータを作成する
void Swap(int& x, int& y)
{
int tmp = x;
x = y;
y = tmp;
}
2.戻り値を実行します
int& Count()
{
static int n = 0;
n++;
// ...
return n;
}
注:関数が関数のスコープ外に戻った場合、返されたオブジェクトがシステムに戻されていない場合は、参照による戻りを使用できます。すでにシステムに戻されている場合は、値で返す必要があります。
1.5値渡しと参照渡しの効率の比較
総括する:
- 値の受け渡しは、実際のパラメーターまたは戻り変数の一時的なコピーです。2つのコピーが発生します。パラメーターまたは戻り値の型が大きいと、非効率になります。
- 参照渡しは、実パラメータまたは戻り変数のエイリアスです。2つは同じメモリを共有し、コピーを保存するため、効率が高くなります。
1.6ポインタと参照の違い
- より文法的概念、参照がある別名参照エンティティの、そこには独立したスペースがありません、それはと同じ空間を共有し、参照エンティティ。ポインタは、独自の空間を有し、32ビットマシンと64ビットマシン用の8バイトのための4バイト。
- 実装の下部から、参照の実装は、独自のスペースを使用して、ポインターに従って実装されます。
- より定義、それが定義されたときに参照が初期化されなければならない、とポインタが初期化される必要はありません。
- 初期化の時点から、参照が初期化中にエンティティを参照した後は、他のエンティティを参照できなくなり、ポインタはいつでも同じタイプのいずれかを指すことができます。エンティティにはNULL参照はありませんが、 NULLポインタがあります。
- sizeofの意味は異なります。参照結果は参照型のサイズですが、ポインターは常にアドレス空間が占めるバイト数です(32ビットプラットフォームでは4バイト)。
- 操作、参照は、参照エンティティが1だけインクリメントされる1だけインクリメントされ、ポインタがインクリメントされ、すなわち、ポインタが一種類だけ後方にシフトされます
- マルチレベルのポインタはありますが、マルチレベルの参照はありません
- エンティティにアクセスする方法は異なり、ポインタは明示的に逆参照される必要があり、参照コンパイラはそれを単独で処理します
- 参照はポインタよりも比較的安全に使用できます