如何将值传递给其参数(默认参数)

时间:2017-07-27 19:39:40

标签: c++ parameter-passing default-parameters

我真的很困惑,因为我无法很好地描述我的问题,但我相信很多人都会理解我。

#include <iostream>

using namespace std;

void display(int n = 1, char c = '*');

int main()
{
    display();
    display(5);
    display('$');
    return 0;
}

void display(int n, char c)
{
    for (int i = 1; i <= n; i++)
        cout << c;
    cout << endl;
}

display('$'),我想将此char传递给其参数c并使用n及其默认值,即1.可以有人告诉我如何这样做得好吗?

3 个答案:

答案 0 :(得分:4)

你不能保持原样。调用函数时,参数按顺序从左到右匹配。这意味着display('$');会将'$'提供给n而不是c

尽管如此,至少在这种情况下,您可以做的是使功能过载以执行您想要的操作。与

void display(int n, char c);
void display(int n);
void display(char c);
void display();

您可以让voidintchar重载调用主函数,并隐藏您填写&#34;空白&#34;的事实。看起来像是

void display(int n)
{
    display(n, '*');
}

void display(char c)
{
    display(1, c);
}

void display()
{
    display(1, '*');
}

这里的缺点是你重复默认值。这使得这一点变得脆弱,因为更改默认值需要您在多个位置更改它。

答案 1 :(得分:2)

默认参数只能从右侧开始省略。这样你的功能

void display(int n = 1, char c = '*');

只能被称为

display();        // same as   display(1,'*');
display(5);       // same as   display(5,'*');
display(5,'a');

有几种方法可以解决这个问题。在这种情况下最简单的(正如tadman的评论中指出的那样)将提供一个只调用原始函数的重载

void display(char c) { display(1,c); }    

你必须注意每个重载都有不同的签名,例如你不能拥有

void display(char c = '*') { display(1,c); }    

因为那时调用display()会不明确。 如果有更多参数,则声明结构

是有意义的
struct Params {
    int n;
    char c;
    Params() : n(1),c('*') {}
};

使用更多参数可以更好地扩展,因为默认值可以按任何顺序使用或不使用:

Params p;
p.c = 'a';
display(p);

答案 2 :(得分:0)

我还发现了另一种方式,即功能重新定义。

而不是

void display(int n = 1, char c = '*') {}

我可以用

替换它
void display(char c = '*', int n = 1) {}

但是函数重载更好,因为它可以在所有条件下工作。