引用细讲解
目录
概念
语法:
特性
1、可以对一个变量取多个别名,也可以给别名起别名
2、引用在定义时必须初始化
3、引用一旦引用了一个实体,就不可以引用别的实体
使用
1、引用传参
注:
2、引用做返回值
临时对象:
野引用:
const引用
权限的变化
const引用的使用
表达式的引用
类型转换的引用
临时对象产生场景:
指针与引用的区别
引用的本质
区别
概念
引用是给一个已存在的变量起一个“外号”,也是起别名,而不是新定义一个变量,引用和被它引用的变量共用一块空间,这也意味着:改变引用的同时,变量本身也会改变
语法:
类型 + & + 引用别名 = 引用对象
int a = 1;
int ra = a;//引用
特性
1、可以对一个变量取多个别名,也可以给别名起别名
2、引用在定义时必须初始化
3、引用一旦引用了一个实体,就不可以引用别的实体
使用
1、引用传参
引用传参就相当于替代了指针,不需要传地址就可以通过改变传入的别名来改变实参
原因就是:别名和实参是共用一块存储空间,改变别名就会改变引用指向的变量
void swap(int& x, int& y)
{
int temp = x;
x = y;
y = temp;
}
int main()
{
int a = 1, b = 2;
swap(a, b);
cout << a << ' ' << b << endl;
return 0;
}
注:
引用传参和指针传参的功能是类似的,但引用更方便,不需要拷贝
2、引用做返回值
引用做返回值的场景比较复杂,这里就会涉及临时对象
临时对象:
它就是编译器需要一个空间来暂存表达式的求值结果时临时创建的一个未命名的对象,c++中把这个未命名对象就叫做临时对象
临时对象的运用场景有很多,其中在函数返回值中就起着重要作用
临时寄存器具有常性,也就是和const一样,不能修改,也就说在图上中就无法修改STTop(st1)的值
但用引用传参就不会产生临时对象
而传值返回过程中会经常进行拷贝,而引用传参就不需要进行拷贝,能直接返回对象别名
野引用:
这种要十分注意,编译器是不会报错的,虽然也不会改变变量的值,但在使用引用传参时不要写出这样的代码
const引用
权限的变化
在const引用中,变量的权限只能平移和缩小,绝对不可以放大
const引用可以给常量或普通变量起别名,但是普通引用不可以给常量和const'引用的别名起别名
其实指针也涉及权限的放大和缩小
普通指针不能指向具有const属性的对象
const引用的使用
表达式的引用
表达式的引用是需要用const引用的,因为它涉及临时对象的产生,表达式的求值结果是暂存在临时对象中的,我们已知临时对象和const一样具有常量属性,所以用一般的引用就相当于权限放大,是行不通的
类型转换的引用
在不同类型的转换中,也适合表达式一样会将结果暂存在一个新建的临时对象中,如果使用一般引用的话就会造成权限的放大,就需要用const引用
临时对象产生场景:
这里我们也可以总结几个临时对象的产生场景:
1、类型转换
2、表达式求值
3、函数返回值
指针与引用的区别
这是面试题中会常考的一种题目
引用的本质
引用在语法层面是和指针有巨大不同的,但是在底层:汇编层中,其实引用就是指针
区别
1、语法上,引用是给变量取别名,不开辟空间;而指针是存储一个变量的地址,是需要开辟空间的
2、引用在定义时必须初始化;而指针没有强制规定一定要初始化
3、引用只能对一个变量取别名,不能改变指向;而指针可以不断改变指向
4、引用是直接访问指向对象;而指针需要先解引用才可以访问
5、sizeof中引用结果为引用类型大小;而指针始终是地址空间所占字节个数(32位下为4byte,64位下为8byte)
6、指针容易发生空指针或野指针等问题,虽然引用也会有野引用问题在,但这是少数,所以引用会更安全的
由此可得,引用的使用在某些场景下会比指针方便,所以在两者功能重叠的情况下,建议使用引用