引用概念:
引用不是新定义一个变量,而是给已存在取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用一块内存空间,从语法层面上来说,引用没有开辟空间。
引用的特征:
引用在定义的时候必须初始化,一个变量可以存在多个引用,而引用一旦引用了一个实体,再不能引用其他实体。
注意: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
语句的条件判断。