如何选择传递给函数的默认参数

时间:2010-01-08 02:53:07

标签: c++

我这里有一个程序: 我怀疑将参数传递给函数display()。

void display(int = 20,int = 30,int = 50);

int main()
{
    display(5,12);
    return 0;
}

void display(int i,int j,int k)
{
    cout<<i<<endl;
    cout<<j<<endl;
    cout<<k<<endl;
}

如果通过向其传递2个参数来调用此函数 display , 我们如何确保将这些参数视为第一和第三, 而第二个参数是默认的。

3 个答案:

答案 0 :(得分:3)

你做不到。最后的默认参数是ALWAYS。

您可以做的最好的事情类似于以下模式:

// Choose a number that is NEVER valid as input to represent default:
#define DEFAULT_VAL 0x7fffffff

void display (int i, int j, int k)
{
    if (i == DEFAULT_VAL) i = 20;
    if (j == DEFAULT_VAL) i = 30;
    if (k == DEFAULT_VAL) i = 50;

    cout<<i<<endl;
    cout<<j<<endl;
    cout<<k<<endl;
}

等一下,我才意识到这是C ++。在这种情况下,您可以使用函数重载来模拟您想要的内容:

void display (int i, int j, int k)
{        
    cout<<i<<endl;
    cout<<j<<endl;
    cout<<k<<endl;
}

void display (int i, int k)
{        
    cout<<i<<endl;
    cout<<30<<endl;
    cout<<k<<endl;
}

嗯,两者都有利有弊。取决于你真正想做的事情。

答案 1 :(得分:2)

不幸的是,你不能。只有尾随参数才能使用C ++中的默认参数。

如果这是一个问题,您可以:

  • 重新排序参数
  • 写下该函数的另一个重载。

答案 2 :(得分:2)

正如其他人所说,你不能在非默认参数之间混合默认参数。获得类似行为的一种方法是使用结构传入参数,并仅设置所需的值。拉:

#include <cstdlib>
#include <iostream>
using namespace std;

struct FnParams
{
    int i, j, k;
    FnParams() : i(20), j(30), k(40)  {};
};

void DoTheThing(FnParams params = FnParams())
{
    cout << params.i << endl;
    cout << params.j << endl;
    cout << params.k << endl;
}

int main()
{
    DoTheThing();

    FnParams p;
    p.j = 42;
    DoTheThing(p);

    return 0;
}

没有多少功能可以从这种结构中受益。但是那些确实会随着时间的推移而不断增长,添加新参数,删除旧参数等等。上面的方法还有一个额外的好处,就是更容易更改传递给函数的参数,而不需要触及1000的每次进行一次小改动时,代码中的地方都会调用你的函数。