C语言到C++STL菜鸟教程:如何设计函数多返回值?

2022-07-1713:04:40编程语言入门到精通Comments1,571 views字数 1752阅读模式

有那么一种情况,函数本身需要返回多个值,如在地图参数中需要返回二维坐标(x,y),或者是系统设计中需要返回一个学生多门课程的成绩。这里提供了一些做法和思路。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25128.html

1. 全局变量,为什么不用它?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25128.html

如,这样的方法,当我们需要通过函数对多个值进行返回和传递的时候,可以使用一种弄虚作假的方式,就是使用全局变量,不需要函数返回,只需要在关键时刻进行设置就可以了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25128.html

int x,y;
void getWay(int a,int b){
    x=a,y=b;
}
int main(){
    getWay(10,20);
    cout<<x<<" "<<y<<endl;
    return 0;
}

这是在自欺欺人,对,当我们需要多个值进行返回传递的时候,我们可以使用全局变量避免掉这个设计,但这并不能解决核心问题,使用全局变量当我们需要多次调用或者递归调用函数时则会出现诸如数据紊乱等的错误,而且一旦在工程中使用大量的全局变量,则会造成很多意外的后果,因此这里不过多讨论。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25128.html

2. 双返回值,pair文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25128.html

在我们学习pair一对数据的时候我们就有了解,我们可以通过pair作为数据类型进行多组数据的传递,这往往对于两个数据(较少的数据)而言,是最理想的情况。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25128.html

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. 指针返回法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25128.html

指针返回法(又名数组返回法)顾名思义,我们的数据类型使用的是一个指针类型的数组作为返回类型,其返回的内容在内存空间上是连贯的,这个方法也被用来进行常规的数组作为参数的返回。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25128.html

#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.结构体返回法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25128.html

这个是对于超过两个元素的最推荐的写法了,对于指针返回法,其是相当于把多组的数据当成一个共同类型的参数作为处理,可一旦返回的元素同时有整形又有浮点型这样不同的元素,指针返回的方法往往就不太适用了,最理想的方式还是设计结构体,使用结构体返回法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25128.html

#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++设计上所缺失的,也由于时代原因当时的设计不需要考虑如今那么多,而如今的各种新型语言均支持了这个概念,直接使用逗号进行分割即可达到效果。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25128.html

5. 眼馋一下,看看PYTHON的写法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25128.html

def getWay(n):
    a=
    b=chr(n)
    c=n+0.11
    return a,b,c
 
x,y,z=getWay(97)
print(x,y,z)

没错,这样就完成了本章第五点C++中花大篇幅介绍的功能。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25128.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25128.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/25128.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定