引用的介绍

引用概念:

引用不是新定义一个变量,而是给已存在取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用一块内存空间,从语法层面上来说,引用没有开辟空间。

引用的特征:

引用在定义的时候必须初始化,一个变量可以存在多个引用,而引用一旦引用了一个实体,再不能引用其他实体。

注意:ra=b是赋值,不再是引用了。并且引用类型与引用实体是必须为同种类型。

引用的使用场景:

做参数:

这里同时说明了a的别名同时也可以是a,就是自己也可以作为自己的别名。

引用做参数的优点:

减少内存开销: 当使用值传递方式将一个对象作为参数传递给函数时,会生成一个临时变量来存储传递的值。在函数调用时,编译器会创建一个临时变量,将原始对象的值拷贝到临时变量中,并将临时变量作为参数传递给函数。函数在使用参数时,实际上是使用临时变量的副本。

做返回值:

在Count函数中,由于n是静态局部变量,静态变量,静态局部变量,全局变量存储在静态区中,它的生命周期与整个程序运行期间一样。因此,当在该函数中,静态局部变量n会一直存在于内存中,并且在每次调用函数时,都会保持上一次调用结束时的值。这样就可以实现每次调用函数时,n的值都会加1的效果。

而在Add函数中,c作为局部变量一旦出了Add函数栈帧,就会无意义。

基本任何场景都可以使用引用传参。但是要谨慎使用引用做返回值,因为栈帧销毁时,对应在栈中的局部变量也会被回收访问权限。

引用做返回值的优点:

1.减少内存开销:在C++中,当使用值传递方式将一个对象作为函数的返回值时,会生成一个临时变量来存储返回的值。当函数返回一个对象时,编译器会创建一个临时变量,将函数返回的值拷贝到临时变量中,并将该临时变量作为返回值返回给调用者。这个临时变量的生命周期是在表达式求值完毕后立即结束,并且在程序执行过程中无法直接访问该临时变量

2.引用做返回值可以修改和获取返回值:

引用的权限问题:

引用的类型必须与被引用对象的类型相匹配,或者被引用对象的类型必须可以隐式转换为引用的类型。如果引用的权限被放大就会导致编译失败。

1、引用权限放大,无法正常编译。

2、引用权限平移或者缩小1可以正常编译。

注意:

int main()
{
	int i = 1;
	double j = 1.1;
	if (j > i)
	{
		cout << "xxxxx" << endl;
	}

	return 0;
}

分析:

在这段代码中,当进行j > i的比较时,会产生一个临时变量来存储j的值进行比较。在C++中,当进行表达式运算时,如果操作数的类型不一致,编译器会进行类型转换以满足运算的要求。在这种情况下,编译器会将i的值转换为double类型,然后将其与j进行比较。为了进行类型转换,编译器会创建一个临时变量来存储转换后的值。这个临时变量的生命周期仅限于表达式的执行期间,一旦表达式执行完毕,临时变量就会被销毁。所以,当进行j > i的比较时,会产生一个临时变量来存储i的值转换为double类型后的值,然后将其与j进行比较。比较结果将用于if语句的条件判断。

引用与指针的不同点:

1、引用概念上是定义一个变量的别名,指针存储一个变量的地址。
2、引用在定义是必须初始化,指针没有要求。
3、引用在初始化一个实体之后就不能再引用其他实体,而直接可以任何时候指向任何一个同类型的实体。
4、引用没有NULL,而指针有NULL。
5、再sizeof中含义不同,引用结果为实体的类型大小,而指针永远都是4/8字节。
6、引用自加一是实体加一,而指针自加一是指向后一个地址。
7、有多级指针没有多级引用。
8、访问实体不同,指针需要解引用,而引用依靠编译器处理。
9、引用相对于指针更加安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

昨日青空。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值