使用默认功能参数的优点

ok_*_*oei 4 c++

int add (int x, int y=1)
int main ()
{
  int result1 = add(5);
  int result2 = add(5, 3);
  result 0;
}
Run Code Online (Sandbox Code Playgroud)

VS

int add (int x, int y)
int main ()
{
  int result1 = add(5, 1);
  int result2 = add(5, 3);
  result 0;
}
Run Code Online (Sandbox Code Playgroud)

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

Fre*_*urk 6

你的添加函数不是如何使用默认参数的一个很好的例子,你是正确的,一个更难阅读.

但是,并非所有功能都适用.考虑一下std :: vector :: resize,它看起来像:

template<class T>
struct vector_imitation {
  void resize(int new_size, T new_values=T());
};
Run Code Online (Sandbox Code Playgroud)

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

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]
Run Code Online (Sandbox Code Playgroud)

即使从不需要new_value参数,也会构建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'));
}
Run Code Online (Sandbox Code Playgroud)

如果您可以为函数提供命名参数,则默认参数会更有用,但C++并不能简化这一过程.如果您在其他语言中遇到默认参数,则需要记住此C++限制.例如,想象一个函数:

void f(int a=1, int b=2);
Run Code Online (Sandbox Code Playgroud)

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

f(b=42)  // hypothetical equivalent to f(a=1, b=42), but not valid C++
Run Code Online (Sandbox Code Playgroud)


Ed *_* S. 4

如果有一个默认值可以在很大程度上提供正确的行为,那么它可以节省您编写不断传递相同值的代码的时间。它只是让事情比到处写 foo(SOME_DEFAULT) 更简单。