函数中的默认参数 - C++ [关闭]
Posted
技术标签:
【中文标题】函数中的默认参数 - C++ [关闭]【英文标题】:Default Parameters in Functions - C++ [closed] 【发布时间】:2012-03-22 06:19:07 【问题描述】:如果我没记错的话,这种声明可以用于在构造函数中分配默认值:
/* .h */
class FooClass()
private:
int* data;
int depth, rows, columns;
char* desc;
public:
...
/* .cpp */
FooClass::FooClass()
: data(NULL), depth(0), rows(0), columns(0), desc(NULL)
//whatever constructor does...
但不允许为函数中的参数分配默认值:
不行
/* .h */
class FooClass()
public:
void foofunc(int var1, int var2, int var3, int var4);
/* .cpp */
FooClass::foofunc(int var1, int var2)
: var3(0), var4(5)
//whatever function does...
必须改为这样:
好的
/* .h */
class FooClass()
public:
void foofunc(int var1, int var2, int var3 = 0, int var4 = 5);
/* .cpp */
FooClass::foofunc(int var1, int var2, int var3, int var4)
//whatever function does...
为什么?
【问题讨论】:
你为什么投票赞成关闭? 您的第二个和第三个示例均无效,因为声明和定义不匹配。如果您设置了相同数量的参数,那么任何一种方式都有效。 @peachykeen 首先第三个例子没问题,我犯了复制/粘贴错误,但回答的人理解我的意思。第二件事,如果在我的第二个示例中(标记为不正确,因为我知道它不正确)我输入了相同数量的参数,但由于我与构造函数中的初始化列表。在问题中犯错误不应该是投票结束它的好理由。 出于这个原因,我从未提及您的第一个示例。你的第二个,使用正确的参数,会工作。投票不是我的,尽管我已经投票结束,因为这个问题没有显示出任何研究工作;一半的代码甚至不是模糊有效的,但这不是因为手头的问题,而是因为函数的编写方式不正确,参数如何工作。 @peachykeen 我想知道您如何判断努力,但我仍然认为这可能是拒绝投票的一个很好的理由,而不是结束一个问题。 【参考方案1】:第一个示例根本不是“默认值”之一——它是对象的成员和基类的initialisation list,这仅在构造函数中才有意义。但是,构造函数可以具有默认参数值,使用与任何其他函数相同的语法。
所以这很好,例如:
explicit FooClass(int* data = NULL, int depth = 0, int rows = 0, int columns = 0, char* desc = NULL)
: data(data), depth(depth), rows(rows), columns(columns), desc(desc)
如果您需要的不仅仅是任何类型的函数的简单默认值,请考虑重载该函数,例如:
void my_function(int a, int b)
// do stuff with a and b
void my_function()
// version with no arguments, "default" behaviour
【讨论】:
【参考方案2】:构造函数正在初始化类成员或父类;该函数正在为其参数设置默认值。
【讨论】:
所以没有其他方法可以在函数中设置默认值?假设我调用函数想要变量 3 的默认值但指定变量 4 的值编译器将如何理解? 你不能。如果您在参数列表中省略了所有后续变量,则只能省略一个变量(并使用其默认值)。 如果第三个和第四个参数的类型足够不同,您可以考虑重载函数,使用缺少第三个参数的函数版本。如果您不小心,这可能会导致 API 混乱。如果第三个参数有合理的默认值,但第四个没有,考虑交换它们的位置。以上是关于函数中的默认参数 - C++ [关闭]的主要内容,如果未能解决你的问题,请参考以下文章