为什么默认参数落后于?

时间:2010-08-17 11:32:49

标签: c++

为什么C ++中的默认参数是尾随的?

4 个答案:

答案 0 :(得分:14)

如果您有void func(int a = 0, int b);,您如何指定在调用此函数时使用默认参数?

答案 1 :(得分:6)

因为这就是语言的设计方式。

一个更有趣的问题是:有哪些替代方案?

假设您有void f(A a = MyA, B b);

  • 占位符/空白参数:f(_, abee)f(, abee)
  • 命名参数(如Python中):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)

因为在函数调用中,您必须在任何情况下调用非默认参数。如果你把你的默认参数放在参数列表的开头,你怎么说你设置默认参数或其他参数?