在C ++中,如何传递一些参数而将其他参数保留为默认值?

时间:2014-08-15 06:38:28

标签: c++ default-arguments

我确信这已经在这里得到了回答,但搜索仍然会返回PHP,C#和Java。我特别询问C ++。

如果我有一个带有五个参数且所有参数都有默认值的函数,但是我想明确地给它调用第三个参数的值,那么我将为第一个和第二个参数传递什么? (我知道func(,,"Third")不起作用,func(thirdArg:"Third")

也不起作用

4 个答案:

答案 0 :(得分:4)

在C ++中,您必须指定最多默认值的所有参数,因此它必须是func("First","Second","Third")

C ++还要求您在'结束时使用默认值。参数列表,所以你不能做func(defaulted, not-defaulted)

之类的事情

这两条规则都与C ++重载决策规则有关。

答案 1 :(得分:2)

您可以在Java构造函数中为默认参数解决方案。

但我不认为这是C ++中的好习惯,特别是对于函数,因为上面说的是 - 默认参数的位置在非默认参数之后通常被接受。

使用函数重载实现的解决方案:

void Foo(int default, int nodefault){
    ...
}

void Foo(int nodefault){
    Foo(10, nodefault); //10 - is default option
}

int main(){
    Foo(3); //calls Foo(10, 3);
}

答案 2 :(得分:0)

这不重要。可能你可以试试boost参数。你可以传递参数,然后,

func(third_="third")

请检查=>

http://www.boost.org/doc/libs/1_56_0/libs/parameter/doc/html/index.html#named-function-parameters

答案 3 :(得分:0)

该语言没有直接支持。然而,C ++程序员经常用来代替缺少 bash-like位置参数的成语是Named Parameter idiom.

假设您的函数是类的成员方法,您可以轻松应用此习语:

基本上,您有方法(可能是访问器)来修改对象的状态。每个方法都返回一个非this的const引用,允许方法链接。

示例:

class Person{

public:

    Person& setAge(int agep) { age = agep ; return *this; }

    Person& setWeight(double weightp) { weight = weightp ; return *this; }

    Person& setName(const std::string& namep) { name = namep ; return *this; }

private:
    int age = 0;
    double weight = 0.0;
    std::string name;
};

int main(){
    Person p;

    p.setAge(42).setName("Kurt"); // set age and name, but not weight
}