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连续输出等等。
原理就是返回的引用时左值,返回的值是右值,右值是不能进行连续操作符运算的。

阅读全文
0 0
原创粉丝点击