我想知道返回值的函数和将值设置为指针的函数之间的区别,例如:
指针:
int myVal;
ptr_multiply(5, 5, &myVal);
cout << myVal << endl; //Output: 25
返回:
int myVal = rtn_multiply(5, 5);
cout << myVal << endl; //Output: 25
我的问题集中在创建函数时选择何种方法以及为什么,以及我们在每个函数中可以找到哪些优点/缺点。
答案 0 :(得分:1)
可读性是函数通常返回您期望它们返回的主要原因。但是,由于这是非常主观的,我建议您在项目中努力保持一致性。
当你希望一个函数返回多个东西而不是将它们全部组合在一个结构中以便你可以返回它们时,另一种方法就是在输出参数中返回它们。
答案 1 :(得分:0)
如果您要返回大量数据,那么您可能会遇到性能问题。原因是必须复制返回值。
但在大多数情况下,您不必担心这一点,因为现代编译器能够自动内联这类内容。
旁注:在C ++中尽量避免使用裸指针(使用引用,智能指针)
答案 2 :(得分:0)
使用“指针”方法的一个优点是,您可以通过传入非常量引用或指针来获得多个“返回”值。例如:
int output1;
int output2;
get_values("input", &output1, &output2)
答案 3 :(得分:0)
您可以返回成功/失败:
int v = -1;
if(ToInt("wibble",&v)){
// do something with v
}
会失败,因为&#34; wibble&#34;无法转换为int。
另一个有用的功能是该功能不必更改v:
int v = previousValue;
UpdateIfNewValueFound( &v )
答案 4 :(得分:0)
返回值。对于现代编译器, 两者之间的性能几乎没有差异,但返回值有几个优点:
它更容易使用 - 可以减少所需行数的一半!比较
int r = f();
到
int r;
f(&r);
它可以让你成为更好的程序员;你必须付出更多的努力来从函数中返回多个值(例如,通过struct
或pair
,而不是添加另一个参数)。如果你发现你需要经常这样做,那么额外的努力可能会迫使你更仔细地考虑你的代码设计 - 通常情况下,一个函数可以更好地执行/返回一件事。
答案 5 :(得分:0)
另一个区别是堆栈或堆。
返回值位于堆栈顶部。指针变体位于堆中。
例如(用于演示堆栈返回的无情递归代码):
typedef std::array<int,1000> KByte;
KByte tmp;
KByte f(int nr) {
if (nr == 1) { tmp[nr]=nr; return tmp; }
else { tmp[nr]=nr; return f(nr-1); };
}
void f2(int nr, KByte& ret) {
if (nr == 1) { ret[1]=1; }
else { ret[nr]=nr; f2( nr-1, ret ); }
};
调用
KByte t = f(999); /* Stack error */
shoud给你一个堆栈大小的错误,因为堆栈上的1000 KByte(1GB)是很多。
致电
KByte t2;
f2( 999, t2 );
应该没有堆栈问题。 (它也使用递归深度1000,但不会将返回值放在堆栈上。