【c++】引用

C++引用是一种广义对象的概念,它是一个别名,没有独立的空间,和其引用实体共用同一块空间。引用类型必须和引用实体是同种类型的。

	int a = 1;
	int& b = a;

	cout << a << endl;
	cout << b << endl;

	cout << &a << endl;
	cout << &b << endl;

可以看到,a和b的值是一模一样的,地址也是一模一样的,可以见得b是a的一个别名。

我们对b进行修改,由于a和b用的是同一个地址,那么a也会跟着修改,由上图可以间的。

那我们在使用引用的时候,我们应该注意一些什么呢?

1.在定义时必须初始化;

2.一个变量可以有多个引用;

3.引用一旦引用一个实体,就不能再引用其他实体。

下面我们重点讲一下,传引用传参和传引用返回。

在学习数据结构的时候,我们一般传参都是传地址,有些大学生在学校学习时,老师在讲单链表,记录有效数据个数的时候,常常会用引用来返回有效数据个数,这时引用常常作为函数参数。

但是如果引用作为返回值呢?我们来看。

int& Func1()
{
	int n = 0;
	n++;

	return n;
}

int& Func2()
{
	int n = 0;
	n++;

	return n;
}

int main()
{
	int& a = Func1();
	cout << a << endl;
	cout << a << endl;

	cout << endl;

	int b = Func2();
	cout << b << endl;
	cout << b << endl;


	system("pause");
	return 0;
}

两次结果是一样的,但是事实上是这样吗?

并不是,这个是编译器的问题,我们先看b,我们通过引用返回时,由于此编译器下函数栈帧并没有清理空间,那么返回的n的别名,所指向的空间依旧是n的空间,赋值给了b,那么b就是1,但是如果函数栈帧被清理了,那么b的值应该会接收一个随机值。

反过来我们再看a,我们用一个别名来接收n的别名,那么a就是n的别名,始终指向这个空间,第一次cout调用的时候,正常传参,由于函数栈帧并没有清理空间,别名a就是1;但是第二次调用cout时,n的空间会被第一次调用cout时覆盖,从而产生随机值。但是为什么上面打印的结果依旧是1呢,是因为cout压栈时,可能函数空间的大小不足以压到n所指向的空间,所以n的那块区域没有被修改,所以a还是1。

最后是常引用:

常引用是指在定义时使用const关键字修饰的引用,它不能修改引用实体的值。C++引用的使用可以简化代码,提高程序的可读性和可维护性。

这里我们就不得不说说权限的偏移了:

	const int a = 0;

	int& b = a;//权限放大

	const int& b = a;//权限平移

	int x = 0;
	const int& y = x;//权限缩小

	int i = 0;
	double& d = i;

我们看上面的代码,猜猜第几行是可以实现的?

答案是:权限平移和缩小可以实现,权限放大是不被允许的,因为a具有常属性,是不能被修改的,但是用了引用之后,那么修改b就等于修改了a,这怎么可以呢?但是权限平移和缩小就不存在常量被修改的问题。

最后两行也是不被允许的,因为强制类型转化,跟函数返回值传参一样,会产生一个临时空间,临时空间中的临时变量具有常属性,所以不能用引用接收。

以上就是引用的内容,希望大家多多支持!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值