引用
语法
本质:引用在内部的实现是一个指针常量(指针指向不可修改,但指针指向的值可修改)
作用:即给变量起别名,即两者操作同一块内存
语法:<数据类型> &<别名> = <原名>
注意:
- 引用必须初始化
- 引用在初始化后不可改变
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int main(){
int a = 10;
int &b = a; // b 是 a 的引用
cout << "a: " << a << endl;
cout << "b: " << b << endl;
b = 20; // 修改 b 的值, a 的值也会改变
cout << "a: " << a << endl;
cout << "b: " << b << endl;
return 0;
}引用作为函数参数
作用:函数传参时可以让形参修饰实参
优点:简化指针修改实参
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
void Swap(int &a, int &b){ // 使用形参修饰实参
int temp = a;
a = b;
b = temp;
}
int main(){
int a = 10;
int b = 20;
Swap(a, b);
cout << "a: " << a << endl;
cout << "b: " << b << endl;
return 0;
}引用作为函数返回值
作用:
- 引用可以作为函数的返回值存在
- 函数的调用可以作为左值
不要返回局部变量引用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
// 函数返回引用
// 注意:返回局部变量的引用是危险的,因为局部变量在函数结束后会被销毁
int& test(){
static int a = 10; //静态变量,存在全局区
return a; // 返回局部变量的引用
}
int main(){
int &ref = test();
cout << "ref: " << ref << endl; // 输出 10
test() = 20; // 返回引用的函数的调用可以作为左值, 相当于直接对a赋值
cout << "ref: " << ref << endl; // 输出 20
return 0;
}## 常量引用
常量引用常用来修饰形参,防止误操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
void print(const int &val){
// 由于此处是引用,在函数内部对val进行修改,外部的b也会改变
// 形参前加const后,val变成了一个常量引用,内部val就不允许修改了
// val = 1000;
cout << val;
}
int main(){
int a = 10;
// 常量引用,相当于编译器自动创建了一个临时空间,并将ref指向该空间
// 此时不许修改
const int& ref = 10;
// 实际应用
int b = 100;
print(b);
}