一、引用的基本语法
数据类型 &别名 = 原名;
例如: int a = 10;
int &b = a;
相当于给变量a起了个别名,它们操作同一个地址内存;所以通过对b进行赋值时,a的值也会改变;例如:
int &b = a;
B = 100;
Cout<<"a = "<<a<<endless;
此时 输出结果a = 100;
二、引用注意事项
引用必须要初始化,即声明int &b;不合法,需要初始化,即int &b = a;
并且在初始化后不可以改变;即:
int &b = a;
b = c;
并不改变引用,是对b进行了赋值处理;
三、引用做函数参数
函数传参时,可以利用引用来让形参修饰实参;可以简化指针修改实参;函数传参的方式如值传递,地址传递,引用传递;
1、值传递,形参不修饰实参,原地址存储的对应数据没有被改变;
void switch(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
2、地址传递,通过地址找到实参,存储的数据被改变;
void switch(int &a, int &b)
{
int temp = *a;
*a = *b;
*b = temp;
}
3、引用传递,共用同一个内存空间,存储数据被改变;
void switch(int &a,int&b)
{
int temp = a;
a = b;
b = temp;
}
四、引用做函数返回值
需要注意首先,不要返回局部变量的引用;第二,函数的调用可以作为左值;
int& text()
{
int a =10;//局部变量存放在栈区,会被释放
return a;
}
int main()
{
int &ref = text();//ref为a的别名
cout<<"ref = "<<ref<<endl;
cout<<"ref = "<<ref<<endl;
}
第一次可以成功输出reg=10,编译器做了保留,第二次输出就为乱码了,a的内存已经释放了。但是当a定义为静态变量时,可以正常输出;
int& tesst()
{
static int a = 10;//存放在全局区,为静态变量,在程序结束后系统释放
return a;
}
int main()
{
int &ref = test();
cout<<"ref="<<ref<<endl;
cout<<"ref="<<ref<<endl;
test() = 1000;
cout<<"ref="<<ref<<endl;
cout<<"ref="<<ref<<endl;
}
引用做函数返回值时,函数可以作为左值,如上代码,前两次输出为10,后两次输出为1000;di函数调用完后返回的是变量a的引用,相当于对a进行赋值;
所以,如果函数的返回值是引用,这个函数就可以作为左值;