如何将值传递给它的参数(默认参数)
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();
您可以让 void
、int
和 char
重载调用主函数并隐藏您填写 "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) {}
但是函数重载更好,因为它适用于所有条件。
我真的很困惑,因为我无法很好地描述我的问题,但我相信你们中的许多人会理解我。
#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();
您可以让 void
、int
和 char
重载调用主函数并隐藏您填写 "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) {}
但是函数重载更好,因为它适用于所有条件。