默认初始化整数成员是否为空初始化程序?

问题描述:

我刚读出的那个comment by GMan默认初始化整数成员是否为空初始化程序?

class A 
{ 
public: 
    A() : 
     m_ptr() // m_ptr is implicitly initialized to NULL 
    { } 
}; 

应当优于

class A 
{ 
public: 
    A() : 
     m_ptr(NULL) // m_ptr is explicitly initialized to NULL 
    { } 
}; 

请注意,在第一示例中的缺少的NULL

GMan对不对?这可能有点主观,所以“你更喜欢空白初始化程序的默认初始化?”可能更合适。

此外,如果您更喜欢空初始化器,这是否适用于其他积分成员?

class B 
{ 
public: 
    B() : 
     m_count(), 
     m_elapsed_secs() 
    {} 
private: 
    std::size_t m_count; 
    float m_elapsed_secs; //the elapsed time since instantiation 
}; 

当然,请保护你的观点,并说明为什么一个人应该优先于另一个人。

+0

有人比我更有创意能拿出更好的标题,所以我不会得到错误的答案?谁会想到你可能会得到一个最佳实践问题的错误答案。 – 2010-07-07 19:15:35

+2

我觉得标题很清楚,而且问题写得很好。再一次,我已经知道你在问什么。错误的答案可能只是对语言的误解,而不是你的问题。 – GManNickG 2010-07-07 19:28:44

我更喜欢明确性。由于部分这个问题的错误答案已经证明,并不是所有人都明白,比如说,int()int(0)是等价的

我想不提供显式值的好处是你不需要重新访问初始化列表if你前夕r改变类型。

+0

您可能会争辩说,当类型更改为否定时(默认init不再是您想要的新类型时),不需要重新访问初始化列表。 – 2010-07-07 19:25:18

我认为他们是不同的东西,有没有可能你用void意味着int main()混淆NULL相同int main(void)但不是int main(NULL)(在C++ NULL相当于0

+2

我的问题中没有函数定义。我正在问初始化类的初始化列表中的成员。 – 2010-07-07 19:14:02

当您将模板类写入默认初始化依赖类型的成员时,需要缺省的初始化。对于其他情况,如果要默认初始化成员,则没有真正的区别。但是在某些情况下,您希望获得非默认行为。当默认的初始化是不适合

一个样品:

struct X { 
    HANDLE some_file_handle; 
    // note that INVALID_HANDLE_VALUE is not equal to 0 in Windows 
    X() : some_file_handle(INVALID_HANDLE_VALUE) {} 
}; 

作为使用NULL VS缺省初始化我还有一个例子:在Visual Studio 2010,其被声明为与C++ 0X NULL某种方式符合的仍然定义为0,但在C++ 0x中,您应该使用nullptr来初始化指针。并且在C++'03中没有定义nullptr。但你可能想让你的代码可移植。在这种情况下(为了初始化指针),我会更喜欢默认初始化值初始化。

首先,我说这可以说是更好,而不是它。 :)另外,它更多的是摆脱NULL;我只是碰巧用什么都没有,而是0。

这可能只是一个风格问题,但重要的是要注意,as Johannes did,它不仅仅是语法风格;他们做不同的事情。让这些不同的东西一样容易。

我更喜欢数值初始化,因为我没有考虑如何初始化值的任何部分;我只是说“被初始化”。相反,一旦你引入一个值,你正在影响如何初始化值。

我觉得你会很难找到一个情况,其中价值初始化为显然更好,只需选择哪一个更适合你。

+0

你更喜欢'B类'情况下的值初始化吗?对我来说,它感觉有点奇怪,并没有将计数变量初始化为0. – 2010-07-07 19:37:27

+2

我认为GMan不应该回答“GMan是否正确”的问题。这是某种递归。 :) – 2010-07-07 19:40:38

+0

@Caspin:是的。无论如何,我知道它会被初始化为0,所以我觉得指定常量只是一种浪费。 :)然后,再次明确可以更容易阅读。 – GManNickG 2010-07-07 19:42:31