C++ 引用

引用在C++中是变量的别名,不占额外空间,常用于函数参数传递以实现直接修改实参。与指针不同,引用在声明时必须初始化且不能改变引用对象。引用提供了一种安全的间接访问方式,避免了空指针问题,且在返回值中使用引用可以减少拷贝提高效率。

引用

引用概念

引用不是定义一个新的变量,而是给已存在的变量取了一个别名,编译器不会为引用变量开辟一个新的空间,它和它引用的变量共用一块空间。

int main()
{
   int i = 10;
   int& b = i; //使用了& b成为了i的别名
   //而&放在 int& 为引用 &在变量旁边为取地址
   int& c = b;
   return 0;
}

在这里插入图片描述
在这里插入图片描述

引用的作用

对比c语言调用函数 形参的改变不影响实参 需要传指针解引用;
而引用是变量的别名,形参的改变就是实参的改变

void swap(int* x, int* y) //c
{
	int* tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int i = 10, j = 20;
	swap(&i, &j);//取地址
	cout << i << endl;
	cout << j << endl;
	return 0;
}
void swap(int& x, int& y) //c++
{
	int tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int i = 10, j = 20;
	swap(i, j);
	cout << i << endl;
	cout << j << endl;
	return 0;
}
引用做返回值
int Count()
{
	int n = 0; 
	n++;
	return n;
}

int main()
{
	int ret = Count();

	return 0;
}

Count函数调用后,返回n,出栈后销毁,n会在main空间临时开辟一个空间,将临时变量给ret;
在这里插入图片描述
在这里插入图片描述
如果给n加上static呢?

int Count()
{
	static int n = 0; 
	n++;
	return n;
}

在这里插入图片描述
n在静态区,但是不管销不销毁,依然会产生一个临时变量;
在这里插入图片描述

传引用返回
int& Count()
{
	static int n = 0;
	n++;
	return n;
}

int main()
{
	int ret = Count();

	return 0;
}

在这里插入图片描述
传引用返回,n就是ret的别名;引用返回可以减少拷贝;
如果函数返回时,出了函数作用域,如果返回对象还在(没有返还系统,如静态,全局,上层栈帧,malloc等等),则可以使用引用返回。如果已经还给系统,则必须使用传值返回;

指针和引用的区别

引用的概念上时定义一个变量的别名,指针时储存一个变量的地址;
在汇编中其实是一样的:
在这里插入图片描述
引用在定义时必须初始化,指针则没有要求;
引用在初始化一个实体后,不可以再引用其他实体,指针可以在任何时候指向任何一个同类型的实体;
没有NULL的引用,但是有NULL的指针
引用的的大小为引用类型的大小决定,而指针始终为4/8字节;
引用自加1则引用的实体增加1,指针自加即指针向后偏移一个类型的大小;
有多级指针,没有多级引用
访问实体方式不同,指针需要显式解引用,而引用时编译器自己处理;
引用指针使用更加安全;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值