为什么C ++中的默认参数是尾随的?
答案 0 :(得分:14)
如果您有void func(int a = 0, int b);
,您如何指定在调用此函数时使用默认参数?
答案 1 :(得分:6)
因为这就是语言的设计方式。
一个更有趣的问题是:有哪些替代方案?
假设您有void f(A a = MyA, B b);
f(_, abee)
或f(, abee)
f(b = abee)
但这些都是细节,当然不是必需的,因为与Python不同,C ++支持函数重载:
void f(A a, B b);
void f(B b) { f(MyA, b); }
因此默认参数是不必要的...特别是考虑到与多态代码一起使用时会出现问题,因为默认参数是静态解析的(编译时)。
struct Base
{
virtual void func(int g = 3);
};
struct Derived
{
virtual void func(int g = 4);
};
int main(int argc, char* argv[])
{
Derived d;
d.func(); // Derived::func invoked with g == 4
Base& b = d;
b.func(); // Derived::func invoked with g == 3 (AH !!)
}
关于命名参数:
可以使用函数对象模拟该功能。
class Func
{
public:
Func(B b): mA(MyA), mB(b) {}
A& a(A a) { mA = a; }
B& b(B b) { mB = b; }
void operator()() { func(mA, mB); }
private:
A mA;
B mB;
};
int main(int argc, char* argv[])
{
A a;
B b;
Func(b)();
Func(b).a(a)();
}
如果你不想复制参数,你可以使用引用/指针虽然它可能会变得复杂。
当你有很多默认值没有真正的优先顺序时,这是一个方便的习惯。
答案 2 :(得分:1)
只是为了补充@ tenfour的答案。 C ++ FAQ Lite有一个描述named parameters的主题,我认为该主题在某种程度上解决了您的问题。
答案 3 :(得分:-1)
因为在函数调用中,您必须在任何情况下调用非默认参数。如果你把你的默认参数放在参数列表的开头,你怎么说你设置默认参数或其他参数?