ten*_*our 14
如果你有void func(int a = 0, int b);,你如何指定在调用此函数时使用默认参数?
因为这就是语言的设计方式.
一个更有趣的问题是:有哪些替代方案?
假设你有 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 !!)
}
Run Code Online (Sandbox Code Playgroud)
关于命名参数:
可以使用函数对象模拟该功能.
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)();
}
Run Code Online (Sandbox Code Playgroud)
如果您不想复制参数,您可以使用引用/指针,尽管它可能会变得复杂.
当你有很多默认值没有真正的优先顺序时,这是一个方便的习惯用法.