提示:我是菜狗,请勿借鉴,概率出错,欢迎指正。
目录
前言
啊,引用,我敬爱你啊!C++的引用可比C语言那b指针简单多了。虽然引用比起指针而言,泛用性稍差,但是对于我这种粗心大意的程序员(学员也是员)而言,它对代码可读性的提升,就像老头对苍穹的依赖,大大提升了我调试代码的效率,好用的不得了。当然了,引用好归好,其背后也有一些坑,我在后面会讲。
提示:以下是本篇文章正文内容,下面案例可供参考
一、引用的概念(不敢用定义了,怕误人子弟)
AI:点击查看
我的理解:引用引用,先引后用。引用的本质就是取外号,取字。什么意思呢?打个比方:曹操是魏武帝,曹操病死,魏武帝病死。这里就进行了引用,给曹操取了魏武帝的名号,那么曹操与魏武帝本质是同一个人,两者可以完全对等(完全对等说明引用类型必须和引用实体是一样类型的)。
代码仙子更有发言权:
int a = 0;
int& b = a;
二、引用的特性
1.引用在定义时必须初始化
代码仙子更有发言权:
int a = 0;
int& b;
2.一个变量可以有多个引用
代码仙子更有发言权:
int a = 0;
int& b = a;
int& c = a;
int& d = a;
那这里可能有道友要问了:“可不可以给引用取引用呢?”答案是:可以。
代码仙子更有发言权:
int a = 0;
int& b = a;
int& c = b;
3.引用不可更改引用对象实体
引用就是一名纯爱战士,不出意外的话,一旦认定了对象实体,就白首永不分离,可以说是非常滴浪漫啊。当然,就算你想去更改,也是没有法子的。也许会有大聪明道友写出下面的例子,觉得怎么改不了呢。
代码仙子更有发言权:
int a = 0;
int x = 1;
int& b = a;
b = x;
如果你去输出或者调用监视查看变量b的值,会发现b=1,那么是否说明x牛走了属于a的b呢?其实不然。假如是验证更细心的道友就会发现,a=1。原来,因为b与a本就是同一个人的不同名字,b=x等价于a=x,这里本质就是赋值操作。
三、常引用
引用const修饰的变量或者常量就是常引用,而常引用是一个很容易出错的地方。
代码仙子更有发言权:
const int a = 0;
//int& b = a;
const int& b = a;
//int& c = 0;
const int& c = 0;
其中标记为注释的地方就是常见的错误。
四、使用场景
1.做参数
引用既可以代替指针作为参数传入函数,使得引用所指的对象实体可以在函数内部改变,也可以代替需要传参的变量本身作为参数传入函数,使得程序效率提升(提升的原因是免去了原本变量传参所需拷贝的步骤,节约了空间和时间),从这就不难看出引用的优秀。
2.做返回值
这是引用最复杂的知识点,也是最容易出现纰漏的地方!
首先,引用是依存于对象实体的,如果对象实体被销毁,那么引用就类似于野指针,其内部的值是随机的。
代码仙子更有发言权:
int& Add(int a,int b)
{
int c = 0;
c = a + b;
return c;
}
看起来好像函数最后返回了c的值作为对象实体,实则不然。根据编译器的不同,返回的值是不同的,但有一点一样,它们都是不合法的值,是不允许被访问的值,因为存储它们的空间已经随着函数的结束被释放了。由此可以得出结论,可以使用引用作为返回值的函数,要求返回的对象实体出了函数作用域依旧存在。
验证也非常简单,将上面的函数调用2次,分别输出结果,可知分晓,在此不一一罗列。
五、引用的权限
在引用过程中,引用的权限可以平移和缩小,但是不可以被放大。什么意思呢?
代码仙子更有发言权:
const int a = 0;
int& b = a;//权限的放大(会报错)
const int& c = a;//权限的平移
///
int x = 0;
const int& y = x;//权限的缩小
总结
引用用的好,传参没烦恼。C语言是什么东西,不熟,蒸不熟。
最后提个问题,引用与指针的区别是什么?(给你一个图的思考时间)
wujialemuzhenhaokan