This question already has answers here:
calling constructor of a class member in constructor

(5个答案)


2年前关闭。




我有一个非指针类成员,需要在构造函数中对其进行初始化:
class Alerter {

protected:
  Timer timer;

public:
  Alerter(int interval);
};

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

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

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

这种方法有多好?可能的答案可能是:
  • 实际上没有创建由其无参数构造函数创建的“空计时器”,因为编译器足够聪明,可以发现我们从来没有
    在覆盖值之前引用了它。
  • 创建了空计时器,但这没关系,因为编写良好的代码应支持廉价的无参数构造函数以用于一次性实例。
  • 最好使用指针。

  • 以下哪个假设(或其他假设)最正确?

    最佳答案

    timer首先被默认构造,然后被分配。当然,您可以假设Timer对默认构造的便宜程度或对编译器优化的假设,但是在这里您不需要这样做,因为可以通过使用初始化列表防止默认构造:

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

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

    关于c++ - 非指针类成员: how good is it? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50620813/

    10-16 19:10