默认初始化积分成员是否首选空初始值设定项?

时间:2010-07-07 18:59:30

标签: c++ ctor-initializer

我刚刚阅读了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
};

当然,请捍卫您的观点,并说明为什么应优先考虑另一方。

4 个答案:

答案 0 :(得分:7)

我更喜欢显性。正如这个问题的一些错误答案已经证明的那样,对于每个人来说,int()int(0)是等价的并不明显。

我认为不提供显式值的优点是,如果您更改了类型,则无需重新访问初始化列表。

答案 1 :(得分:2)

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

默认初始化不合适时的一个示例:

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和默认初始化我还有一个例子:在Visual Studio 2010中声明与C ++一致,NULL仍然被定义为0,但在C中++ 0x您应该使用nullptr来初始化指针。并且nullptr未在C ++'03中定义。但是你可能想让你的代码可移植。在这种情况下(为了初始化指针),我更喜欢默认初始化而不是值初始化。

答案 2 :(得分:2)

首先,我说它可以说更好,而不是它。 :)此外,它更多的是摆脱NULL;我碰巧没有使用任何东西而不是0.但无论如何都是一个有趣的问题。

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

我更喜欢值初始化,因为我没有参与如何初始化值的任何部分;我只是说“被初始化”。相反,一旦引入了一个值,就会影响值的初始化。

我认为你很难找到价值初始化明确更好的情况,只需挑选哪一种更适合你。

答案 3 :(得分:-1)

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