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);