記事ディレクトリ
序文
この記事では、C 言語と比較して C++ によって導入された新しい構文リファレンスを紹介します。–記事は主に以下から始まります引用の概念、見積書の使用シナリオまた、参照とポインタの違いを 3 つの側面に分けて紹介します。
1. 引用とは何ですか?
引用 私たちが友達にあだ名をつけるのと同じように、張三は彼の本名であり、ゴーダンは彼に付けられたあだ名です。Zhang San や Goudan に電話すると、この人が応答します。引用についても同様です。
参照は新しい変数を定義しませんが、既存の変数に別名を与えます。コンパイラは参照変数にメモリ領域を割り当てません。参照する変数と同じメモリ領域を共有します。
構文: 型 & 参照変数名 (エンティティ名のエイリアス) = エンティティ名
#include <iostream>
using namespace std;
int main()
{
int a = 0;
//b成为了a的别名,对b的赋值,加减等各种运算也会对a进行相应的改变
int& b = a;
//输出a和b两个变量的地址,可以看到是相同的,说明两个变量共用一块空间
cout << &b << endl;
cout << &a << endl;
return 0;
}
知らせ!参照型は参照されるエンティティと同じ型である必要があります
2. 引用の特徴
1. リファレンスを初期化する必要があります
#include <iostream>
using namespace std;
int main()
{
int a = 0;
//int& b;此处编译器会报错,引用必须初始化
int& b = a;
return 0;
}
2. 参照がエンティティを参照すると、他のエンティティを参照することはできません。
初心者は、次のコードが b の参照 c へのリダイレクトを実装しているとよく考えますが、実際にはコピー関数を実装しているだけです。
#include <iostream>
using namespace std;
int main()
{
int a = 0;
int c = 1;
int& b = a;
b = c;//把c的值赋给了b
return 0;
}
3. エンティティは複数の参照を持つことができます
#include <iostream>
using namespace std;
int main()
{
int a = 0;
//b和m都是a的引用
int& b = a;
int& m = a;
return 0;
}
4.定数基準
#include <iostream>
using namespace std;
int main()
{
const int a = 10;
//这条语句会报错是因为,a为常量
//当我们用非常量类型的b去作为a的引用,则a的内容可能会因为b的改变而被修改
//为了避免这样的情况发生,我们必须用同为常量的类型作为a的引用
//int& b = a;
const int& b = a;
return 0;
}
3. 参考利用シーン
1.パラメータを作成する
//这样就可以不使用指针而实现两个数的交换
void Swap(int& a, int& b)
{
int tem = a;
a = b;
b = tem;
}
2.戻り値を作る
//这样就返回了静态变量c的引用
int& test()
{
static int c = 5;
c++;
return c;
}
知らせ!変数がスコープ外に出て破棄されると、以下に示すように、その参照を返すことができなくなります。
int& test()
{
int c = 5;//c出了函数会被销毁,所以不能返回它的引用
c++;
return c;
}
4. 参照とポインタの違い
1. 文法レベル
ポインタは、指す変数のアドレスを格納するためにメモリ空間を開きます。
参照は別名であり、独立したスペースはなく、参照の主題はスペースを共有します。
次のコードから、参照変数とエンティティのアドレスがスペースを共有していることがわかります。
#include <iostream>
using namespace std;
int main()
{
int a = 4.0;
int& b = a;
cout << "&a = " << &a << endl;
cout << "&b = " << &b << endl;
return 0;
}
2. 基本的な実装
基礎となる実装では、参照は実際にはポインターの形式で実装されます。
次のコードをアセンブリ コードに変換して、ポインターと参照が内部で同じ方法で実装されていることを確認します。
#include <iostream>
using namespace std;
int main()
{
int a = 4;
int& b = a;
b = 10;
int* pa = &a;
*pa = 10;
return 0;
}
3. その他の相違点
1. 参照は概念的に変数の別名を定義し、ポインタは変数のアドレスを格納します。
2. 参照は定義時に初期化する必要があり、ポインターの要件はありません。
3. 初期化中に参照がエンティティを参照した後は、他のエンティティを参照することはできず、ポインタはいつでも
同じタイプのエンティティを指すことができます。
4. sizeof の意味は異なります。参照結果は参照型のサイズですが、ポインタは常にアドレス空間が占有するバイト数です。
6. 参照がインクリメントされます。つまり、参照されるエンティティが 1 ずつ増加します。また、ポインタがインクリメントされます。つまり、ポインタが型のサイズだけ後方にオフセットされます。
7. マルチレベル ポインタはありますが、マルチレベル参照はありません。
8. エンティティへのアクセス方法が異なり、ポインタを明示的に逆参照する必要があり、参照コンパイラがそれを単独で処理します。
9. 参照はポインタよりも比較的安全に使用できます。
要約する
この記事では、リファレンスの基本的な概念、特徴、使用シナリオ、およびポインタとリファレンスの違いを紹介します。この記事がお役に立てば幸いです。