1. 引用基本概念及说明
引用就是为已有的对象a所起的另外一个名字b,可以通过引用去修改b以实现对象a的修改。
引用格式:类型说明符 &引用名=变量名
例程:
int i;
int &ri=i;
i=5;
cout<<i<<endl;
ri=10;
cout<<ri<<endl;
| &不是C语言中的取地址运算,而是标识符 |
| 类型说明符必须和目标变量类型一致 |
| 引用在声明时必须初始化 |
|
引用即别名,相当于目标对象有一个原名和别名,引用不是对象,所以也无法作为另外一个引用的原名。 |
| 不能建立数组的引用 |
2. 引用的实际应用
2.1 引用作为参数
还记得在C语言中,如果要对函数传入可以在函数内部修改,且修改有效的变量时,我们需要使用传入指针。而C++中,引用提供了传入可修改变量的一种方法,见例子
//p1,p2均为引用
void swap(int& p1, int& p2)
{
int p;
p = p1;
p1 = p2;
p2 = p;
}
int main()
{
int a = 1, b = 2;
cout << "交换前,a和b" << " " << a << " and " << b << endl;
swap(a, b);
cout << "交换后,a和b" << " " << a << " and " << b << endl;
}
输出:
从上述例子我们可以看出:
1 | 传递引用给函数和传递指针的效果是一样的 |
2 | 参数传递较大时,用引用比一般变量传递参数更好。原因是因为引用传递,内存中不产生实参的副本,其直接对实参操作; 使用一般变量传递时,需要复制实参产生副本,有空间消耗 |
3 | 引用相比于指针更容易使用,更清楚。指针效果与引用一样,甚至引用底层就是用指针实现,但是指针对象传入时,同样要分配空间;函数中需要使用解引用符(*)来运算,容易错误且代码阅读性较大;此外,调用函数时要使用变量地址来作为实参。 |
基于以上原因,在很多C++工程的源代码中,我们可以看到引用使用得远比指针传参频繁。
2.2 常引用:不能通过引用对目标进行修改,使得引用的目标成为常量,实现引用的安全性
常引用声明方式:const 类型标识符 &引用名=目标变量名。
例子:
int i;
const int &ri=i;
ri=1; //错误,无法通过常量引用修改目标实体i
i=1; //正确
常引用更多使用在引用作为函数参数中,使得在函数内部无法修改传入参数,以实现代码的安全性。
2.3 引用作为返回值,好处:内存中不产生返回值的副本
声明方式:类型标识符 &函数名(形参列表)
{函数体}
这部分在此不做解释,可进一步查看参考2。
3. 引用总结
引用解决的问题: | 过大数据或对象的传递,以减少空间消耗(不产生copy,提高效率);通过const使用,提高引用传递安全性; |
引用与指针的 主要区别: | 指针通过指针变量指向一个对象,通过地址对对象进行操作,会产生空间消耗。引用是对象的别名,对引用操作就是对对象操作,不产生空间消耗。同时,引用的代码可读性比指针更好. |
什么时候 使用引用? | 流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。 |
参考:
- 《C++ Primer》2.3节 复合类型, 2.4节 const 限定符
- 引用介绍及用法:https://www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html
- 指针详解:https://blog.csdn.net/weixin_39640298/article/details/84900326
- 指针与引用的区别:https://blog.csdn.net/smartgps2008/article/details/90648015 https://blog.csdn.net/Sun_Life_/article/details/89304963