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)
在执行速度,内存使用等方面,使用默认函数参数有什么好处?对于像我这样的初学者,在我意识到使用默认函数参数之前,我有时会感到困惑; 是不是没有默认功能参数的编码使代码更容易阅读?
你的添加函数不是如何使用默认参数的一个很好的例子,你是正确的,一个更难阅读.
但是,并非所有功能都适用.考虑一下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)