引用在编译器中的有点点类似是指针常量
void test(int& ref)
{
ref = 100;
}
int main()
{
int a = 10;
int& ref = a;
ref = 20;
system("pause");
return 0;
}
使用引用的注意事项
- 引用必须要初始化,为什么?
C++中必须初始化的几种情况
C++引用必须初始化的原因
定义一般变量时:
声明:声明变量类型和名字 -> 定义:根据类型分配内存地址空间 -> 初始化:将初始值拷贝到变量的内存地址空间中(三步)
因此变量的声明,定义和初始化可以分开,不需要一次完成
定义引用类型时: 将引用绑定到初始化对象(一步)
因此定义引用类型时必须有初始值对象(因为引用的对象必须是个左值,如果不提供初始左值的话,默认构造器无法生成左值)
附:左值和右值?
左值:代表一个在内存中占有确定位置的对象(换句话说就是有一个地址)
右值:是不在内存中占有确定位置的表达式(临时对象)
- 引用一旦初始化就不可以修改?(引用的实质是指针常量,引用不需要分配内存区域)
int i = 1, j = 1;
int &r = i;
&r = j;//在这里&r是一个实际的地址,不是左值,所以不能修改
system("pause");
return 0;
引用做函数参数(简单)
引用函数返回值
- 注意:不要返回局部变量的引用
因为局部变量在函数结束后释放,再访问返回地址的话属于非法操作
int& test()
{
int a = 10;
return a;
}
int main()
{
int &i = test();
cout << i << endl; //10 vs编译器会帮我们保留一次
cout << i << endl; //乱码
cout << &i << endl;//一个地址
system("pause");
return 0;
}
- 函数调用可以做为左值
int& test()
{
static int a = 10;
return a;
}
int main()
{
int &i = test();
cout << i << endl; //10
cout << i << endl; //10
test() = 20;//返回的相当于是变量a,可以对其赋值
cout << i << endl; //20
system("pause");
return 0;
}
常量引用
- 作用:用来修饰形参,防止误操作;
//合法,原因:
//加上const之后,编译器将代码修改为:
//int temp = 10;
//const int & a =temp;
const int &a = 10;//只读,不可修改
- 常量引用作返回值
取消返回值可以作为左值
补充:引用没有 const?
int& const ref是错误的,因为它本身就是个指针常量