关于C++对函数传参与函数返回值进行引用传递的详解
2010-10-30 10:10
357 查看
关于C++对函数传参与函数返回值进行引用传递的详解
在坛子里看到这个问题,搞出来说一说,希望对大家有帮助。本文主要讲解在C++中对函数传参与函数返回值进行引用传递的含义,重载“=”的问题。文中以实例讲解,希望有助于大家理解。
读之前,请确定您已经知道引用传递是个什么东东,只是对它有点混淆。没听过引用传递或没读过引用传递概念的同学不适合读本文。
例子程序:
例1.一个编译不过去的程序
OK,下面进入正题。如果我想利用fun函数来实现令mycopy1与mycopy2两个变量共用同一内存空间的功能。
例2.一个达不到目的例子
问题出在,函数传参时,用的值传递,而不是引用。值传递会自制出一个新对象obj,生存期是fun函数执行期间。obj不是我们期待的mycopy2,所以达不到目的。为了让函数体内的obj就是mycopy2“本体”,我们用引用传递。
例3.利用引用传递传参,但仍达不到效果
问题是,怎么还不行?好吧,您会经常看到这样的经典用法:
MyCopy & fun(MyCopy & obj);
为什么返回值也要用&修饰?我们先来讲上例中的函数调用原理,这很重要。函数fun被调用时,mycopy2的实体在fun内有意义,也就是说obj和mycopy2是共用一块内存的。而return时,复制了一份mycopy2,返回给了mycopy1。然后由于“=”的作用,这块复制出的mycopy2按“=”的作用,将自己的成员变量的值赋给了mycopy1。最后mycopy1的内存没有发生变化,只是成员变量的值变了。
例4.让返回值也是引用传递
为什么还不行?是这样的,在调用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++。
neonlight <neonlight@live.cn>,BLOG:http://blog.csdn.net/neonlight 转载请注明出处,谢谢!2009-12-07
在坛子里看到这个问题,搞出来说一说,希望对大家有帮助。本文主要讲解在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++。
neonlight <neonlight@live.cn>,BLOG:http://blog.csdn.net/neonlight 转载请注明出处,谢谢!2009-12-07
相关文章推荐
- 关于C++里面的函数中,按值传递与按引用传递的区别
- C++内存分配、函数调用(值传递、指针传递、引用传递)、返回值问题
- 【从C到C++学习笔记】引用/const引用/引用传递/引用作为函数返回值/引用和指针的区别
- 再开一篇关于C++程序设计基核心之一:引用,指针,符号优先级,函数参数传递
- C++函数参数和返回值三种传递方式:值传递、指针传递和引用传递(着重理解)
- C++函数参数和返回值三种传递方式:值传递、指针传递和引用传递(着重理解)
- C++ 值传递、指针传递、引用传递详解
- C++ 值传递、指针传递、引用传递详解
- 【转】C++函数——指针和引用类型的参数传递
- C/C++中关于地址、指针和引用变量的学习笔记(四) : 函数
- C/C++中函数参数传递详解
- 【转载】C++ 值传递、指针传递、引用传递详解
- C++ 关于 调用函数时值传递和引用的理解
- c++引用做函数返回值
- c++值传递 指针传递 引用传递详解(转载)
- 第二周,C/C++语言中函数参与传递的三种方式
- 2017033000C++函数参数和返回值三种传递方式:值传递、指针传递和引用传递(着重理解)
- C++指针作为函数的参数进行传递时注意的问题
- C++ 值传递、指针传递、引用传递详解
- c++函数传参之引用传递