引用做函数左值
引用也可以作为函数的左值被使用。
int& func()
{
static int a = 10;
return a;
}
int main()
{
func()=100;//函数作为左值
int &ref = func();
cout<<ref;
}
以上代码的运行结果为1000,但是静态变量a本来是0,所以返回的值也应该是10才对。
这里的代码运行方式如下:
在主函数中调用了函数func,从中获得了a,切func的返回值就是为a,但是由于func本身是一个引用类型的函数,因此返回的func本身就是一个a的引用,在后面的函数作为左值的步骤中,func()作为引用被重新赋值,也就相应的改变了静态变量a的值。
从引用的本质来看,引用即为一个在C++内部实现的指针常量,即它指向的方向是不可以修改的,但是指向的值是可以修改的
void func(&ref){
ref =100; 实际上编译器执行指令为*ref = 100;
}
int main()
{
int a = 10; 编译器会执行int *const ref = &a;
int& ref = a;
ref = 20; 内部发现ref是引用,自动转换为*ref = 20;
}
常量引用
常量引用是用来修饰形参而防止误操作的。
一般来说,引用必须引向一块合法的内存空间,必须要有一个目标变量,但是
const int & ref = 10
是一段合法代码。编译器在内部会进行操作,先创建一个临时变量temp,然后让ref引向这个临时变量。而加上const会让ref变为一个只读状态,所以没有办法进行修改。
include<iostream>
using namespace std;
void print(int &val)
{
val = 10; //这是一个误操作
cout<<"value is"<<val;
}
int main()
{
int m = 100;
print(m);
return 0;
)
以上的程序就在不该改变参数的值时由于一个误操作导致了形参的改变,由于是引用型的函数,所以实参也发生了变化。
所以要在定义函数的时候写print(const int & val),这样在误操作时编译器就会报错提示。
那么为什么还要执着于引用的使用?显然引用的使用是有必要的所以才会费尽心机来规避引用时遇到的问题。一般情况下,使用值传递的函数会开辟一段新的内存使用,如果函数和参数有很多,就会导致内存占用过多。而引用本身就只是变量的别名,所以在使用的时候不需要开辟新的内存,从而达到节约内存的目的。