十四、C++中如何处理多返回值
本部分也是碎碎念,因为这些点都是很小的点,构不成一篇文章,所以本篇就是想到哪个点就写哪个点。
1、C++中如何处理多个返回值
写过python的同学都知道,当你写一个函数的返回时,那是你想返回谁就能返回谁,想返回几个就可以返回几个,几乎是非常的随心所欲了,因为python背后是做了很多很多事情才让你如此肆意的。C++就非常不行了,因为C++本身就很底层,没有更底层的东西去为它做这些事情了,所以所有都得C++自己花式变出来。
我们都知道,C++默认情况下,一个函数是不能返回两个对象的,就是只能返回一个特定的对象,所以更别提返回多个类型的对象了。
那你的意思是python都能完成的事情,C++却完成不了?非也,这两者根本都没有可对比性。C++是底层,就是所有顶层的东西都是底层一生二、二生三、三生万物而呈现出来的百花齐放。底层不存何来万物。所以C++当然也可以实现返回多个对象,只是这个实现过程需要你用你的智慧去实现。
所以在C++中,你要使一个函数返回多个对象或者多种类型的对象,其实是有很多不同的方法可以实现的。下面我就尽量多罗列几种方法。
(1)利用结构体实现。我个人也比较推荐这种方法,比较清晰也好理解。
这里想强调的是,只要涉及到多返回值,或多或少都要涉及到复制,只要涉及到复制,性能就是一个绕不开的话题。上述例子中,两个字符串是程序进入main函数后,先开始运行func函数,而运行func函数就先组织参数,组织参数就是在常量区先写入"lyy""liyuanyuan"这两个字符串,然后才开始执行func,func又是在栈内存创建的,而执行func我们是通过引用传参的,这样就少了一次复制。
func函数执行完毕,就是赋值给e。此时就得先找到连续的空间给e,然后把e的3个对象的值初始化成func的返回值。此时必定的复制呀。所以这里想说的是不管你使用哪种方法,你脑子里一定要不断确认是否有性能问题。
(2)通过参数实现。这种方法不需要使用C++提供的特定类(方法),但是比较难懂
通过参数实现一个函数多返回值的方法,就比较难理解,不过如果你对传值、传址、指针、引用这些基础概念非常清晰的话,其实也不难。
所以这里要强调的是,如果你是通过参数实现的,那你千万可不能传值,传值将不会得到你想要的结果的。因为func函数的返回值变量,我们是先定义到main函数里,然后再把变量的引用(上左图)或者变量的地址(上右图)传给func,然后在func函数体内初始化或者修改或者赋值这些变量的。
如果你传给func是变量的值,那func会在自己体内重新复制一份数据,然后再计算,结果就和main函数中定义的变量完全无关了,所以你就得不到你想要的结果了。
(3)通过数组实现。待续。。。。