c++函数中的值传递以及引用传递
来源:互联网 发布:书画淘宝网 编辑:程序博客网 时间:2024/06/03 21:35
函数参数引用and值传递
最近在写函数的时候突然思考的问题。
场景: typedef boost::shared_ptr<CShortcutApproval> CShortcutApprovalPtr
void mergePermission( CShortcutApprovalPtr pUserPermission, CShortcutApprovalPtr pMergedPermission);
在写一个合并权限的函数时,由于传的参数是shared_ptr智能指针,
这样传一个指针对象进函数也没有关系,到最后指向的内容还是可以改变,
不过好像是会多调用一次智能指针的复制构造函数函数,
使得该指针的引用计数增加一位,但是退出函数后由于shared_ptr的特性,
引用计数会正确的释放,也不会引起问题。
但是如果选择用智能指针的引用,即可省去一次复制构造的代价。 void mergePermission( CShortcutApprovalPtr &pUserPermission, CShortcutApprovalPtr &pMergedPermission);
同时复习一下引用的作用:可以省去一次复制构造的代价,感觉就像无视函数作用域的限制修改变量。
PS:之前一直疑惑变量引用一定要初始化。
如int &iNum = iValue
但是我们在定义函数时,直接定义void func(int &first, int&second);
那时候是因为我没有考虑到,函数调用时,引用形参是用既定的实参初始化的。
(小白勿喷。)
函数返回值引用and值传递
先说一下大家都知道的概念:
1. 函数返回值时会产生一个临时变量作为函数return变量的副本。
2. 函数返回引用时不会产生副本。
PS:由于返回引用不会产生副本,那么尽量返回引用返回的是静态变量或者是全局变量。
返回以及局部变量的引用,就像不要返回函数中局部变量的指针一样,出了函数局部变量就被释放了。
对于返回引用可以参考c++函数返回引用
对于返回函数局部变量指针可以参考返回局部变量指针
常见返回引用的:
1. 重载赋值运算符函数。 CMyStr& operator =(const CMyStr& str),成员函数返回*this
2. 重载输出输入函数。
ostream & operator<<(ostream &out, CMyStr &str) 返回out
istream & operator>>(istream &in, CMyStr &str) 返回in
作用:除了可以省去一次复制构造代价,还有a=b=c可以连续赋值,cout << str << str连续输出等等。
原理就是返回的引用时左值,返回的值是右值,右值是不能进行连续操作符运算的。
- c++函数中的值传递以及引用传递
- c/c++中的值传递,地址传递,引用传递
- java中的值传递以及(址)引用传递实例
- Objective-C 函数 “值传递” 和 “引用传递” 和 C
- C 值传递、地址传递、引用传递
- [C]值传递、指针传递、引用传递
- javascript中,函数参数中的值传递和引用传递
- C/C++函数传参:值传递、参数传递、引用
- C或C++中函数的参数传递包括:值传递、指针传递、引用传递
- C或C++中函数的参数传递——值传递、指针传递、引用传递
- php值引用和传递引用以及 变量函数
- C++ 函数参数传递 值传递,引用传递,地址传递
- java值传递以及引用传递
- C# 函数引用传递(址传递)ref、out以及值传递之间的运行效率问题
- C++之函数参数的值传递、指针传递以及引用传递的区别和联系
- 【Java】函数中的参数传递是“引用传递”还是“值传递”?
- 图解C/C++中函数参数的值传递、指针传递与引用传递
- 图解C/C++中函数参数的值传递、指针传递与引用传递
- Java 线程池 ThreadPoolExecutor.(包含拒绝策略CallerRunsPolicy,AbortPolicy,DiscardPolicy,DiscardOldestPolicy )
- Python中的内置模块和第三方模块
- iOS 音视频合成
- TabLayout上导航栏+PullToRefreshListView展示数据
- C# DataTable-(乱七八糟-01)-查询日期区间内,统计不存在的维度值,显示且设置值为0
- c++函数中的值传递以及引用传递
- java 日期计算
- securecrt 光标消失
- Lambda表达式
- js 数组是不是相等
- 最新Android的SDK版本与API Level的对应关系
- jQuery-创建、删除、复制、替换、包裹节点
- 修改linux系统中自带的jdk
- java中的异常处理 try-catch 以及try-catch-finally