C++ エントリの基礎 Chapter08 リファレンス

1. 基本的な使い方
機能: 変数の
エイリアス 構文: データ型 & エイリアス = 元の名前

int a = 10;
int& b = a;
b = 20;
//a的值为20
cout << "a = " << a << endl;

2. 参照に関する注意事項
注: 参照は宣言時に直接初期化する必要があり、一度初期化されると値を変更することはできません。

int a = 10;
int& b = a;

初期化後に参照を変更することはできません。

int c = 20;

cout << a << "\t" << b << "\t" << c << "\t" << endl;

出力結果:10 10 20

b = c;//参照を変更するのではなく、代入操作

cout << a << "\t" << b << "\t" << c << "\t" << endl;

出力結果:20 20 20

b = 11;
cout << a << "\t" << b << "\t" << c << "\t" << endl;

出力結果:11 11 20

3. 参照を関数パラメータとして使用する
機能: 関数内でパラメータを渡すときに、参照テクノロジを使用して、仮パラメータによって実際のパラメータを変更できるようにすることができます。 利点: 実パラメータ
のポインタ変更を簡素化できます。

//交換関数:

1) 価値の移転

void MySwap01(int a, int b) 
{
	int temp = a;
	a = b;
	b = temp;

	cout << "MySwap01值传递" << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
}

2)アドレス移転

void MySwap02(int *a, int *b)
{
   	int temp = *a;
    *a = *b;
    *b = temp;
        
	cout << "MySwap02 地址传递" << endl;
	cout << "a = " << *a << endl;
	cout << "b = " << *b << endl;
}

3) 参照渡し

void MySwap03(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;

	cout << "MySwap03 引用传递" << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
}

関数実装呼び出し:

	int a = 10;
	int b = 20;

	MySwap01(a, b);

	cout << endl;
	cout << "Main 值传递" << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	cout << endl;*/

	//地址传递:形参会修饰实参
	/*int c = 10;
	int d = 20;

	MySwap02(&c, &d);

	cout << endl;
	cout << "Main 地址传递" << endl;
	cout << "c = " << c << endl;
	cout << "d = " << d << endl;

	cout << endl;*/

	//引用传递:形参会修饰实参
	/*int e = 10;
	int f = 20;

	MySwap03(e, f);

	cout << endl;
	cout << "Main 地址传递" << endl;
	cout << "e = " << e << endl;
	cout << "f = " << f << endl;

4. 参照は関数の戻り値として使用されます
。 関数: 参照は関数の戻り値として存在できます
。 注: ローカル変数参照を返さないでください。
参照は関数の戻り値として使用されます。

//1、不要返回局部变量引用
int& test1()
{
	int a = 10;//局部变量存放在四区的 栈区
	return a;
}

//2、函数调用可以作为左值
int& test2() {
	static int a = 10;//静态变量
	return a;
}


int& ref = test1();

コンパイラが予約したため、初めて結果が正しくなったとき

cout << "ref = " << ref << endl;

2 回目は a のメモリが解放されたために結果が間違っています

cout << "ref = " << ref << endl;

出力結果: 2 番目の ref 値が文字化けする

ref = 10
ref = 258067424

使用法: 関数呼び出しは左辺値として使用できます。

int& ref2 = test2();
cout << "ref2 = " << ref2 << endl;
//输出结果:无论输出多少次都没有问题
ref2 = 10

test2() = 1000;//如果函数的返回值是引用,这个函数调用可以作为左值
cout << "ref2 = " << ref2 << endl;
//输出结果:无论输出多少次都没有问题
ref2 = 1000

5.
参照の本質 本質: 参照の本質は C++ の内部でポインタ定数として実装されています
PS: 参照であることがわかり、 int* const ref = &a; に変換されます。

void func(int& ref)
 {
	ref = 100;
}

int a = 10;

int* const ref = &a; への自動変換
ポインタ定数へのポインタは変更できません。これは、参照が変更できない理由も説明します。

int& ref = a;
ref = 20;//内部发现ref是引用,自动帮我们转换为:*ref = 20;

//cout << "a = " << a << endl;
//cout << "ref = " << ref << endl;

//func(a);

6. 定数参照の
使用シナリオ: 誤操作を防ぐために仮パラメータを変更するために使用されます。

//定数参照(印刷データ関数)

void showValue(const int &val) 
{
	//此时无法再对参数val进行值修改
	cout << "val = " << val << endl;
}

int a = 10;

//语法错误:引用必须引一块合法的内存空间
int& ref = 10;

//加上const之后 编译器将代码修改为
int temp = 10; const int& ref = temp;
const int& ref = 10;
//报错信息:表达式必须是可修改的左值
ref = 20;//加入const之后变为只读,不可以修改

//函数利用常量引用防止误操作修改实参
int a = 10;
showValue(a);

おすすめ

転載: blog.csdn.net/qq_43036676/article/details/100544050