非指针类成员:它有多好?

h22*_*h22 6 c++ c++14

我有一个非指针类成员,我需要在构造函数中初始化:

class Alerter {

protected:
  Timer timer;

public:
  Alerter(int interval);
};
Run Code Online (Sandbox Code Playgroud)

然后

Alerter::Alerter(int interval) {
    timer = createTimer(interval);
}
Run Code Online (Sandbox Code Playgroud)

(简化代码只是为了演示问题).

我有一些疑问和担忧,timer可能是首先使用其无参数构造函数创建的,之后该实例将被createTimer函数返回的内容覆盖.

方法有多好?可能的答案可能是:

  • 由无参数构造函数创建的"空计时器"实际上并未创建,因为编译器足够聪明,可以在覆盖值之前找不到它.
  • 创建了空计时器,但这没关系,因为编写良好的代码应支持一次性实例的廉价无参数构造函数.
  • 最好使用指针.

哪些假设(或其他可能的东西)最正确?

Hol*_*olt 11

timer首先是默认构造然后分配.当然,您可以假设Timer默认构造或编译器优化有多便宜,但是在这里您不需要这个,因为可以通过使用初始化列表来阻止默认构造:

Alerter::Alerter(int interval) : timer(createTimer(interval)) { }
Run Code Online (Sandbox Code Playgroud)

除非您的Timer类是可复制的,但不是可复制构造的,否则这将起作用,这很奇怪.

  • 通过声明默认的ctor`decug`也可以防止默认构造.这将强制使用初始化列表 (3认同)