c++ - 使用默认函数参数的优点

标签 c++

int add (int x, int y=1)
int main ()
{
  int result1 = add(5);
  int result2 = add(5, 3);
  result 0;
}

对比

int add (int x, int y)
int main ()
{
  int result1 = add(5, 1);
  int result2 = add(5, 3);
  result 0;
}

在执行速度、内存使用等方面,使用默认函数参数有什么优势?对于像我这样的初学者,在意识到默认函数参数的这种用法之前,我有时会感到困惑;没有默认函数参数的编码不是更容易阅读代码吗?

最佳答案

您的 add 函数不是如何使用默认参数的好示例,您是正确的,使用默认参数更难阅读。

但是,并非所有功能都如此。考虑 std::vector::resize,它看起来像:

template<class T>
struct vector_imitation {
  void resize(int new_size, T new_values=T());
};

这里,在不提供值的情况下调整大小使用 T()。这是一个很常见的情况,我相信几乎每个人都觉得 resize 的单参数调用很容易理解:

vector_imitation<int> v;  // [] (v is empty)
v.resize(3);              // [0, 0, 0] (since int() == 0)
v.resize(5, 42);          // [0, 0, 0, 42, 42]

即使从不需要构造 new_value 参数:当调整到较小的尺寸时。因此对于某些函数,重载比默认参数更好。 (我会将 vector::resize 包括在这个类别中。)例如,std::getline 以这种方式工作,尽管它没有其他选择,因为第三个参数的“默认”值是根据第一个参数计算的。像这样的东西:

template<class Stream, class String, class Delim>
Stream& getline_imitation(Stream &in, String &out, Delim delim);

template<class Stream, class String>
Stream& getline_imitation(Stream &in, String &out) {
  return getline_imitation(in, out, in.widen('\n'));
}

如果您可以为函数提供命名参数,则默认参数会更有用,但 C++ 并没有使这变得容易。如果您在其他语言中遇到过默认参数,则需要牢记此 C++ 限制。例如,想象一个函数:

void f(int a=1, int b=2);

如果您还对所有后续参数使用给定的默认值,则只能对参数使用给定的默认值,而不是能够调用,例如:

f(b=42)  // hypothetical equivalent to f(a=1, b=42), but not valid C++

关于c++ - 使用默认函数参数的优点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4755104/

相关文章:

c++ - 我的 boost phoenix 惰性函数出了什么问题?

C++模板参数类型推断

c++ - 使用 IOCTL_MOUNTMGR_QUERY_POINTS

c++ - 从 C++ 获取 QML Editbox 的值

c++ - 获得绝对时间的更好方法?

c++ - 在这种情况下,如何将 true 或 false 返回给 for_each?

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - 在编译时通过模板自动判断类型是否为抽象基类

c++ - 使用 TCP 从客户端向服务器发送字节的问题

c++ - 隐形主窗口