C++ 中的对象构造

Posted

技术标签:

【中文标题】C++ 中的对象构造【英文标题】:Object Construction in C++ 【发布时间】:2012-02-09 15:51:38 【问题描述】:

我正在使用 C++ 编写一个小项目,该项目需要我创建一个自定义类的对象,该类是我在另一个类中编写的。该类名为FIRFilterModule,它有一个简单的空白构造函数。

作为一个java背景,我的冲动是这样创建的:

class SensorInput
public:

  FIRFilterModule firFilter;
  ...More Class Members...
  SensorInput():firFilter(FIRFilterModule())
...;

但是,这与“此上下文中的错误”这一非常有用的错误消息一起编译。我有点迷失为什么这不起作用。增加了我的困惑,我将代码更改为:

class SensorInput
public:

  FIRFilterModule firFilter;
  ...More Class Members...
  SensorInput()
...;

有效。

谁能帮我理解为什么会这样?

【问题讨论】:

如上所述,FIRFilterModule 是我编写的一个类,具有公共构造函数。 firFilter 是我在 SensorInput 中创建的对象。那是我得到的完整错误。我使用的编译器是风河的默认编译器 【参考方案1】:

在这种特殊情况下,为成员字段运行默认构造函数,您无需执行任何操作。构造函数自动运行。所以你可以写

class SensorInput
public:

  FIRFilterModule firFilter;

  SensorInput()  ... 
;

只有在需要调用有参数的构造函数或初始化 POD 类型时才需要成员初始化列表。例如,假设FIRFilterModule 有一个构造函数,它采用int。然后你会使用成员初始化列表

SensorInput() : firFilter(42)  ... 

【讨论】:

“你不需要做任何事情” 这适用于在任何地方构建 FIRFilterModule 吗?比如说我在我的 int main() 中创建了一个。 @jozefg 是的。它适用于声明FIRFilterModule 实例的任何地方。请注意,这与说 FIRFilterModule* 不同 "只有在需要调用有参数的构造函数时才需要成员初始化列表。" 或者初始化POD类型,否则会保持未初始化状态。【参考方案2】:

The code you posted is correct.

也许您忘记包含声明 FIRFilterModule 的标头。

否则,一切都应该正常。

【讨论】:

对不起,但不...我包括了所有内容并三重检查了 FIRFilterModule。我也请其他人查看我的代码,错误肯定在那个代码 sn-p 中。 @jozefg 如果它在那个 sn-p 中,请复制我在您的编译器中发布的代码并尝试一下。如果它不工作,你的编译器是错误的。 @jozefg 或者它只是告诉你初始化是没有意义的,正如 JaredPar 提到的那样。 @AlanStokes 是的,我后来对此发表了评论并称赞了 JaredPar。 是的,我的编译器很奇怪。这似乎是错误的根源。

以上是关于C++ 中的对象构造的主要内容,如果未能解决你的问题,请参考以下文章

C++中的深拷贝和浅拷贝构造函数

C++如何使用派生类构造函数销毁基类中的对象

C++中的构造函数-白话解读

C++类和对象中

C++中复制构造函数被调用的三种情况

C++中的复制构造函数