我最近加入了一个项目,项目中的一个主要接口类在下面进行了初始化。
class CCom_Itf
{
CCom_Itf(IGlobalInterfaceTable *git_ptr): m_git_ptr(NULL), m_ComInitialized(false)
{
m_git_ptr = git_ptr;
}
...
如上所述初始化m_git_ptr是否有任何优点/缺点,或者我错过了什么?感谢。
答案 0 :(得分:1)
缺点是它以两种不同的方式被初始化两次。这不是性能问题,因为优化编译器将消除第一个赋值,但它是代码可读性的问题。选择一种风格并坚持下去。
请注意,在C ++ 11中,这种"双初始化"通过类内成员初始化回归时尚:
class CCom_Itf
{
m_git_ptr = nullptr; // in-class init
...
在这种情况下,如果构造函数具有包含相同成员的初始化列表,则将忽略类内初始值设定项。然而,这种双重初始化似乎不太可以避免。
答案 1 :(得分:0)
这种奇怪的初始化任务舞蹈没有任何优势,除非您为每个源代码字符付费。
对于一个简单的非常量成员,缺点是微不足道的:你编写的代码超出了你的需要,并且依赖于编译器注意到舞蹈可以被单个初始化所取代( a,如果不是,那可能是微小的性能影响。
对于更复杂的类型,可能会有性能成本,因为默认初始化后跟分配可能比直接初始化更有效。如果类型不可分配,或者成员被宣布为const
,则舞蹈根本不起作用。