C ++在调用中跳过第一个默认参数

时间:2014-07-14 04:55:37

标签: c++

有谁知道为什么第一个默认参数没有设置为默认值。当我运行char' P'正在设置为int max_width,而在cout中,正在为max_width打印一些大号。 printe函数中的字符将恢复为默认值。我很困惑,我认为函数可以告诉我使用哪种类型,并将其用于相关参数。有谁知道我做错了什么?

void printe(int max_width = 1, char character = '*');

int main()
{
    char character = 'P';
    printe(character);
    return 0;
}

void printe(int max_width, char character)
{
    cout << max_width << " " << character << endl;
}

4 个答案:

答案 0 :(得分:2)

最快捷,最简单的解决方法是切换函数中参数的顺序:

void printe(char character = '*', int max_width = 1);

int main()
   {
   char character = 'P';
   printe(character);
   return 0;
   }
void printe(char character, int max_width)
{  cout << max_width << " " << character << endl; }

您不能像尝试那样跳过参数。如果你想传递一个字符,并将max_width设置为默认值,这就是这样做的方法。

答案 1 :(得分:2)

你可以为printe提供一个重载,它只接受一个作为角色的参数。

void printe(char character);

请注意,我遗漏了character的默认值,因为在没有参数的情况下调用printe()会导致歧义。

更新:我觉得有必要提供printe()重载的实现。这很简单。您只需使用假设的默认值委托/调用原始printe()填充其余参数:

void printe(char character) {
    printe(1, character);
}

我认为@MGaz的答案更明智。我很少看到具有除了要打印的参数之外的参数的打印功能作为第一参数。比较

printe('x', 42);   // What @MGaz is proposing

printe(42, 'x');   // Yours

当然,大多数程序员都喜欢拥有(和召唤)前者。

好吧,我真的不知道printe做了什么,所以我把它留给你提供你认为对你的东西最好的东西。

答案 2 :(得分:2)

C ++不会通过检查参数的类型来跳过参数。但是,它会尝试转换提供的参数以匹配方法签名的参数。

这里发生的是:当您将char变量传递给printe函数时,它将隐式转换为int。所以你的代码有效,

printe((int)character);

max_width参数将取值80,即'P'的ASCII值。 [编辑:实际charint广告(数字转换)为a bit complex than that,这就是OP为max_width获取大数字的原因。]

设计默认参数,以便方法可以具有可选参数。您可以考虑重新排序参数。

答案 3 :(得分:0)

C ++不支持像

这样的函数调用
printe(, character);

您必须更改参数的顺序。没有第一个参数,你不能传递第二个参数。