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

前端之家收集整理的这篇文章主要介绍了c – 非指针类成员:它有多好?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > calling constructor of a class member in constructor5个
我有一个非指针类成员,我需要在构造函数中初始化:
class Alerter {

protected:
  Timer timer;

public:
  Alerter(int interval);
};

然后

Alerter::Alerter(int interval) {
    timer = createTimer(interval);
}

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

我有些疑惑和担心,计时器可能首先使用其无参数构造函数创建,稍后该实例将被createTimer函数返回的内容覆盖.

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

>由无参数构造函数创建的“空计时器”实际上并未创建,因为编译器足够聪明,可以发现我们从未
在覆盖值之前引用它.
>创建了空计时器,但这是正常的,因为编写良好的代码支持一次性实例的廉价无参数构造函数.
>最好使用指针.

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

解决方法

计时器首先默认构造然后分配.当然,你可以假设Timer的默认构造价格或编译器优化有多便宜,但在这里你不需要这个,因为可以通过使用初始化列表来阻止默认构造:
Alerter::Alerter(int interval) : timer(createTimer(interval)) { }

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

猜你在找的C&C++相关文章