【问题标题】:function overloading vs default argument in c++C ++中的函数重载与默认参数
【发布时间】:2013-01-11 19:03:58
【问题描述】:

您好,我有一个困惑,或者说更多我需要了解一些东西。我有一个过程和另一个相同的重载过程。

    string conct (string a, string b) {
      string str = conct(a, b, "string");
      return str;
    }

    string conct (string a, string b, const char* c) {
      // do the processing;
      return concatenated_string;
    }

如果我在重载函数中将c 作为默认参数,是否有可能不是有两个重载函数。因此,即使有人只传递了两个参数,我也可以只有一个函数来处理这种情况。

但我主要关心的是第三个参数,目前是const char* c。因此,如果我将其设置为const char* c = "string" 之类的东西,那么使用具有默认参数的一个函数来处理删除重载的情况是否是正确的方法。

我看到了here 的帖子,但这似乎集中在编译上,而不是我的困惑。

【问题讨论】:

  • 是的。可以使用默认参数
  • 我还有一个小问题,函数重载有助于提高可维护性。但是当重载的过程被非常频繁地调用时,它是否会影响整体性能?
  • 关于您的评论:函数重载是在编译时解决的,因此对运行时性能绝对没有影响。

标签: c++ overloading default-arguments


【解决方案1】:

是的,你可以用一个函数和一个默认参数替换你的重载函数:

string conct (string a, string b, const char* c = "string") {
  // do the processing;
  return concatenated_string;
}
  • 当您重载函数时,编译器会为每个函数生成代码,这可能会导致代码变大。
  • 如果重载只是像您的情况一样充当瘦包装器,那么优化器可能会消除额外的工作。
  • 默认参数设置在调用者的位置,而不是函数内部,因此默认参数必须是公开可见的,更改它们需要重新编译所有调用者。对于像你这样的重载, psuedo-default 参数成为一个隐藏的细节。

【讨论】:

  • 所以一般来说,无论我是否删除第一个函数并在第二个中添加第三个参数作为默认值,它对我的​​情况并没有任何帮助。
  • 赞成添加“默认参数设置在调用者的位置,而不是在函数内部”。这就解释了为什么我们不需要在方法的定义中指定默认值
【解决方案2】:

默认值可以在函数原型中使用,但是如果我们想默认中间参数,那么我们必须将所有值默认到它的右边... 另一方面,可以为所有可能的参数组合重载一个函数,也不需要将默认值放在函数调用堆栈上,因此编译器的工作量更少......

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多