【问题标题】:Default Parameters in Functions - C++ [closed]函数中的默认参数 - C++ [关闭]
【发布时间】: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 我想知道您如何判断努力,但我仍然认为这可能是拒绝投票的一个很好的理由,而不是结束一个问题。

标签: c++ default-value function-parameter


【解决方案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 混乱。如果第三个参数有合理的默认值,但第四个没有,考虑交换它们的位置。
    猜你喜欢
    • 2010-09-16
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多