1.定义
创建一个字符,来代替原本的变量名字,作用和指针和宏定义类似。
2.语法格式
int &a=b; (a是别名)
3.语法注意事项
1.引用必须初始化(错误示范:int &a;)
2.引用初始化之后不可再去引用别人(错误示范:int &a=b; int &a=c;)
4.引用做函数参数(引用传递)
除了值传递和地址传递的又一函数传递方式(值传递与地址传递区别),其作用相当于简化了的地址传递。
#include<iostream>
using namespace std;
void fun(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
int mian()
{
int a=10,b=20;
fun(a,b);
cout<<"a:"<<a<<"b:"<<b<<endl;
}
输出之后a,b的值会互换。
5.引用做函数返回值
注意:
1.不可引用局部变量
(因为局部变量存放在栈区,子函数执行结束后会自动释放)
#include<iostream>
using namespace std;
#include<string>
//这里的&不能去,去了之后返回的就是一个常数了
int &fun()
{
int a = 10;
return a;
}
int main()
{
//为了方便理解,可以把fun()想成a,这是一个变量,而平常的函数返回的都是一个常数。
int &b = fun();
cout << "a:" << b << endl;
cout << "a:" << b << endl;
system("pause");
}
这样的话会输出一串野地址,结果如下图
此外,如果去掉子函数中的&,报错结果如下
函数更改方法:在局部变量前面加上static,将其变为静态变量
2.引用调用可以作为左值
也就是说在函数外部可以修改函数结果
#include<iostream>
using namespace std;
#include<string>
//这里的&不能去,去了之后返回的就是一个常数了
int& fun()
{
static int a = 10;
return a;
}
int main()
{
//为了方便理解,可以把fun()想成a,这是一个变量,而平常的函数返回的都是一个常数。
int& b = fun();
cout << "fun:" << b<< endl;
fun() = 1000;
cout << "fun:" << b<< endl;
system("pause");
}
6.常量引用
错误示范:int &a=10;
正确语法:const int &a=10;
(因为加上const之后,在编译器会将代码改为 int temp=10;int &a=temp;)
(不过需要注意,加上const之后,不能再进行赋值操作了,例如a=20;就是不被允许的)
使用场景:在形参中使用const类型,防止形参被修改
#include<iostream>
using namespace std;
#include<string>
int fun(const int &a)//防止被修改
{
a = 10;
return a;
}
int main()
{
int& b = a;
fun(a);
cout << "b:" << b<< endl;
system("pause");
}
7.引用的本质
引用的本质是一个指针常量。作为指针的简化版本,比指针更方便,但实质上还是指针。