C ++エレメンタリー-詳細リファレンス

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参照特性

  1. 参照は、定義時に初期化する必要があります
    ここに画像の説明を挿入します

  2. 変数は複数の参照を持つことができます
    ここに画像の説明を挿入します

  3. エンティティを参照すると、他のエンティティを参照できなくなります
    ここに画像の説明を挿入します

#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. 参照型参照エンティティと同じ型である必要あります
    ここに画像の説明を挿入します
  2. 参照が初期化されて割り当てられると、権限を減らすことはできますが、拡大することはできません
    ここに画像の説明を挿入します

1.4使用シナリオ

  1. パラメータを作成する
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値渡しと参照渡しの効率の比較

ここに画像の説明を挿入します
総括する:

  1. 値の受け渡しは、実際のパラメーターまたは戻り変数の一時的なコピーです。2つのコピーが発生します。パラメーターまたは戻り値の型が大きいと、非効率になります。
  2. 参照渡しは、実パラメータまたは戻り変数のエイリアスです。2つは同じメモリを共有し、コピーを保存するため、効率が高くなります。

1.6ポインタと参照の違い

  1. より文法的概念、参照がある別名参照エンティティの、そこには独立したスペースがありません、それはと同じ空間を共有し、参照エンティティポインタは、独自の空間を有し、32ビットマシンと64ビットマシン用の8バイトのための4バイト。
  2. 実装下部から、参照の実装は、独自のスペースを使用して、ポインターに従って実装されます。
  3. より定義、それが定義されたときに参照が初期化されなければならない、とポインタが初期化される必要はありません。
  4. 初期化の時点から、参照初期化中にエンティティを参照した後は、他のエンティティを参照できなくなり、ポインタはいつでも同じタイプのいずれかを指すことができます。エンティティにはNULL参照はありませんが、 NULLポインタがあります
  5. sizeof意味は異なります。参照結果は参照型のサイズですが、ポインターは常にアドレス空間が占めるバイト数です(32ビットプラットフォームでは4バイト)。
  6. 操作参照は、参照エンティティが1だけインクリメントされる1だけインクリメントされ、ポインタがインクリメントされ、すなわち、ポインタが一種類だけ後方にシフトされます
  7. マルチレベルのポインタはありますが、マルチレベルの参照はありません
  8. エンティティにアクセスする方法は異なり、ポインタは明示的に逆参照される必要があり、参照コンパイラはそれを単独で処理します
  9. 参照はポインタよりも比較的安全に使用できます

おすすめ

転載: blog.csdn.net/qq_40076022/article/details/113529860