c++的引用以使用

在这里插入图片描述

c++中的引用可以理解为给变量取别名,也就是说给一个变量有起了一个别的名称,这个引用变量和原来的变量共用一个地址。用一个简单例子说明一下:有一个人叫张三,他的脸比较长,所以同学叫他驴哥,在家中排行老二,所以母亲叫他二宝。无论是叫驴哥还是二宝,他还是张三。引用就是这样,给一个变量起外号,还能起多个外号,但本质还是原来的变量。

一,引用的使用规则

  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 引用不能重复
int main()
{
 int a=10;
 //给a取别名,可以有多个别名
 int& b=a;//定义时初始化
 int& c=b;
 int& d=c;
 return 0;
}

上面的代码给变量a取了三个别名b,c,d。我们可以看看它们的地址是否一致?
在这里插入图片描述
从这里可以看到,地址是一样的。
引用的形式为变量类型+&+别名=真名(别名)。可以给别名再起别名,这有点套娃的意思了。

二,引用的应用

引用一般有两方面的用途:

  1. 做函数参数
  2. 做函数返回值

1.做函数参数
引用在应用时,有点类似于指针,但是指针使用起来是比较复杂的,相信野指针困扰了很多同学,但要是用引用就很舒服了。
引用和指针都可以做函数参数:

  • 引用不会出现空引用,指针有空指针的非法访问
  • 引用连接的地址绝对是合法的,指针可能是野指针,地址非法
  • 引用只能被初始化为一个对象,指针可以指向任意地址
    所以综上,引用是更安全的,但是指针也有很多引用不能完成的操作。
    做函数参数,我们都知道传过去的函数参数,有传值,传地址两类。
    (1)传值是简单的,函数的参数就是一份临时拷贝,它不能够改变原来参数的值。
    (2)传地址,可以改变地址指向的内容。
    (3)传引用,可以改变引用变量所引用的原变量。
    举个例子: 简单些,就是交换两变量的值,可以用指针也可以用引用。
#include<iostream>
using namespace std;
void swap(int& c, int & d)
{
	int tmp = c;
	c = d;
	d = tmp;
}
int main()
{
	int a = 1;
	int b = 2;
	cout<<"a和b本来的值"<<endl << a <<endl<< b << endl;
	swap(a, b);
	cout << "a和b交换后的值" << endl << a << endl << b << endl;
	return 0;
}

运行结果如下:
在这里插入图片描述


2.做函数返回值
做函数返回值是有些不好理解的,而且用的时候也会频繁出错。
首先讲讲引用做返回值的条件:
函数返回时,函数的返回对象还没还给操作系统,就可以用引用返回,否则只能用传值返回。
讲讲这个条件的原因:
函数是占用栈的空间的,在函数调用结束时,函数会销毁,将空间返回给栈。如果返回的变量是个临时变量,那么就不能用引用返回,因为引用返回的对象就是其本事,不能够返回一个已经还给操作系统的变量,这是不安全的行为。比如返回对象是个全局变量或者加上static的临时变量,这是可以用引用返回的。

#include<iostream>
using namespace std;
int& add(int x, int y)
{
	static int c = x + y;
	return c;
}
int main()
{
	int ret = add(1, 2);
	cout << ret<<endl;
	
}

我们需要注意一点,引用返回,返回的是返回对象本身。这点很重要,可能大家觉得这点挺好理解,其实不然,一般情况下的函数返回,返回的并不是返回对象本身,而是返回对象的临时拷贝,有两种情况:

  1. 如果返回对象较小,那么会临时拷贝到寄存器里
  2. 如果返回对象较大,那么会拷贝在函数栈帧中

总结一下:函数引用返回,直接返回,返回对象本身,其实节省了空间。但是返回对象,出了函数还必须存在,如果还给操作系统了,就不能用引用返回。


以上就是本期内容,希望对大家有所帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

动名词

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值