对函数返回形式及传参方式的简单理解(实例)
2011-02-25 23:30
316 查看
函数可以返回值、引用和常量引用,其中返回常量引用与返回引用区别不大(惟一的区别就是前者返回结果是一个不能变化的对象引用)。
我们可以通过以下几个例子来理解返回值和返回引用的区别。
例1
输出结果 b: 1
函数返回一个值,该值会由形式参数复制到调用函数的环境中,因此改变a的值并不会影响b的值。
例2
输出结果 b: 2
函数返回引用,返回的结果是指向形式参数的引用,因此改变a的值会同时反映的b上。
上面两个例子改变一下传参的方式,会有不同的输出结果
例3
输出结果 b: 273185728
如前一篇的函数传参一文中所述,在调用Func函数前会调用A的构造函数将实际参数拷贝到形式参数,调用函数结束时,会调用A的析构函数释放形式参数。由于函数返回形式参数的引用,而形式参数又被释放掉了,因此这里的输出结果不是1。
例4
输出结果 b: 1
这里由于函数Func是返回值而不是引用,函数在返回时会把返回结果复制到调用函数的环境中,因此尽管形式参数会被释放掉,但对返回结果并没有影响,所以输出结果还是1。
初学C++,可能理解的不够到位,欢迎各位指正。有更好的例子也欢迎大家提出来讨论讨论,呵呵。
我们可以通过以下几个例子来理解返回值和返回引用的区别。
例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++,可能理解的不够到位,欢迎各位指正。有更好的例子也欢迎大家提出来讨论讨论,呵呵。
相关文章推荐
- 对gdb调试,函数栈的形式,以及栈对齐方式的理解和实例
- asp.net中函数返回参数和调用的实例!(超简单示例)
- c 语言函数传参的三种方式及二级指针的理解
- 用类名做方法的返回值类型 在学习Java的初始阶段,很多同学使用基本数据类型定义变量和引用类型定义变量以及使用类名做方法的返回值类型常常不知所以。今天我以自己的解读方式和个人的理解作一个简单的解释,和
- php简单实现查询数据库返回json数据(返回json数据函数实例)
- Java之协变返回类型理解和简单实例
- 最简单的 NSIS 函数返回值的返回与接收实例
- Java WebService 简单实例 方式三(axis1接口调用方式)
- 在返回拷贝的函数当中,类的各种函数的调用,尤其以拷贝形式返回时调用比较复杂,一下是结果
- php将fileterms函数返回的结果变成可读的形式
- JavaScript——以简单的方式理解闭包
- shell编程实例---实现整数的加减乘除余运算(利用read和脚本传参的方式)
- 工资计算 字典形式传参以及返回 结果
- 简单的json格式返回的前后台的实例
- 两种方式定义返回函数指针的函数
- 【Linux】关于理解fork()函数的简单例子
- 索引 视图 存储过程和函数 简单理解 以及使用创建方法
- putchar()和getchar()函数的一些简单实用实例!
- 对指针数组,数组指针,函数指针数组,函数数组指针的一些简单理解
- 用PHP写的一个冒泡排序法的函数简单实例