对函数返回形式及传参方式的简单理解(实例)

    技术2022-05-20  51

     

    函数可以返回值、引用和常量引用,其中返回常量引用与返回引用区别不大(惟一的区别就是前者返回结果是一个不能变化的对象引用)。

     

    我们可以通过以下几个例子来理解返回值和返回引用的区别。

    例1

    #include "stdafx.h" #include <iostream> class A { public: int v; A(int v) { this->v = v; } }; A Func(A& a) { return a; } int _tmain(int argc, _TCHAR* argv[]) { A a(1); A& b = Func(a); a.v = 2; std::cout << "b: " << b.v << std::endl; return 0; } 输出结果 b: 1函数返回一个值,该值会由形式参数复制到调用函数的环境中,因此改变a的值并不会影响b的值。

     

    例2#include "stdafx.h" #include <iostream> class A { public: int v; A(int v) { this->v = v; } }; A& Func(A& a) { return a; } int _tmain(int argc, _TCHAR* argv[]) { A a(1); A& b = Func(a); a.v = 2; std::cout << "b: " << b.v << std::endl; return 0; }

    输出结果 b: 2函数返回引用,返回的结果是指向形式参数的引用,因此改变a的值会同时反映的b上。

     

     

    上面两个例子改变一下传参的方式,会有不同的输出结果

    例3#include "stdafx.h" #include <iostream> class A { public: int v; A(int v) { this->v = v; } }; A& Func(A a) { return a; } int _tmain(int argc, _TCHAR* argv[]) { A a(1); A& b = Func(a); a.v = 2; std::cout << "b: " << b.v << std::endl; return 0; }

    输出结果 b: 273185728如前一篇的函数传参一文中所述,在调用Func函数前会调用A的构造函数将实际参数拷贝到形式参数,调用函数结束时,会调用A的析构函数释放形式参数。由于函数返回形式参数的引用,而形式参数又被释放掉了,因此这里的输出结果不是1。

     

    例4

    #include "stdafx.h" #include <iostream> class A { public: int v; A(int v) { this->v = v; } }; A Func(A a) { return a; } int _tmain(int argc, _TCHAR* argv[]) { A a(1); A& b = Func(a); a.v = 2; std::cout << "b: " << b.v << std::endl; return 0; }

    输出结果 b: 1这里由于函数Func是返回值而不是引用,函数在返回时会把返回结果复制到调用函数的环境中,因此尽管形式参数会被释放掉,但对返回结果并没有影响,所以输出结果还是1。

     

    初学C++,可能理解的不够到位,欢迎各位指正。有更好的例子也欢迎大家提出来讨论讨论,呵呵。


    最新回复(0)