博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从LLVM源码学C++(二)
阅读量:5128 次
发布时间:2019-06-13

本文共 1033 字,大约阅读时间需要 3 分钟。

在看Clang源码的过程中遇到过,返回const引用,于是就去google 了一下返回值以及参数传递等相关的知识。

首先,为什么要(const 引用)的返回值?

首先&的引用作用是C++独有的特性。其作用相当于传入参数时不经过拷贝,而是实实在在的传入。 fun(int &a)。如果在函数内部修改了a的值,那就确实修改了a的值。而一般的参数传入方式都是传入一个参数的副本。函数内部的操作都是作用于副本。 对于返回值,也类似。一般返回值也是返回的拷贝值。所以如果将函数内的局部变量以引用方式返回是没有意义的。因为退出函数后,函数内部的局部变量已经被系统回收,所以这样引用方式传出的变量也是无效的。但是一般方式返回的变量反而是有效的。因为一般方式返回的是拷贝值,即使原版已经被销毁也无所谓。 但是,有种情况是个例外。那就是对于生命周期足够长的变量,引用返回就是有效的。比如LZ例子里的int& fun(int &a){return a;},这里的a因为是引用方式传入,所以他的生命周期是大于函数本身的。所以引用方式传出也没有问题。当然其实这个例子一般不常见。真正常见的是下面的例子: class A {
public: A():m_data(0){} int m_data; int &get() {return m_data;} } 这里的m_data的生命周期和类A实例化后的变量一样长,所以显然是长于函数get的。所以引用返回是有效的。而且类似引用传入,少了拷贝的步骤,效率更高。当然本例中int本身不复杂,效率没啥区别。但若是一个相当复杂的结构体,那效率差别就大了。 当然引用返回最大的作用就在下面: A a; a.get(a) += 1; //这样是合法的。这就是引用返回的最大作用。可以对返回值直接做这样的操作。专业点的话就是,可以直接当作左值。这可是相当有用的。 下面可以来个更具体的例子: struct B {
B(); int m_data[10]; int& operator [] (int i){return m_data[i];} } void main() {
B b; b[0] = 1; b[1] = 2; //怎么样,爽吧。 } 当然 若返回类型变为const &,就失去了左值的作用。但是省去拷贝,增加效率的作用还是在的

转载于:https://www.cnblogs.com/cane/p/3873019.html

你可能感兴趣的文章
操作系统实验三进程调度
查看>>
冒泡排序
查看>>
板邓:php+mayql分页原理及案例
查看>>
BizTalk调用SAP系统RFC含多个参数以及DateTime类型参数
查看>>
数据分析的道与术
查看>>
2019.03.25 Ajax三级联动
查看>>
[开源]使用C# 对CPU卡基本操作封装
查看>>
NGUI3.5系列教程之 UILabel
查看>>
吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-zoom-out...
查看>>
jsp页面输出当前时间
查看>>
代码规范
查看>>
模板-线段树
查看>>
为什么使用模板引擎
查看>>
数据驱动测试二:使用TestNG和CSV文件进行数据驱动
查看>>
WCF权限认证多种方式
查看>>
缓动小算法
查看>>
chrome浏览器控制台创建js脚本并执行
查看>>
js div模拟水平滚动条
查看>>
Observer 观察者
查看>>
数据库三大范式
查看>>