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

C++ 如何选择传递给函数的默认参数,c++,C++,我这里有一个程序: 我对向函数display()传递参数有疑问 void显示(int=20,int=30,int=50); int main() { 显示器(5,12); 返回0; } 无效显示(整数i、整数j、整数k) { cout您不能。默认参数总是在末尾 您所能做的最好的事情如下所示: // Choose a number that is NEVER valid as input to represent default: #define DEFAULT_VAL 0x7fffffff v

我这里有一个程序: 我对向函数display()传递参数有疑问

void显示(int=20,int=30,int=50);
int main()
{
显示器(5,12);
返回0;
}
无效显示(整数i、整数j、整数k)
{

cout您不能。默认参数总是在末尾

您所能做的最好的事情如下所示:

// 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;
}
//选择一个作为输入永远无效的数字来表示默认值:
#定义默认值0x7fffffff
无效显示(整数i、整数j、整数k)
{
如果(i==默认值)i=20;
如果(j==默认值)i=30;
如果(k==默认值)i=50;

遗憾的是,你不能,只有尾随参数可以在C++中使用默认参数。 如果这是一个问题,您可以:

  • 重新排列参数
  • 编写函数的另一个重载

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

#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;
}
#包括
#包括
使用名称空间std;
结构FnParams
{
int i,j,k;
FnParams():i(20),j(30),k(40){};
};
void DoTheThing(FnParams params=FnParams())
{

不能请不要使用重载-是的,它可以工作,但它非常混乱。
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;
}
#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;
}