您的添加函数并不是一个很好的示例,说明如何使用默认参数,并且您正确的使用默认参数更难以阅读。
但是,这不适用于所有功能。考虑std :: vector :: resize,它看起来像这样:
template<class T>
struct vector_imitation {
void resize(int new_size, T new_values=T());
};
这里,不提供值调整大小使用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]
的NEW_VALUE参数的构造即使是从来不需要它:调整为较小的尺寸时, 。因此,对于某些功能,过载比默认参数好。 (我会在此类别中包含vector :: resize。)例如,std :: getline以这种方式工作,但没有其他选择,因为第三个参数的“default”值是从第一个参数计算得出的。例如:
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++
在这种情况下,在执行速度或存储器使用方面的任何优势? – 2011-01-21 03:45:52
对!例如,检查Win32 API。在99%的情况下,你不需要其参数的一半。 – ruslik 2011-01-21 03:58:46
天啊,这么多的空的,所以很多空的... ok_woei:老实说,我从来没有看着潜在的性能差异,但我非常,非常怀疑,如果有这将是微小的(但仍高度怀疑)。 – 2011-01-21 04:01:54