为什么默认参数跟在后面? 为什么C++中的默认参数是?< /p>

为什么默认参数跟在后面? 为什么C++中的默认参数是?< /p>,c++,C++,如果您有无效FUNC(int A=0,int B);,您将如何指定在调用此函数时使用默认参数?因为在函数调用中,您必须在任何情况下调用非默认参数。如果您将默认参数放在参数列表的开头,您应该如何说您正在设置默认参数或其他参数?只是为了补充@tenfour的答案。C++ FAQ Lite有一个主题描述,我认为这个主题在一定程度上解决了你的问题。p> 因为语言就是这样设计的 一个更有趣的问题是:替代方案是什么 假设你有void f(A=MyA,B) 占位符/空白参数:f(u,abee)或f(,abe

如果您有<代码>无效FUNC(int A=0,int B);<代码>,您将如何指定在调用此函数时使用默认参数?

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

只是为了补充@tenfour的答案。C++ FAQ Lite有一个主题描述,我认为这个主题在一定程度上解决了你的问题。p> 因为语言就是这样设计的

一个更有趣的问题是:替代方案是什么

假设你有
void f(A=MyA,B)

  • 占位符/空白参数:
    f(u,abee)
    f(,abee)
  • 命名参数(如Python中):
    f(b=abee)

但是这些都是细微的,当然不是必要的,因为不像Python C++支持函数重载:

  • void f(A,B)
  • void f(B){f(MyA,B);}
因此,默认参数是不必要的。。。特别是考虑到与多态代码一起使用时会出现问题,因为默认参数是静态解析的(编译时)

关于命名参数:

可以使用函数对象模拟该功能

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)();
}
如果您不想复制参数,您可以使用引用/指针,尽管它可能会变得复杂


当你有很多缺省的默认的优先级时,它是一个很有用的习惯用法。< /P>我知道你不能用C++,但是其他语言用“代码> FUNC(或Dominic Rodger),或者命名参数来处理这个问题。@:对我来说,这看起来真的很难看。“Dominic Rodger,嗯,C++没有。如果你想你可以起诉StruouStrup:P<代码>看起来丑陋从来都不是C++的设计准则。问题是什么?如果你传递一个参数,它显然会被绑定到
b
(因为它还会去哪里?),如果你传递两个参数,第一个参数会被绑定到
a
,第二个参数会被绑定到
b
,因为,同样,没有任何其他的意义。这里没有歧义。一个列表是对称的,毕竟,它的外观和工作原理是相同的。那么,如果你认为把默认参数放在参数列表的末尾是可以的,而且由于列表是对称的,那么从逻辑上来说,你必须接受这样一个事实,即把它们放在列表的开头也同样有效。是什么使列表的开头与列表的结尾在本质上有所不同?列表是对称的!是的,但是想象一下:void func(inta,intb=0,intc,intd=0);当你调用func(1,2,3)时你在做什么;确切地说,
b
在列表的哪一端?关于“列表结束”的问题只是一个问题example@JWMittag“列表是对称的”——你的意思是,就像一个单链表,导航是单向的吗?@Oli:为什么?给定第一个
func
prototype,很明显,如果只有一个参数,那么默认值应该用于第一个参数,无论其类型如何。但是,当您有两个默认值时,事情会变得棘手;)一般来说,命名参数是唯一可以解决这个问题的东西,而最棒的是它们是一个编译时解决方案。是的,你是对的。我以为你在使用重载来消除
func(A,B)
func(B)
func(A)
之间的歧义。你选择的答案根本无法回答你的问题。
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)();
}