函数返回值的情况
2015-08-08 09:44
204 查看
原文地址:http://patmusing.blog.163.com/blog/static/13583496020113191407531/
在一个函数的内部,return的时候返回的都是一个拷贝,不管是变量、对象还是指针都是返回拷贝,但是这个拷贝是浅拷贝。
1. 如果返回一个基本类型的变量,比如:
int a;
a = 5;
return a;
那么就会a的一个拷贝,即5返回,然后a就被销毁了。尽管a被销毁了,但它的副本5还是成功地返回了,所以这样做没有问题。
2. 但是对于非动态分配(new/malloc)得到的指针,像1那么做就会有问题,比如在某个函数内部:
int a[] = {1, 2};
return a;
那么也会返回指针a的一个拷贝,我们假定a的地址值为0x002345FC,那么这个0x2345FC是能够成功返回的。当return执行完成后,a就要被销毁,也就是0x002345FC所指向的内存被回收了。如果这时候在函数外面,去地址0x002345FC取值,那得到的结果肯定是不对的。这就是为什么不能返回局部指针的原因。返回局部变量的引用的道理和这个类似。
3. 对于返回(动态分配得到的)指针的另外一种情况,比如在函数内部:
int a = new int(5);
return a;
这样做是可以的。return a执行完后,a并没有被销毁(必须要用delete才能销毁a),所以这里返回的a是有效的。
4. 如果不是基本数据类型,比如:
class A
{
public:
OtherClass * ...
};
如果在某个函数内部有一个A类的局部变量,比如:
A a;
return a;
这时候也会返回a的一个拷贝,如果A没有写深拷贝构造函数,就会调用缺省的拷贝构造函数(浅拷贝),这样做就会失败的;
如果A中提供了深拷贝构造函数,则这样做就是可以的。
在一个函数的内部,return的时候返回的都是一个拷贝,不管是变量、对象还是指针都是返回拷贝,但是这个拷贝是浅拷贝。
1. 如果返回一个基本类型的变量,比如:
int a;
a = 5;
return a;
那么就会a的一个拷贝,即5返回,然后a就被销毁了。尽管a被销毁了,但它的副本5还是成功地返回了,所以这样做没有问题。
2. 但是对于非动态分配(new/malloc)得到的指针,像1那么做就会有问题,比如在某个函数内部:
int a[] = {1, 2};
return a;
那么也会返回指针a的一个拷贝,我们假定a的地址值为0x002345FC,那么这个0x2345FC是能够成功返回的。当return执行完成后,a就要被销毁,也就是0x002345FC所指向的内存被回收了。如果这时候在函数外面,去地址0x002345FC取值,那得到的结果肯定是不对的。这就是为什么不能返回局部指针的原因。返回局部变量的引用的道理和这个类似。
3. 对于返回(动态分配得到的)指针的另外一种情况,比如在函数内部:
int a = new int(5);
return a;
这样做是可以的。return a执行完后,a并没有被销毁(必须要用delete才能销毁a),所以这里返回的a是有效的。
4. 如果不是基本数据类型,比如:
class A
{
public:
OtherClass * ...
};
如果在某个函数内部有一个A类的局部变量,比如:
A a;
return a;
这时候也会返回a的一个拷贝,如果A没有写深拷贝构造函数,就会调用缺省的拷贝构造函数(浅拷贝),这样做就会失败的;
如果A中提供了深拷贝构造函数,则这样做就是可以的。
相关文章推荐
- HDU 1426 Sudoku Killer
- HDU 1394 Minimum Inversion Number(暴力/线段树)
- Android WebView坑摘要
- Jquery获取select,dropdownlist,checkbox下拉列表框的值
- Java集合类详解
- android使用service和activity获取屏幕尺寸的方法
- java之redis篇(spring-data-redis整合)
- JAVA 信号量
- 南邮 OJ 1982 参赛选手信息更新问题II
- Java项目生成帮助文档教程
- 【第10篇】TypeScript类型比较《Type Compatibility》 案例代码详解
- centos5.8本地安装yum资源,安装软件包
- iOS设计模式之备忘录模式
- 从jQuery里面看变量与作用域
- Android学习笔记之ListView
- 南邮 OJ 1981 参赛选手身高问题II
- ajax jsonp跨域乱码解决方案
- 健壮且可读的安卓架构设计
- iOS中的GCD多线程
- mips-openwrt-linux-gcc test_usbsw.c -o usbsw 编译问题