C++中值传递(pass-by-value)和引用传递(pass-by-reference)
1.pass-by-value的情况:
缺省情况C++以pass-by-value(继承C的方式)传递对象至(或来自)函数。函数参数都是以实际参数的复件为初值,调用端所获得的也是函数返回值的一个复件,复件由对象的拷贝构造函数产出,可能使pass-by-value成为耗时的操作。
2.耗时的原因
类的对象作为函数参数时,如果使用值传递,要先拷贝一份实参的副本,需要调用类的拷贝构造函数,函数结束时副本被销毁,需要调用析构函数。如果该类是派生类,调用的函数更多,流程更多更复杂。
拷贝构造函数
拷贝构造函数的调用:如果一个新对象被定义,一定会有一个构造函数被调用,如果没有新对象被定义,就不会有构造函数被调用。
3.pass-by-reference的优势
①pass-by-reference:没有任何构造函数或析构函数被调用,因为没有任何对象被新建。参数声明中加上const,防止传入的对象被修改。
②*避免slicing(对象切割)问题
值传递:子类对象被切割成父类对象,功能缺失
引用传递:解决该问题
4.pass-by-reference的底层本质
reference往往以指针的形式实现,传递的是指针
对象为内置类型(如int),STL的迭代器和函数对象,pass-by-value高效一些。
5.pass-by-reference的举例
class A{…};
void action(A a);//值传递pass-by-value
void action(const A& a);//引用传递pass-by-reference
C++中值传递(pass-by-value)和引用传递(pass-by-reference)的更多相关文章
- C++ 值传递、址传递、引用传递
一.值传递 int func(int p) 值传递会在栈中开辟一块空间 p,使得p和实参的a 同值. 此时你在函数func里面对p进行任何操作都不会对原值a产生任何影响.因为a 和p本就就是两个变 ...
- java面试3-对于java中值传递的理解(Hollis)
这是根据Hollis的直面java内容习得(有兴趣的可以加他微信公众号) 对于初学者来说,要理解java中的值传递很难理解,为什么说java只有值传递?那引用传递呢? java中的错误理解: 错误理解 ...
- 理解--->Java中的值传递&引用传递
转自:http://url.cn/5tL9F5D 值传递和引用传递 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际 ...
- 值传递:pass by value(按值传递) 和 pass by reference(引用传递)-[all]-[编程原理]
所有的编程语言,都会讨论值传递问题. 通过一个js示例直观认识 //理解按值传递(pass by value)和按引用传递(pass by reference) //pass by value var ...
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- 理解Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...
- (转载)理解Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天 ...
- C/C++中的值传递,引用传递,指针传递,指针引用传递
在面试过程中,被面试官问到传值和传引用的区别,之前没有关注过这个问题,今天在网上找了一篇包含代码和图片的讲解文章,浅显易懂,遂转载备忘. 1. 值传递 void f( int p){ printf(& ...
- c++中函数参数传递(值传递、指针传递,引用传递)进一步认识
概念 首先从概念上来说一下这几种函数传参方式及区别: 1.值传递:形参是实参的拷贝,改变函数形参的值并不会影响外部实参的值,这是最常用的一种传参方法,也是最简单的一种传参方法,只需要传递参 ...
随机推荐
- 【Oracle】进入sqlplus 删除键backspace时出现^H
当oracle进入sqlplus后,输入命令时候出现错误,我们按平时的习惯使用backspace键删除错误信息,此时会出现^H 解决办法:进入sqlplus之前,使用stty erase '^H'命令 ...
- CDC之fast->slow (2)
1 Open-loop solution One potential solution is to assert CDC signals for a period of time that excee ...
- 图像局部显著性—点特征(Fast)
fast作为几乎最快的角点检测算法,一般说明不附带描述子.参考综述:图像的显著性检测--点特征 详细内容,请拜访原=文章:Fast特征点检测算法 在局部特征点检测快速发展的时候,人们对于特征的认识也越 ...
- Photoshop显示RGB值问题
Bmp与JPEG格式的不同之处在哪里? 使用OpenCV读写图像,然后由Photoshop显示时候结果并不相同,使用jpg格式的图像灰度值明显大于bmp格式,但jpg格式的显示信息是错误的. 过程: ...
- js-undefinde的一点延伸
前面写过一篇js中变量定义的问题:Js中判断变量存不存在的问题 本文再补充下,变量声明未初始化的情况,代码: <script> var a; alert(a==undefined)//tr ...
- Python之数据结构改造
{ "appList":[ { "id" : 120, "name" : "BIGDATA", "alias& ...
- day008 字符编码之 字符编码 、Python2和Python3字符编码的区别
计算机基础(掌握) 启动应用程序的流程 双击qq 操作系统接受指令然后把该操作转化为0和1发送给CPU CPU接受指令然后把指令发送给内存 内存接受指令把指令发送给硬盘获取数据 qq在内存中运行 文本 ...
- eas之添加表格列宽自动调整设置
设置表格整体宽度自动调整为所在panel的宽度 KDTable table=new KDTable(); table. setAutoResize (boolean); 注意:该功能在冻结功能启用后, ...
- js 中this到底指向哪里?
其实js的this指向很简单.我们记住下面3种情况. this 指向的是浏览器中的window.代码如下: function fn(){ this.name='yangkun'; this.age=2 ...
- vue 手机键盘把底部按钮顶上去
背景:在写提交订单页面时候,底部按钮当我点击输入留言信息的时候,底部提交订单按钮被输入法软键盘顶上去遮挡住了. h5 ios输入框与键盘 兼容性优化 实现原理:当页面高度发生变化的时候改变底部butt ...