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

how to pass a value to its parameter (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。谁能告诉我如何正确执行此操作?

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

不过,至少在这种情况下,您可以做的是重载函数以执行您想要的操作。有

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

您可以让 voidintchar 重载调用主函数并隐藏您填写 "blanks" 的事实。看起来像

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

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

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

不利的一面是您重复了默认值。这使得它变得脆弱,因为默认值的更改需要您在多个地方进行更改。

默认参数只能从右边开始省略。因此你的函数

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

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

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

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

我还找到了另一种方法,就是函数重定义

而不是

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

我可以将其替换为

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

但是函数重载更好,因为它适用于所有条件。