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

问题描述:

我知道这是一个相当简单的问题,也取决于代码的其余部分,但我对经验法则更感兴趣。我应该在构造函数中调用成员函数

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

最好的是:

ClassA obj1; 
obj1.memFun(); 

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

取决于。如果'memfun()'被声明为'虚拟',你不应该这样做。 – 2014-10-20 11:07:12

+0

如果您详细说明memFun的功能,我们可以提供更具体的建议。例如,其逻辑可能适用于初始化列表。 – 2014-10-20 11:18:06

这是没有伤害到你的构造函数中调用一个成员函数。但是,确保成员函数是非虚拟的,因为动态绑定机制在构造函数完成后启动。如果memFun是虚拟的,并在其子类中重写,然后调用memFun将结合ClassA::memFun

+0

这就是我想听到:) – TheGuyWithStreetCred 2014-10-20 11:18:47

+0

@ user2202368接受答案? – 2014-10-20 11:20:18

+0

我打算这样做 – TheGuyWithStreetCred 2014-10-20 11:22:31

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

不要在您的构造函数中调用virtual方法,但它可能会导致问题。

+0

谢谢,混淆了:) – TheGuyWithStreetCred 2014-10-20 11:19:10

+0

@nvoigt除了调用虚拟方法之外,还有其他问题吗? – user2079303 2014-10-20 11:21:40

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

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

+0

谢谢,我会在处理继承时避免这种情况 – TheGuyWithStreetCred 2014-10-20 11:19:56

如果memFun是虚拟的,你确实需要调用它的对象被完全建立,可以考虑使用一个工厂方法。例如:

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

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

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