作用
给变量起名
语法
数据类型 &别名 = 原名
1.别名和原名的数据类型一致
2.别名和原名都可以操纵这个内存
3.引用一定要先初始化,即确定做哪个变量的别名
4.引用在初始化后不可改变,即不可以做其他变量的别名
int a = 10;
int &b = a;//引用初始化
引用做函数参数
作用:函数传递参数时,可以利用引用的技术让形参修饰实参
优点:可以简化指针,并达到修改实参的目的
案例:
封装一个交换函数,使用引用传递传入参数
1.引用传递中别名和原名一样
2.调用函数时传入的参数就是引用初始化
void swap(int &a,int &b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int a = 10;
int b = 20;
swap(a,b);
return 0;
}
引用做函数返回值类型
好处:在内存中不产生被返回值的副本
1.不返回局部变量的引用
局部变量存在栈区,他的内存会被释放,返回局部变量的操作不合法
2.函数的调用可以作为左值
即可以为函数的返回值赋值
int& test()//将引用作为返回值类型
{
static int a = 10;//a为静态变量,此时可以返回
return a;
}
int main ()
{
int &b = test();
cout << "b =" << b <<endl;
test() = 20;
cout << "b =" << b <<endl;
}
引用的本质
引用的本质是指针变量
正如语法中提到,引用是不可改的,本质上是指针常量的指向不可改
int a = 10;
int& ref = a;//->编译器将这行代码转换为int*const ref = &a;
常量引用
优点:修饰形参,防止误操作
使用场景:在函数参数列表中定义形参
1.
int a = 10;
int& ref = 10;//操作不合法
const int& ref = 10;//编译器转化为->int temp = 10; const int& ref temp;
2.
void showValue(const int& a)
{
cout << a;
}
int main()
{
int a = 10;
showValue(a);
}