我真的很困惑,因为我无法很好地描述我的问题,但我相信很多人都会理解我。
#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.可以有人告诉我如何这样做得好吗?
答案 0 :(得分:4)
你不能保持原样。调用函数时,参数按顺序从左到右匹配。这意味着display('$');
会将'$'
提供给n
而不是c
。
尽管如此,至少在这种情况下,您可以做的是使功能过载以执行您想要的操作。与
void display(int n, char c);
void display(int n);
void display(char c);
void display();
您可以让void
,int
和char
重载调用主函数,并隐藏您填写&#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) {}
但是函数重载更好,因为它可以在所有条件下工作。