Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 默认参数:只能保留最后一个参数吗?_C++_Default Parameters - Fatal编程技术网

C++ 默认参数:只能保留最后一个参数吗?

C++ 默认参数:只能保留最后一个参数吗?,c++,default-parameters,C++,Default Parameters,我知道有可能做如下事情: int foo(int a = 0, int b = 1) { return a + b; } 然后在不使用默认参数的情况下使用它,例如: foo(); // a = 0, b = 1 -> 1 或将最后一个作为默认值,例如: foo(2); // a = 2 and b = 1 default -> 3 但是我的问题是: 是否可以对第一个参数(a)使用默认值,并给出第二个参数(b)的值 我的第一个想法是像这样做(不起作用!): 是否存在此

我知道有可能做如下事情:

int foo(int a = 0, int b = 1) { return a + b; }
然后在不使用默认参数的情况下使用它,例如:

foo();    // a = 0, b = 1 -> 1
或将最后一个作为默认值,例如:

foo(2);    // a = 2 and b = 1 default -> 3
但是我的问题是: 是否可以对第一个参数(a)使用默认值,并给出第二个参数(b)的值

我的第一个想法是像这样做(不起作用!):

是否存在此语法
或者这是不可能的

不,这在当前语法中是不可能的。

我知道这并不是你问题的答案,但你可以尝试使用。它可能对您的用例有用。

或者,通过指定默认参数值,您可以使用多个函数重载,如:

 int foo(int a, int b){return a+b; }
 int foo(int b){return foo(0,b); }     
 int foo(){return foo(0,1); }

这不可能直接实现。但是,如果您为封装默认值并具有单独设置器的输入参数声明一个结构,则可能会出现以下情况:

#include <iostream>

struct Foo{
    int a,b;
    Foo() : a(0),b(1) {};
    Foo setA(int x) { a=x; return *this;}
    Foo setB(int x) { b=x; return *this;}
};

void foo(Foo f = Foo()){ std::cout << f.a << "  " << f.b << std::endl; }

int main() {
    foo();                // uses default values for a and b
    foo(Foo().setA(3));   // uses default value for b
    foo(Foo().setB(5));   // uses default value for a
}
#包括
结构Foo{
INTA,b;
Foo():a(0),b(1){};
Foo setA(intx){a=x;返回*this;}
Foo-setB(intx){b=x;返回*this;}
};

void foo(foo f=foo(){std::cout一旦我们为参数提供了默认值,所有后续参数也必须具有默认值。例如

// Invalid
void add(int a, int b = 3, int c, int d);

// Invalid
void add(int a, int b = 3, int c, int d = 4);

// Valid
void add(int a, int c, int b = 3, int d = 4);

不,不能这样做。密切相关;@SergeyA在复制缓冲区中加载了错误的东西。我实际上想使用上面提到的。这是不可能的;默认参数必须是最右边的“我知道可以做某事。”是的,你的愤怒让你愤怒。哦,他不是在说西斯。我的坏。你对我有什么期望?我是一个黑暗绝地,不是一个协议机器人。我没有真正的用语。只是在学习的时候自己说了这个(我是绝对的C++新手)。但是你的链接看起来很有帮助!难道这不会像<代码> Foo一样的效果吗?(int b=1,int a=0){..}
?@UNKN57是的。但是与
int foo(int a=0,int b=1)
不同的效果。由于不明确,您不能同时声明这两个参数。也许我的示例不是最好的。我想要的是使用第一个参数的默认值,并将参数值传递到右边(我现在知道这是不可能的)。@UNKN57可能是你的例子过于简单了。关于消除参数类型歧义,我的建议可能会有更多的变化。@UNKN57:我不清楚这怎么会不完全符合你的要求。如果你调用
foo(2)
就好像你调用了
foo(0,2)
。这不正是您在示例中试图做到的吗?
// Invalid
void add(int a, int b = 3, int c, int d);

// Invalid
void add(int a, int b = 3, int c, int d = 4);

// Valid
void add(int a, int c, int b = 3, int d = 4);