【问题标题】:How to declare a constructor that has default parameter?如何声明具有默认参数的构造函数?
【发布时间】:2015-02-22 21:59:45
【问题描述】:

如何编写一个可以接受默认参数的构造函数?我是在声明私有数据成员时还是在构造函数内部声明默认参数?

    Color class:
    private:
        int red;
        int blue;
        int green;
    public: 
        Color(int r, int b, int g) {red = r; blue = b; green = g;}

    Table class: 
    private: 
        double weight;
        double height;
        double width;
        double length;
        Color green;
    public: 
        Table(double input_weight, double input_height, double input_width, 
double input_length, Color green = green(0, 0, 60)){
        weight = input_weight; 
        height = input_height; 
        width = input_width; 
        length = input_length;
    }

我希望能够编写一个带有默认参数的构造函数。但我不知道如何写一个(上面的 Table 构造函数是我遇到问题的那个)。我想要一个具有不同重量、高度、宽度、长度的对象表,但所有表都是绿色的。 感谢您的帮助!

【问题讨论】:

  • green(0, 0, 60) 没有意义。也许你的意思是Color(0, 0, 60)? (投票结束是一个简单的印刷错误)
  • 你能解释一下为什么它是颜色吗?我正在尝试将对象绿色初始化为 0、0、60。Color 不只是一种数据类型吗?
  • 因为Color(0, 0, 60) 创建了一个 Color 对象,将 0、0 和 60 传递给它的构造函数。 (它也可以调用一个函数或函数指针,如果Color 是一个,或者如果Color 是一个带有operator() 的对象,它会调用它,但这些都不是真的在这里)。
  • green 不是类型、函数、函数指针或带有operator() 的对象,所以不能调用它。
  • @jasonadams Color(0, 0, 60) 是一个没有名称的 Color 对象。 Color blue(0, 0, 60) 声明 blue 是一个名为 blueColor 对象。 blueColor(0,0,60) 都是 Color 对象;一个有名字,一个没有。 green(0, 0, 60); 以上都不是,是一个错误。当您提供默认值时,您必须提供一个表示Color 对象的表达式。 Color(0, 0, 60) 会这样做,如果您之前在某处声明了 blueblue 也会这样做(您不能提供声明作为默认值规范的一部分)

标签: c++ class constructor


【解决方案1】:

使用成员初始化列表:

public: 
    Table(double input_weight, double input_height, double input_width, double input_length)
    : weight(input_weight) 
    , height(input_height) 
    , width(input_width) 
    , length(input_length)
    , green(Color(0, 0, 60))
{

}

正如其他人指出的那样,您的原始代码中有错字,您应该使用 Color(0, 0, 60) 来调用构造函数。

如果你真的想保留你的 Table 构造函数签名,你可以这样做:

public: 
    Table(double input_weight, double input_height, double input_width, double input_length, Color default_color=Color(0, 0, 60))
    : weight(input_weight) 
    , height(input_height) 
    , width(input_width) 
    , length(input_length)
    , green(default_color)
{

}

为构造函数定义默认参数基本上遵循与任何函数的默认参数相同的规则。但是如果你真的需要 Color 参数,你应该只在构造函数中使用它。

【讨论】:

  • 感谢您发布答案,我想我仍然不理解语法。当我们声明一个像 Color blue 这样的对象时,我们会做类似 Color blue(0,60,0);为什么这里不是这样?
  • 此签名不允许 green 被默认为 OP 要求的(即仅使用 4 个参数调用构造函数)
  • 当你做 blue(0, 60, 0) 时,你定义了一个对象 blue,但调用的构造函数是 Color(int, int, int)。你可以像 green(0, 0, 60) 那样做,它会调用同一个构造函数 Color(int, int, int),你也可以使用 Color(0, 0, 60),它会调用复制构造函数。
  • 使用 ctor-initialize 列表的好建议
  • @jasonadams:不,这只是意味着它是按照您提供的默认值构造的。例如,您仍然可以读取该值,或提供一个函数来修改它。是否需要构造函数中的第5个参数,我不知道,这取决于您打算如何使用Table。
猜你喜欢
  • 2014-07-05
  • 2017-09-27
  • 2012-07-19
  • 2015-01-28
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多