我应该在构造函数中调用成员函数

时间:2014-10-20 11:05:09

标签: c++ function constructor member

我知道这是一个相当简单的问题,也取决于代码的其余部分,但我对经验法则更感兴趣。

那么在什么情况下调用构造函数中的函数是合适的?

什么是可取的:

ClassA obj1;
obj1.memFun();

ClassA obj1;
//where constructor of ClassA is
ClassA::ClassA(){ memFun(); }

5 个答案:

答案 0 :(得分:7)

在构造函数中调用成员函数没有坏处。但是,请确保成员函数是非虚拟的,因为构造函数完成后会启动动态绑定机制。如果memFun是虚拟的并且在其子类中被覆盖,则调用memFun将绑定到ClassA::memFun

答案 1 :(得分:4)

构造函数任务是创建一个处于有效,可用状态的对象。因此,如果对象的实例需要函数调用才有效,请在构造函数中调用它。

不要在构造函数中调用virtual方法,否则会导致问题。

答案 2 :(得分:1)

在构造函数中调用任何成员函数通常是安全的,因为在执行第一行用户代码之前已完全设置了该对象。但是,成员函数在构造或销毁期间为抽象基类调用虚拟成员函数可能不安全。

http://msdn.microsoft.com/en-us/library/s8e39b8h.aspx

答案 3 :(得分:1)

如果memFun是虚拟的,并且您确实需要调用它以使对象完全构建,请考虑使用工厂方法。类似的东西:

static ClassA* makeX(){
    ClassA* pObj = new ClassX(); // ClassX is a subclass of ClassA.
    pObj->memFun();
    return pObj ;
}

然后使ClassA和ClassX构造函数受到保护。

答案 4 :(得分:0)

从概念上讲,在构造函数中调用 public 成员函数可能不是最好的,因为它意味着构造函数不仅仅是初始化和创建对象。但是,拥有私有成员函数应该没问题,因为它们不是类接口的一部分,可以被视为构造函数的辅助函数。