为什么你必须定义一个空的构造函数c++
Why do you have to define an empty constructor c++
我有以下类:
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
的构造函数是公共的:它在示例代码中是私有的。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '