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

转载 2012年03月28日 23:02:17

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

 

实验代码如下:

#include <iostream>

using namespace std;

int some_fun1()

{

    int a = 5;

    return a;                   //OK

}

 

int* some_fun2()

{

    int a = 5;

    int *b = &a;

    return b;                   // not OK

}

 

int* some_fun3()

{

    int *c = new int(5);

    return c;                   // OK, return c执行完后并没被销毁必须要用delete才能销毁

}

 

class CSomething

{

public:

    int a;

    int b;

 

public:

    CSomething(int a, int b)

    {

        this->a = a; 

        this->b = b;

    }

};

 

class CA

{

private:

    CSomething* sth;            // 以指针形式存在的成员变量

                               

public:

    CA(CSomething* sth)

    {

        this->sth = new CSomething(sth->a, sth->b);

    }

 

    // 如果不实现深拷贝,请注释这个拷贝构造函数

    CA(CA& obj)

    {

         sth = new CSomething((obj.sth)->a, (obj.sth)->b);

    }

 

    ~CA()

    {

        cout << "In the destructor of class CA..." << endl;

        if (NULL != sth) delete sth;

    }

    void Show()

    {

        cout << "(" << sth->a << ", " << sth->b << ")" << endl;

    }

    void setValue(int a, int b)

    {

        sth->a = a;

        sth->b = b;

    }

    void getSthAddress()

    {

        cout << sth << endl;

    }

};

 

CA some_fun4()

{

    CSomething c(1, 2);

    CA a(&c);

    return a;                       // 如果CA没有实现深拷贝not OK如果实现深拷贝OK

}

 

int main(int argc, char* argv[])

{

    int a = some_fun1();

    cout << a << endl;              // OK

 

    int *b = some_fun2();

    cout << *b << endl;             // not OK即便返回结果正确也不过是运气好而已

 

    int *c = some_fun3();           // OK, return c执行完后c并没有被销毁必须要用delete才能销毁

    cout << *c << endl;

    delete c;

 

    CA d = some_fun4();             // 如果CA没有实现深拷贝not OK如果实现深拷贝OK

    d.Show();

 

 

    return 0;

}

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

在一个函数的内部,return的时候返回的都是一个拷贝,不管是变量、对象还是指针都是返回拷贝,但是这个拷贝是浅拷贝。   1.     如果返回一个基本类型的变量,比如: int a...
  • maochengtao
  • maochengtao
  • 2014年10月22日 12:55
  • 305

函数返回值的几种情况

在一个函数的内部,return的时候返回的都是一个拷贝,不管是变量、对象还是指针都是返回拷贝,但是这个拷贝是浅拷贝。 如果返回一个基本类型的变量,比如: int a;a = 5;return a;那么...
  • liuhaitaowq
  • liuhaitaowq
  • 2016年09月18日 19:59
  • 145

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

转自:http://blog.csdn.net/laoyang360/article/details/8169738关于函数返回值的几种情况   在一个函数的内部,return的时候返回的都是一个拷贝...
  • happy137
  • happy137
  • 2016年11月20日 15:33
  • 157

函数返回值的情况

原文地址:http://patmusing.blog.163.com/blog/static/13583496020113191407531/ 在一个函数的内部,return的时候返回的都是一个...
  • clp20097522
  • clp20097522
  • 2015年08月08日 09:44
  • 264

互质(互素)

互质最大公因数是1的两个整数。——>互质1和任何数都是互质的。(本身除外) 1和-1与所有整数互素,而且它们是唯一与0互素的整数。 互质判断方法: 两个数互质的情况: 两个不同的质数是互质的。...
  • m0_37131359
  • m0_37131359
  • 2017年12月20日 11:46
  • 107

C++编译器提供默认构造函数的几种情况

第一种是类成员中有成员是类对象,并且该成员的类含有默认构造函数,那么C++编译器会帮你给这个类也生成一个默认构造函数,用来调用其成员对象的构造函数,完成该成员的初始化构造。需要强调的是,如果这个成员的...
  • lz_26
  • lz_26
  • 2009年09月19日 18:31
  • 1233

关于函数返回值有多个的情况

函数的输出参数有多个怎么办?通常的解决方法有两种,一 是使用”引用”,把输出参数当作可变的输入参数传进来,二是把所有输出参数打包成 一个结构体,返回整个结构。两种方法各有千秋,下面提供例子。 a除以...
  • qq_31699373
  • qq_31699373
  • 2016年09月07日 21:34
  • 68

css盒模型margin折叠问题解决方案总结

test #header { width: 100%; height: 6rem; text-align: center; background-co...
  • zerlinda_c
  • zerlinda_c
  • 2015年11月26日 13:12
  • 1128

直线方程的多种表示

直线方程的公式有以下几种: 斜截式: y = kx + b 如果一直两点 则 k=(y2-y1)/(x2-x1)   (很明显要求x1 != x2) 截距式: x / a + y / b =...
  • cay22
  • cay22
  • 2011年03月31日 13:29
  • 1211

几种简单的概率分布

【离散型分布】1. (0-1)分布如果随机变量X只能取两个值0和1,它的分布律是: P{X=k}=pk(1−p)k,k=0,1,(0...
  • legend4917
  • legend4917
  • 2015年07月22日 11:58
  • 577
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于函数返回值的几种情况
举报原因:
原因补充:

(最多只允许输入30个字)