参见英文答案 >
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类是可复制分配但不是可复制构造的,这可能很奇怪.