如何判断某个函数是否应该有类型?我的意思是,它应该有返回类型吗?例如,
double add(double a, double b)
{
double sum;
sum = a + b;
return sum;
}
double sum;
void add(double a, double b, double sum)
{
sum = a + b;
}
这两个相同吗?
答案 0 :(得分:1)
函数必须始终具有类型,尽管返回类型可以
是void
。但是,通常,如果函数具有值,则为
应该使用返回值;没有返回值的函数是
通常仅用于副作用。 (可能有一个
具有多个返回值的函数的异常,但是
这样的功能应该比较少见。)
最后,C ++使用pass by value,所以你的第二个例子就是
永远不要修改全局sum
。你需要指定通行证
通过非const引用:
void add( double a, double b, double& sum )...
或使用指针。
编辑:
关于返回的性能影响 复杂类型:C ++被设计为允许一定数量 优化,称为RVO(用于返回值优化)和 NRVO(用于命名返回值优化); C ++增加了移动 语义也是如此。因此,表现很少是违反的理由 良好的编程实践(主张返回值)。如果 探查器确实显示了一个问题,但是,最好的解决方案是 可能是:
void
doConcat( std::vector<double> const& a,
std::vector<double> const& b,
std::vector<double>& results )
{
results.reserve( a.size() + b.size() );
results = a;
results.insert( results.end(), a.begin(), a.end() );
}
std::vector<double>
Concat( std::vector<double> const& a, std::vector<double> const& b )
{
std::vector<double> sum;
doConcat( a, b, sum ):
return sum;
}
这样,大多数客户端代码都可以继续使用自然代码 界面,只有探查者坚持的地方 必须使用尴尬的界面。
答案 1 :(得分:0)
这些不一样 - 在第二个函数中,你按值传递“sum”,所以当你执行“sum = a + b”时,你只对本地副本进行算术运算。
纠正这个看起来像:
void add(double a, double b, double& sum){
sum=a+b;
}
注意&符号 - 这意味着您通过引用传入“sum”,并且您在函数中对“sum”所做的任何更改实际上将更改调用它的函数范围内的变量“sum”
一般来说,如果一个函数在逻辑上应该有一个返回类型(AKA,它让函数有一个感觉),那就给它一个。
答案 2 :(得分:0)
简单的答案是,这取决于你的意图。
P.S。:第二个:
double sum;
void add(double a, double b, double sum)
{
sum = a + b;
}
它根本无法更改sum
,输入参数double sum
将隐藏函数范围中的全局double sum
,因此全局sum
将不会在函数后更新
你可能意味着
void add(double a, double b, double &sum)
{
sum = a + b;
}
要继续阅读,请查看Return vs. Not Return of functions?