一、语法概念
从语法上理解,引用就是给变量取一个别名,它没有独立空间,和它引用的变量共用一块空间。
例子:
int a = 10;
int &b = a;//b是a的别名
//对b的操作都相当于对a操作
值得注意的是,C++ 中的引用一经初始化,后面是改变不了指向的(这点与Java有所不同),而且引用是必须初始化的。
引用的类型也必须和原变量对应,显然,你肯定不能用 int& 引用 double 变量。
二、注意事项
在引用的过程中,权限可以平移,可以缩小,但是不能放大。
怎么理解这句话呢?举个例子,假设你声明了一个 const 修饰的整型变量:
const int a = 10;
现在你要对其进行引用,如果你用 int& 类型:
int &b = a;//权限的放大
此时编译器会报错,这属于引用的权限放大。被引用的变量是有 const 修饰的,而你忽略了这个,直接用 int& 类型来引用,也就是说你用一个变量当一个常量的别名,显然是不合法的。
引用时权限不能放大,但是可以平移,可以缩小。因此上述代码我们可以改成权限的平移:
const int &b = a;
这种就属于权限的平移,也就是用一个常量当作一个常量的别名,这样是合法的。
那权限的缩小是什么样的呢?例子:
int a = 10;
const int &b = a;
此时我们用一个常量当作一个变量的别名,这样做是合法的。也就是说我们不能通过这个别名来改变原变量,这属于权限的缩小。
三、使用场景
引用到底有什么用,用引用又有什么好处呢?
1. 引用传参
传参分两种,传值和传引用。
传值传参,形参相当于实参的拷贝,有拷贝构造的消耗,并且对形参的操作不会影响实参。
而传引用则有所不同,引用传参相当于传了一个别名,不用将实参拷贝一份,大大提高了效率,并且对形参的操作会影响实参。
例子1:
//引用传参,形参影响实参
void swap(int &a, int &b)
{
int t = a;
a = b;
b = t;
}
例子2:
//引用传参,不用拷贝效率高
void func(vector<string> &x, vector<string> &y);
引用传参在任何情况下都可以使用,如果我们想形参影响实参或者提高效率的话。
2. 引用返回
返回值也分两种,传值返回和引用返回。
传值返回先用返回对象拷贝构造出一个临时对象,等出了函数,栈帧销毁,再将临时对象返回。
所以传值返回也有拷贝构造的消耗,效率较低。并且传回的只是临时拷贝,不能修改返回对象。另外临时拷贝具有常属性,所以传值返回的返回值不能作左值。
例子:
//传值返回
int func(...)
{
...
return n;//传值返回的是n的拷贝,无法直接修改n
}
int main()
{
...
func(...) = 10;//报错,不能作左值
}
而传引用返回则有所不同。
首先引用返回的是返回对象的别名,没有拷贝构造临时对象的消耗,效率较高。
其次引用返回可以直接修改返回对象,因为引用返回的是返回对象的别名。但是要保证出了函数,返回对象还存在,否则结果是未定义的。
另外引用返回的是一个变量的别名,变量是可以作左值的。
例子:
//引用返回
int& func(...)
{
...
return n;//引用返回的是n的别名
//但是要保证出了函数,n还存在
}
int main()
{
...
func(...) = 10;//合法,返回的是变量的别名,可以作左值
int& ret1 = fun(...);//用另一个别名接收
ret1 = 20;//可以直接修改返回对象n
int ret2 = fun(...);//这个是把n的值赋给一个新的变量
//ret2是一个新开辟的变量,对ret2的操作不会影响n
}
因此,引用返回可以提高效率、可以直接修改返回对象。
但是必须保证出了函数作用域,返回对象依然存在,才能引用返回。
四、引用和指针的区别
引用就是变量的别名,没有独立空间。指针是一个变量,用于存储地址。
引用必须初始化,指针没有要求
引用初始化后不能改变指向,指针可以。
没有空引用,但有空指针。
sizeof 引用的结果是引用类型的大小,sizeof 指针的结果是地址大小。
引用自加是引用的实体自加,指针自加是指针向后偏移一个类型的大小。
有多级指针,但是没有多级引用。文章来源:https://www.toymoban.com/news/detail-605284.html
引用用起来更安全。文章来源地址https://www.toymoban.com/news/detail-605284.html
到了这里,关于【C++入门】引用、内联函数、auto 关键字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!