在构造函数范围而不是成员初始化列表中初始化

时间:2014-12-23 09:10:01

标签: c++ constructor initialization

我最近加入了一个项目,项目中的一个主要接口类在下面进行了初始化。

class CCom_Itf
{
   CCom_Itf(IGlobalInterfaceTable *git_ptr): m_git_ptr(NULL), m_ComInitialized(false) 
   {
      m_git_ptr = git_ptr;
   }
...

如上所述初始化m_git_ptr是否有任何优点/缺点,或者我错过了什么?感谢。

2 个答案:

答案 0 :(得分:1)

缺点是它以两种不同的方式被初始化两次。这不是性能问题,因为优化编译器将消除第一个赋值,但它是代码可读性的问题。选择一种风格并坚持下去。

请注意,在C ++ 11中,这种"双初始化"通过类内成员初始化回归时尚:

class CCom_Itf
{
    m_git_ptr = nullptr; // in-class init
...

在这种情况下,如果构造函数具有包含相同成员的初始化列表,则将忽略类内初始值设定项。然而,这种双重初始化似乎不太可以避免。

答案 1 :(得分:0)

这种奇怪的初始化任务舞蹈没有任何优势,除非您为每个源代码字符付费。

对于一个简单的非常量成员,缺点是微不足道的:你编写的代码超出了你的需要,并且依赖于编译器注意到舞蹈可以被单个初始化所取代( a,如果不是,那可能是微小的性能影响。

对于更复杂的类型,可能会有性能成本,因为默认初始化后跟分配可能比直接初始化更有效。如果类型不可分配,或者成员被宣布为const,则舞蹈根本不起作用。