引用
引用不是定义一个新的变量,而是给已存的变量起一个别名,编译器不会给引用变量开辟内存空间,它和引用变量共用同一块内存空间。引用在定义时必须要初始化。
类型& 引用变量名 = 已定义变量名(类型必须和已定义的变量同种类型)
一个变量可以有多个引用变量名,引用变量名只能在引用的时候引用一次,再不能引用其他实体。
常引用
由上图可见const修饰变量a时,用int&定义引用变量会出错,a是常量。
数组引用
int a[10];
int (&ra)[10];
在C语言中当我们用数组作为参数传参时,数组会退化为指针,因此我们在函数中是无法得知数组的大小,所以传参时也得把数组的长度传过去。
在C++中定义了数组的引用,在传参时接收实参的数组引用还是数组,因此有效的防止了数组的退化。
void fun(int (&arr)[SIZE]);注意,方括号中的SIZE必须要写,而且在调用的时候必须用这个SIZE的数组,否则会出错;
难道定义的函数只能处理固定大小的数组?当然不是!这样定义,可以处理任意大小的数组:
template < int N >
void fun(int (&arr)[N]);
这样,任意大小的int型数组都可以传递进来了,这个方法叫“非类型模版参数”
引用可以作为参数传参也可以作为函数返回值,但是要注意的是不要反回栈空间上的引用如以下例子:
这就是返回栈空间上的引用引起的,当函数结束时栈空间销毁,引用指向的栈空间也就随之销毁了,所以后两个输出的就是随机值。
引用和指针的区别和联系
联系:实际上引用底层和指针底层处理方式相同
区别:
1、引用必须指向有效的变量,指针可以指向空
2、有多级指针但没有多级引用
3、指针需要手动寻址,引用通过编译寻址
4、引用在被初始化指向一个对象后就不能再指向其他对象,而指针可以指向任何一个同类型的对象
5、引用和指针自增自减意义不同,引用改变变量内容,指针改变指针指向
6、sizeof引用对象和指针不同,前者结果是引用类型的大小,后者始终是地址空间所占字节数
7、引用比指针相对安全