关于C++对函数传参与函数返回值进行引用传递的详解

关于C++对函数传参与函数返回值进行引用传递的详解

  在坛子里看到这个问题,搞出来说一说,希望对大家有帮助。本文主要讲解在C++中对函数传参与函数返回值进行引用传递的含义,重载“=”的问题。文中以实例讲解,希望有助于大家理解。

  读之前,请确定您已经知道引用传递是个什么东东,只是对它有点混淆。没听过引用传递或没读过引用传递概念的同学不适合读本文。

例子程序:

例1.一个编译不过去的程序

#include <iostream>

using namespace std;

class MyCopy{

    public:

        int a;

        fun(MyCopy & obj); //声明函数没有返回值

};

MyCopy::fun(MyCopy obj)  //定义函数没有返回值

{

    return obj;  //却返回了obj,当然编译不过去

}

int  main(){

    MyCopy mycopy1, mycopy2;

    mycopy1.a = 1;

    mycopy2.a = 2;

    cout << mycopy1.a <<endl;

    cout << mycopy2.a <<endl;

    return 0;

}

  OK,下面进入正题。如果我想利用fun函数来实现令mycopy1与mycopy2两个变量共用同一内存空间的功能。

例2.一个达不到目的例子

#include <iostream>

using namespace std;

class MyCopy{

    public:

        int a;

        MyCopy fun(MyCopy obj);

};

MyCopy MyCopy::fun(MyCopy obj)

{

    return obj;

}

int  main(){

    MyCopy mycopy1,mycopy2;

    mycopy1.a = 1;

    mycopy2.a = 2;

    mycopy1 = mycopy2.fun(mycopy2);  //新加的函数调用

    mycopy2.a = 3;  //新加的赋值

    cout << mycopy1.a <<endl;  //打印 2 -- 期待打印 3

    cout << mycopy2.a <<endl;  //打印 3

    return 0;

}

  问题出在,函数传参时,用的值传递,而不是引用。值传递会自制出一个新对象obj,生存期是fun函数执行期间。obj不是我们期待的mycopy2,所以达不到目的。为了让函数体内的obj就是mycopy2“本体”,我们用引用传递。

例3.利用引用传递传参,但仍达不到效果

#include <iostream>

using namespace std;

class MyCopy{

    public:

        int a;

        MyCopy fun(MyCopy & obj); //引用传参

};

MyCopy MyCopy::fun(MyCopy & obj)  //引用传参

{

    return obj;

}

int  main(){

    MyCopy mycopy1,mycopy2;

    mycopy1.a = 1;

    mycopy2.a = 2;

    mycopy1 = mycopy2.fun(mycopy2);

    mycopy2.a = 3;

    cout << mycopy1.a <<endl;  //打印 2 -- 期待打印 3

    cout << mycopy2.a <<endl;  //打印 3

    return 0;

}

  问题是,怎么还不行?好吧,您会经常看到这样的经典用法:

MyCopy & fun(MyCopy & obj);

  为什么返回值也要用&修饰?我们先来讲上例中的函数调用原理,这很重要。函数fun被调用时,mycopy2的实体在fun内有意义,也就是说obj和mycopy2是共用一块内存的。而return时,复制了一份mycopy2,返回给了mycopy1。然后由于“=”的作用,这块复制出的mycopy2按“=”的作用,将自己的成员变量的值赋给了mycopy1。最后mycopy1的内存没有发生变化,只是成员变量的值变了。

例4.让返回值也是引用传递

#include <iostream>

using namespace std;

class MyCopy{

    public:

        int a;

        MyCopy & fun(MyCopy & obj); //返回值引用传递

};

MyCopy & MyCopy::fun(MyCopy & obj)  //返回值引用传递

{

    return obj;

}

int  main(){

    MyCopy mycopy1,mycopy2;

    mycopy1.a = 1;

    mycopy2.a = 2;

    mycopy1 = mycopy2.fun(mycopy2);

    mycopy2.a = 3;

    cout << mycopy1.a <<endl;  //打印 2 -- 期待打印 3

    cout << mycopy2.a <<endl;  //打印 3

    return 0;

}

  为什么还不行?是这样的,在调用fun函数后mycopy2与obj在fun生存期内共用一块内存。返回时由于是按引用传递的,这块内存也被返回过来。与上例返回一个临时复制的对象不同,这次真的返回了mycopy2的“本体”,可是由于“=”作用,mycopy2成员变量的值被赋给了mycopy1的成员变量,于是mycopy1还是原来的mycopy1。

  我们现在有两个问题:

  1、怎么理解“=”。

  2、我想让mycopy1与mycopy2指向同一块内存应该怎么做?

  解答:

  1、“=”可以这样理解mycopy1 = mycopy2;相当于调用了函数 mycopy1.=(mycopy2)。看不懂?OK,这些看得懂吧:Myobj.a(),Myobj.b(),那这个呢Myobj.=(),就是一个名字为“=”的函数。所以函数“=”里怎么写,很重要。这也是重载“=”运算符后,要实现对象复制必需将成员变量一一赋值的原因。

  2、OK,要达到目的,可以这样做MyCopy & mycopy2 = mycopy1;当然也有其它方法。

  本文编译环境为Ubuntu/g++。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值