为什么你必须定义一个空的构造函数c++

Why do you have to define an empty constructor c++

本文关键字:一个 c++ 构造函数 定义 为什么      更新时间:2023-10-16

我有以下类:

class ArithmeticExpression
{
public:
    ArithmeticExpression(std::string expr);
}

class Command
{
public:
    Command(){};
    //this is a virtual class
}
class CommandAssign : public Command
{
private:
    ArithmeticExpression expr;
public:
    CommandAssign();
    CommandAssign(ArithmeticExpression);
}

现在,当我尝试为CommandAssign类编写构造函数时,如下所示:

CommandAssign::CommandAssign(ArithmeticExpression expr)
    :Command()
{
    this -> expr = ArithmeticExpression(expr.getExpr());
}

我得到错误:

对"ArithmeticExpression::ArithmeticeExpression()"的调用没有匹配的函数:命令()

显然,我可以通过在ArithmeticExpression类中添加一个不做任何事情的空构造函数来解决这个问题。这个空构造函数的特殊之处是什么?我没有明确地打电话给任何地方。你总是需要在C++中定义一个空的构造函数吗?

我想强调的是,尽管从标题来看,我的问题似乎与一些用户建议的重复问题相似,但我想要的答案并不存在。我只是想了解调用构造函数时会发生什么,以及如何避免定义无用的默认构造函数,我知道在我用参数定义构造函数的情况下,编译器不会自动定义默认构造函数。

只有在没有定义其他构造函数的情况下,编译器才会自动生成默认构造函数。

编辑:

对象初始化需要默认构造函数。

在构造函数主体开始之前,所有成员都被初始化。如果初始化程序列表中没有条目,那么它将被默认初始化;但只有当类类型具有默认构造函数时,这才有可能(对于类类型)。

expr没有在initializer列表中初始化,也没有默认的构造函数(因为声明任何构造函数都会阻止隐式生成构造函数),因此无法初始化-因此出现错误。

您应该在列表中初始化它,而不是在构造函数主体中重新分配它:

CommandAssign::CommandAssign(ArithmeticExpression expr) :
    expr(expr.getExpr())
{}

请注意,不需要显式默认构造Command子对象。这也要求ArithmeticExpression的构造函数是公共的:它在示例代码中是私有的。