我创建了一个用于计算矩形区域的简单类。
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();
}
我非常喜欢第二个选项,但为了更方便的可读性,我不想在一行中写下所有初始化的变量。
有没有办法在构造函数体中初始化常量?
答案 0 :(得分:1)
不,你不能。
这是因为在您的第一个示例中,由于初始化列表中没有任何内容,length
和width
将默认构建,而则,在构造函数,分配了所需的值_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();
}
正如评论中所述,您可以将每个变量初始化放在单独的行
上