我这里有一个程序: 我怀疑将参数传递给函数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 , 我们如何确保将这些参数视为第一和第三, 而第二个参数是默认的。
答案 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的每次进行一次小改动时,代码中的地方都会调用你的函数。