如何确定C ++函数类型?

时间:2014-05-06 17:26:05

标签: c++

如何判断某个函数是否应该有类型?我的意思是,它应该有返回类型吗?例如,

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;
}

这两个相同吗?

3 个答案:

答案 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?