首页 > 代码库 > 关于函数返回值的几种情况

关于函数返回值的几种情况

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取值,那得到的结果肯定是不对的。这就是为什么不能返回局部指针的原因。返回局部变量的引用的道理和这个类似。

 

 

关于为什么不能返回局部变量的引用

比如

const string &mainp(const  string &s)

{

  string ret=s;

  return ret

}

 

引用传递是传递地址,返回也是返回地址,你是把地址给了人家,函数调用结束后地址上的内容就销毁了,所以你指向的内容有可能不存在

 

 

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中提供了深拷贝构造函数,则这样做就是可以的。

 

 

关于函数返回值的几种情况