目录
类型名 & 引用名 = 变量名;
上面这个写法就定义了一个变量名的引用。
举个例子:
int x = 0;
int & y = x;
此时 y 引用了x, y的类型是int &
变量的引用就等价于这个变量,简单来说,y就是x的别名。
举个代码例子,如下一目了然
- #include
- using namespace std;
-
- int main(){
- int x = 3;
- int & y = x;
- cout << y; // 3
- cout << x; // 3
- y = 5;
- cout << x; // 5
- return 0;
- }
注意📢,引用需要注意三点
ok,了解了注意的三点,看个例子加深理解
- int a=1,b=2;
- int & x = a;
- int & y = x;// 此时x和y都引用了a
- y = 10;
- cout << a << endl; //10
- y = b;
- cout << a << endl; //2
上面的例子需要稍微理解的是,当y=b的时候,此时是赋值,b的值给了y,但是y还是a的引用,所以此时a打印是2.
例题1.1
下面程序片段输出结果是什么?(答案会公布在评论区)
- int a = 1,b = 2;
- int & r = a;
- r = b;
- r = 7;
- cout << a << endl;
nice,恭喜各位已经对引用小有了解,那么接下来,带大家一起看一个简单的实战,让大家了解一下引用的妙处。
大家回忆一下,在c语言中,交换两个变量的值的函数如何写?如下
- void swap(int* a, int* b){
- int tmp;
- tmp = *a; *a = *b; *b = tmp;
- }
- int x,y;
- swap(&x,&y)
上面的代码是c实现x和y交换值的代码,是不是比较繁琐?再一起看看c++的引用
- void swap(int& a, int& b){
- int tmp;
- tmp = a; a = b; b = tmp;
- }
- int x,y;
- swap(x,y)
上面的写法是不是看上去清爽许多。
- int x =3;
- int & SetValue() { return x;}
- int main(){
- SetValue() = 10;
- cout << x; //10
- return 0;
- }
SetValue函数的返回值是引用,同时,这个引用了全局变量x,所以赋值的操作,就等于对x的赋值;这里埋一个坑,大家肯定会有人思考,为什么要把函数写在赋值号左边?这个操作有什么意义呢?莫急,待后面的章节中,和大家一起升级打怪后,会填坑的!
定义引用时,前加const关键字,就是常引用
int x;
const int & y = x;
y的类型就是const int &;是不是感觉很熟悉
那么它的作用是什么呢?就是不能通过修改常引用去修改引用的值;直白点借用上面的例子说就是,你不能通过给y赋值,来修改x的值,如下:
- int x=3;
- const int & y=x;
- y=200;//编译直接报错
- x=200;//ok
说一个工作中可能会遇到的的类似情况
常引用和非常引用的转换问题,const T & 和 const T是不同的类型,重要的是重复三遍哈!!!
T & 类型的引用或者T类型的变量可以用来初始化const T & 类型的引用
但是,const T & 类型的引用或者const T类型的常变量可以用来初始化 T & 类型的引用,除非进行强制类型转换。
例题1.2
下面程序片段哪个正确?(答案会公布在评论区)
- A) int n = 4;
- int & r = n * 5;
-
- B) int n = 6;
- const int & r = n;
- r = 7;
-
- C) int n = 8;
- const int & r1 = n;
- int & r2 = r1;
-
- D) int n = 8;
- int & r1 = n;
- const int r2 = r1;
好了,今天关于引用的部分就到此结束了哈,小白成神之路,刚刚开始~