C/C++如何设计函数多返回值?
有那么一种情况,函数本身需要返回多个值,如在地图参数中需要返回二维坐标(x,y),或者是系统设计中需要返回一个学生多门课程的成绩。这里提供了一些做法和思路。
1. 全局变量,为什么不用它?
如,这样的方法,当我们需要通过函数对多个值进行返回和传递的时候,可以使用一种弄虚作假的方式,就是使用全局变量,不需要函数返回,只需要在关键时刻进行设置就可以了。
1 2 3 4 5 6 7 8 9 | int x,y; void getWay( int a, int b){ x=a,y=b; } int main(){ getWay(10,20); cout<<x<< " " <<y<<endl; return 0; } |
这是在自欺欺人,对,当我们需要多个值进行返回传递的时候,我们可以使用全局变量避免掉这个设计,但这并不能解决核心问题,使用全局变量当我们需要多次调用或者递归调用函数时则会出现诸如数据紊乱等的错误,而且一旦在工程中使用大量的全局变量,则会造成很多意外的后果,因此这里不过多讨论。
2. 双返回值,pair
在我们学习pair一对数据的时候我们就有了解,我们可以通过pair作为数据类型进行多组数据的传递,这往往对于两个数据(较少的数据)而言,是最理想的情况。
1 2 3 4 5 6 7 8 9 10 | pair<string, int > getClass( int id){ return make_pair( "DOTCPP!" ,id); } int main( int argc, char **argv){ pair<string, int > a; a=getClass(10); cout<<a.first<< " " <<a.second<<endl; return 0; } |
3. 指针返回法
指针返回法(又名数组返回法)顾名思义,我们的数据类型使用的是一个指针类型的数组作为返回类型,其返回的内容在内存空间上是连贯的,这个方法也被用来进行常规的数组作为参数的返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include<iostream> using namespace std; int *getWay( int n){ int *p= new int [3]; p[0]=n+10; p[1]=n+20; p[2]=n+30; return p; } int main(){ int *res = getWay(10); for ( int i=0;i<3;i++){ cout<<res[i]<< ' ' ; } delete []p; //防止内存泄漏 return 0; } |
4.结构体返回法
这个是对于超过两个元素的最推荐的写法了,对于指针返回法,其是相当于把多组的数据当成一个共同类型的参数作为处理,可一旦返回的元素同时有整形又有浮点型这样不同的元素,指针返回的方法往往就不太适用了,最理想的方式还是设计结构体,使用结构体返回法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include<iostream> using namespace std; struct ans { int a; char b; double c; }; ans getWay( int n){ struct ans r_ans; r_ans.a=n; r_ans.b=n; r_ans.c=n+0.11; return r_ans; } int main(){ ans ans = getWay(97); cout<<ans.a<< ' ' <<ans.b<< ' ' <<ans.c<<endl; return 0; } //output: //97 a 97.11 |
这样有点类似于在第二第三章所学的数据结构定义的内容,事实上的确是相通的,函数多返回值是C/C++设计上所缺失的,也由于时代原因当时的设计不需要考虑如今那么多,而如今的各种新型语言均支持了这个概念,直接使用逗号进行分割即可达到效果。
5. 眼馋一下,看看PYTHON的写法
1 2 3 4 5 6 7 8 | def getWay(n): a = n b = chr (n) c = n + 0.11 return a,b,c x,y,z = getWay( 97 ) print (x,y,z) |
没错,这样就完成了本章第五点C++中花大篇幅介绍的功能,C语言网Dotcpp已经上线Python编译器,允许各位使用Python答题,欢迎大家使用。