最近在B站上看清华大学C++课程,学习到了一个“引用类型”的概念。
引用类型
-
引用(&)是标识符的别名
-
定义一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象
-
例如:
int i,j;
int &ri = i; //定义int引用ri,并初始化为变量i的引用j = 10
ri = j; //相当于i=j -
一旦一个引用被初始化后,就不能改为指向其他对象
-
引用可以作为形参,可以实现参数的双向传递
示例:输入两个整数交换后输出
值传递
#include <iostream>
using namespace std;
void swap(int a, int b){
int t = a;
a = b;
b = t;
}// a,b是形参,只存在swap函数中,在main函数中就不存在了
int main(){
int x = 5, y = 10;
cout << "x = " << x << " y = " << y << endl;
swap(x, y);
cout << "x = " << x << "y = " << y << endl;
//由于传递的是形参,所以x,y的值并不会发生变化
}
最终输出的结果:
x = 5 y = 10
x = 5 y = 10
为什么经过swap函数交换之后x,y的值没有发生变化呢?
引用传递
在swap函数中采用“引用传递”的方法,则可以实现交换两个整数的目的。
#include <iostream>
using namespace std;
void swap(int &a, int &b){
int t = a;
a = b;
b = t;
}// a,b是形参,只存在swap函数中,在main函数中就不存在了
//但是在a,b前面加上引用&,则可以改变x,y的值
int main(){
int x = 5, y = 10;
cout << "x = " << x << " y = " << y << endl;
swap(x, y);
cout << "x = " << x << "y = " << y << endl;
//由于传递的是形参,所以x,y的值并不会发生变化
}
这时的输出结果为:
x = 5 y = 10
x = 10 y = 5
为什么会出现这样的结果呢:
因为通过引用传递,将实参变量x/y与形参变量a/b结合起来,虽然x/y在swap子函数中是"看不见"、“用不了”,但它们的别名a/b在子函数中是有效的,即使a/b离开了作用域(子函数),但由于参数被双向传递,导致main中的x/y的值也被真实地改变了。