代码之家  ›  专栏  ›  技术社区  ›  Ashish

为什么默认参数跟在后面?

c++
  •  9
  • Ashish  · 技术社区  · 14 年前

    为什么C++中的默认参数是滞后的?

    4 回复  |  直到 6 年前
        1
  •  15
  •   tenfour    14 年前

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

        2
  •  6
  •   Deduplicator    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)();
    }
    

    如果您不想复制参数,您可以使用引用/指针,尽管它可能会变得复杂。

        3
  •  1
  •   user184968 user184968    14 年前

    只是为了补充@tenfour的答案。C++常见问题解决方案有一个主题描述 named parameters

        4
  •  -1
  •   Federico klez Culloca    14 年前

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