2010-01-08 48 views
0

我在这里有一个程序: 我有一个疑问在函数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个参数来叫, 如何才能确保这些参数分别作为第一和第三, 而第二个参数是默认处理。

回答

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; 
} 

那么,两者都有优点和缺点。取决于你真正想做的事情。

+0

请不要使用重载 - 是的它的工作原理,但它非常混乱。 – 2010-01-08 16:24:49

2

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

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

  • 重新排序参数
  • 编写函数的另一重载。
2

正如其他人所说的,您不能在非默认参数之间混合默认参数。获得类似行为的一种方法是使用结构来传入参数,并只设置所需的值。 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; 
} 

没有太多的功能受益于这种结构。但是随着时间的推移,这些增长趋势会不断增长,新的参数被添加,旧的被删除等等。上面的方法带来了额外的好处,使得更容易改变传递给函数的参数,而不需要触及1000的在每次进行小改动时都会调用函数的代码。