【C++】引用の基本概念と利用シーン


序文

この記事では、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. 参照はポインタよりも比較的安全に使用できます。


要約する

この記事では、リファレンスの基本的な概念、特徴、使用シナリオ、およびポインタとリファレンスの違いを紹介します。この記事がお役に立てば幸いです。

おすすめ

転載: blog.csdn.net/weixin_63614711/article/details/130520168