`

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

    博客分类:
  • 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++。

分享到:
评论

相关推荐

    C++函数详解

    这些函数由`return_type function_name(parameters)`定义,其中`return_type`是函数返回值的类型,`function_name`是函数名,`parameters`是传递给函数的参数列表。 3. **无参函数**:不接收任何参数的函数,参数...

    C++复制构造函数详解

    1. **对象作为函数参数**:当你将一个对象传递给函数或作为返回值时,如果函数接受或返回的是对象的引用或指针,那么复制构造函数可能被调用。 2. **数组和集合中的元素**:当对象是数组、向量或其他容器(如std::...

    C++语言编程函数详解

    通过对C++函数的深入探讨,我们不仅了解了函数的基础概念和使用方法,还学习了一些高级特性,如内联函数、变长参数列表和函数模板等。这些知识对于编写高效、可维护的C++程序至关重要。希望本文能够帮助读者更好地...

    C++函数详解与应用实例.ppt

    C++ 函数详解与应用实例 C++ 函数是将任务进行模块划分的基本单位,一个函数实现一项功能。在面向对象程序设计中,函数是对数据的一项操作,也是实现一项功能。要掌握函数的使用,必须理解函数调用时的内部实现机制...

    C++函数详解与应用实例ppt课件.ppt

    C++函数详解与应用实例ppt课件 以下是从给定的文件信息中生成的相关知识点: ...本节课件主要介绍了C++函数的定义、调用、类型、参数传递、返回值、生命期和作用域等知识点,并对函数的一些高级议题进行了介绍。

    C/C++函数参考详解

    在编程世界里,C和C++是两种非常基础且强大的编程语言,...无论是初学者还是经验丰富的开发者,对C/C++函数深入的理解和熟练掌握都是提高编程能力的关键。记得在实践中不断练习和探索,因为实践是检验真理的唯一标准。

    C++高级参考手册,讲解C++ 语法,函数重载,构造函数等

    引用安全且不会为空,常用于函数参数和返回值,以避免复制大对象带来的开销。 10. **拷贝构造函数**:拷贝构造函数是一种特殊的构造函数,用于创建一个新对象作为现有对象的副本。当对象作为参数传递、返回函数值或...

    C++拷贝构造函数详解1

    【C++拷贝构造函数详解】 C++中的拷贝构造函数是类的一个特殊构造函数,它的主要作用是在创建新对象时,将已有对象的内容复制到新对象中。这是类对象在某些特定情况下的必需操作,因为类对象通常具有更复杂的内部...

    c++ 自定义函数,干货

    * 函数值类型说明:指函数返回值的数据类型,如 int、char 等。 * 函数名:是一个标识符,用于标识函数。 * 参数说明表:是函数的参数列表,用于传递参数给函数。 * 函数体:是函数的执行体,包括函数的执行语句。 ...

    C++_引用的作用和用法

    - 不可以直接对引用求地址。 #### 引用的应用场景 引用在C++中有多种实用的应用场景,下面我们逐一介绍。 ##### 1. 作为函数参数 引用可以用作函数参数,这在处理大量数据时非常有用,因为这样可以避免复制整个...

    详解C++编程中向函数传递引用参数的用法

    在C++编程中,向函数传递引用参数是一种高效且灵活的方法,它允许函数直接操作调用者提供的对象,而无需复制数据。这在处理大型对象或者需要修改原对象的情况下特别有用。引用不是独立的对象,而是现有对象的别名,...

    c++画圆函数

    ### C++ 中绘制圆形与椭圆的函数 在C++编程语言中,处理图形界面时,经常需要用到绘制基本图形的功能,比如圆形和椭圆。本文将详细介绍如何在C++中利用特定函数来实现圆形和椭圆的绘制。 #### 函数定义 在C++中,...

    详解C++调用Python脚本中的函数的实例代码

    以上内容概述了C++调用Python脚本中函数的整个流程,包括环境配置、脚本编写、C++中的调用代码实现、以及软件发布时对Python代码的保护。这个过程涉及到多个知识点,包括C++与Python交互的接口使用、Python的模块...

    详细讲解C++回调函数的文档!

    回调函数在C++编程中是一种重要的机制,它允许我们将一个函数的指针作为参数传递给另一个函数,由后者在适当的时候调用。这种方式使得我们能够实现灵活的代码组织和解耦,尤其在需要定制行为或者处理多种不同类型的...

    C语言函数大全及详解。

    - **传引用(Pass by Reference)**:通过指针实现,函数可以通过修改指针变量来改变实参的值,如`void swap(int *a, int *b)`。 5. **函数的返回值**: 函数可以有返回值,也可以没有返回值。返回值通过`return`...

    C++函数

    ### C++函数详解 #### 一、C++函数概述 在C++编程语言中,**函数**是程序的基本组成单位之一,它允许开发者将代码分解为较小、可管理且易于理解的部分。通过定义函数,可以封装一系列执行特定任务的操作,并在程序...

    VC++函数详解大全

    - **函数定义与调用**:了解函数的声明、定义和参数传递,以及如何返回值。 2. **MFC函数** - **消息处理**:MFC通过消息映射机制处理Windows消息,如`ON_MESSAGE`、`ON_COMMAND`等。 - **控件操作**:MFC提供了...

    C++指针与引用的详解

    从代码可读性的角度,引用传递的函数调用看起来像直接修改变量,而实际上它提供了和指针传递一样的功能。引用的引入使得C++的编程风格更加清晰,特别是在实现容器(如`std::vector`)的`operator[]`这样的操作符时,...

    回调函数详解

    ### 回调函数详解 #### 一、回调函数的基础概念及使用场景 **回调函数**是一种编程技术,广泛应用于各种编程语言中,特别是在C++这样的面向对象编程语言中更是常见。简单来说,回调函数就是一个通过函数指针传递的...

    c/c++回调函数

    ### C/C++中的回调函数详解 #### 回调函数的概念及意义 在C/C++编程中,**回调函数**是一种非常重要的编程模式和技术,广泛应用于各种场景,如定时器事件处理、进度监控等功能的实现。回调函数的核心在于,它允许...

Global site tag (gtag.js) - Google Analytics