在类

时间:2018-05-06 14:04:40

标签: c++

我创建了一个用于计算矩形区域的简单类。

class Rectangle
{
public:
    Rectangle();
    Rectangle(const double, const double);

    class Invalid { };

    double print_square();
private:
    const double length, width;
    inline bool check();
};

对于宽度和长度,我使用了常量,因为它们不会在我的类中修改。在构造函数中,我想初始化它们。

为什么我在构造函数体中出错?

  

无法使用const-qualified分配给非静态数据成员'length'   输入'const double'

     

'Rectangle'的构造函数必须显式初始化const   会员'长度'

错误:

Rectangle::Rectangle(const double _length, const double _width)
{
    length = _length;
    width = _width;
    if (!check())
        throw Invalid();
}

确定:

Rectangle::Rectangle(const double _length, const double _width) : length(_length), width(_width)
{
    if (!check())
        throw Invalid();
}

我非常喜欢第二个选项,但为了更方便的可读性,我不想在一行中写下所有初始化的变量。

有没有办法在构造函数体中初始化常量?

2 个答案:

答案 0 :(得分:1)

不,你不能。

这是因为在您的第一个示例中,由于初始化列表中没有任何内容,lengthwidth将默认构建,而,在构造函数,分配了所需的值_length_width,但由于它们是const并且已经初始化而失败。

在第二个示例中,两个变量都是在没有默认构造的情况下初始化的。这种方法可以在一个步骤中直接使用所需的值构建const变量。

请注意,方法2仅使用一步而不是两步,因此它比方法1中的操作更有效。因此,通常这是一种很好的做法(即使对于非const变量也是如此)尽可能采用方法2。

答案 1 :(得分:0)

  

有没有办法在构造函数体中初始化常量?

没有

您必须使用初始化列表(您的第二个解决方案):

Rectangle::Rectangle(const double _length, const double _width) : 
  length(_length), 
  width(_width)
{
    if (!check())
        throw Invalid();
}

正如评论中所述,您可以将每个变量初始化放在单独的行