目录
前言
引用
1.引用的概念
2.引用特性
3.引用的权限
4. 使用场景
4.1 做参数
4.2 做返回值
5.引用和指针的区别
前言
相信大家都看过水浒传,里面的英雄人物除了自己的名字外都有自己的称号,比如:花和尚——鲁智深,豹子头——林冲……,这里我们发现我们人都有自己的别名,那么变量呢,其实变量也有给自己取别名的功能,那么小编今天就给大家介绍一下这个功能。
引用
1.引用的概念
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& c=a;//这里指的是c是a的引用类型
cout << c << endl;
}
注意:引用类型必须和引用实体是同种类型的 。
2.引用特性
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& c=a;
int& b = a;
int& d = a;
cout << c << endl;
cout << b << endl;
cout << d << endl;
}
这里我们运行一下:
3.引用的权限
对于引用的权限,我们只能进行权限的平移或者缩小,不能进行放大操作,那么这里具体指的是什么意思呢?这里大家跟着我一起理解一下。
这里我们要使用到const关键字,这里的作用就是让变量具有常数性质,也就是我们不能够去改变此变量的权限,也就是将一个变量的权限缩小了。
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& c=a;//权限平移
const int& d = a;//权限缩小
cout << c << endl;
cout << d << endl;
}
这里我们运行一下看看有没有什么问题:
那么这里我们再看看权限放大会出现什么情况:
#include<iostream>
using namespace std;
int main()
{
const int a = 10;
int& b = a;
}
这里我们运行看看结果:
这里我们看到这里出现了问题,所以我们这里的是不能进行权限放大的操作的.
但是这里还有一个特殊场景:
这里小编给大家写一串代码:
#include<iostream>
using namespace std;
int fun(int a, int b)
{
return a + b;
}
int main()
{
double a = 1.1;
int& b = a;
return 0;
}
运行一下,我们发现:
这里涉及到隐式转换,大家不明白的话可以去看看小编另外一篇关于隐式转换文章的介绍,这里我们看到这里提示我们是非常量限定,这是什么原因呢?在C语言发生隐式转换的时候,该实际上是创建一个临时变量,然后将我们需要转换的值拷贝到临时变量,然后赋值给其他变量,但是我们的临时变量具有常数性质,既然临时变量具有常数性质,那么我们发生这样也就使其权限变大,这样就导致了其错误产生。所以我们在发生整型转换的过程中使用引用就需要我们加上const,也就是:
4. 使用场景
既然我我们已经学习
4.1 做参数
#include<iostream>
using namespace std;
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
int main()
{
int a = 10;
int b = 20;
Swap(a, b);
cout << a << endl;
cout << b << endl;
return 0;
}
这里我们用引用类型写一个交换函数,这里我们看结果:
4.2 做返回值
#include<iostream>
using namespace std;
int& Count()
{
static int n = 0;
n++;
return n;
}
int main()
{
cout << Count()<< endl;
return 0;
}
这里我们返回值是n的引用类型,所以我们得到的是和n使用同一块地址的引用类型,该返回结果如下:
这里我们再看一个例子:
#include<iostream>
using namespace std;
int& Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int& ret = Add(1, 2);
Add(3, 4);
cout << "Add(1, 2) is :" << ret << endl;
return 0;
}
这里按照函数逻辑,大家可能都知道这里我们得到的值是3,那么我们这里运行一下:
这里我们发现我们虽然我们接收的是我们第一次函数的返回值,但是我们得到的是第二次调用的返回值,这是什么原因呢?大家接下来请听小编细细给大家解释:
首先我们要明白,这里的返回值是变量c的别名,这里我们由于我们的ret变量也是引用类型,所以这里我们ret也是变量c的别名,所以我们ret实际上和c共用同一块空间,但是这里我们需要考虑一点就是当函数结束调用后,我们变量c是会被销毁的,但是这里ret依然记录的是原先c变量的址,那么我们这里就需要考虑编译器调用结束后是否会马上对函数栈帧进行清理,如果没进行清理那么该得到的值将会恰好正确,但是如果进行了清理那么我们得到的值就是随机的。
那么这里很明显,这里我们并没有对函数栈帧进行清理,那么我们又是怎么得到:7这个值的呢?这里我们由于ret记录的是变量c的地址,由于我们的编译器没有及时清理函数栈帧,所以我们得到ret地址的值是5,由于再次调用同个函数,由于这次调用的函数和之前的函数是同一个函数,所以我们ret的地址和该函数中变量c是恰好是同一个地址,所以ret的内容也就是此时变量c的内容,所以得到了7这个值,那么如果我们调用了其他函数后我们ret的值是多少呢?
#include<iostream>
using namespace std;
int& Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int& ret = Add(1, 2);
printf("haha");
cout << "Add(1, 2) is :" << ret << endl;
return 0;
}
运行之后看结果:
这里就很明显的说明了ret是变量c引用,但是c是其他函数的函数栈帧中。
所以这里我们对于其使用做一个小小的总结:
1.基本任何场景都可以用引用传参。
2.谨慎使用引用做返回值,出了作用域,对象不在了,就不能用引用返回,还在就可以使用引用返回
既然这里我们涉及到引用类型做形参以及返回类型,那么对于我们正常的传参和返回,它的优势又在哪里呢?文章来源:https://www.toymoban.com/news/detail-424143.html
5.引用和指针的区别
这里我给大家罗列一些其区别:文章来源地址https://www.toymoban.com/news/detail-424143.html
到了这里,关于C++之引用的介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!