函数中的默认参数 - 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++ [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C++核心编程中的函数-占位参数和默认参数

虚函数 C++ 中的默认参数

在构造函数中设置默认参数?语法[关闭]

C++ —— 函数默认参数

在 C++ 中的可变长度函数中放置默认值参数的位置?

为啥 C++ 构造函数在继承中需要默认参数?