5

我刚刚读到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

4 回答 4

7

我更喜欢明确性。正如对这个问题的一些错误答案所表明的那样,对每个人来说,并不是显而易见的,也就是说,int()它们int(0)是等价的。

我想不提供显式值的好处是,如果您更改类型,则无需重新访问初始化列表。

于 2010-07-07T19:14:25.983 回答
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 ) {} 
};

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

于 2010-07-07T19:26:51.887 回答
2

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

这可能只是风格问题,但重要的是要注意,正如 Johannes 所做的那样,这不仅仅是句法风格;他们做不同的事情。使这些不同的东西相同很容易。

我更喜欢 value-initialization,因为我没有参与 value 的初始化方式;我只是说“被初始化”。相反,一旦您引入了一个值,您就会影响该值的初始化方式。

我认为您很难找到价值初始化明显更好的情况,只需选择更适合您的情况即可。

于 2010-07-07T19:27:17.360 回答
-1

我认为它们是不同的东西,你是否可能混淆NULL含义void相同int main()int main(void)不是int main(NULL)(在 C++NULL中相当于 0

于 2010-07-07T19:06:43.323 回答