初始化成员变量

时间:2009-08-03 23:54:38

标签: c++

我已经开始采用这种模式了:

template<typename T>
struct DefaultInitialize
{
   DefaultInitialize():m_value(T()){}
   // ... conversions, assignments, etc ....
};

因此,当我有包含原始成员的类时,我可以将它们设置为在构造时初始化为0:

struct Class
{
  ...
  DefaultInitialize<double> m_double;
  ...
};

我这样做的原因是为了避免必须记住在每个构造函数中初始化成员(如果有多个构造函数)。我想知道是否:

  • 这是一种有效的模式吗?
  • 我使用正确的术语?

4 个答案:

答案 0 :(得分:5)

  

这是一种有效的模式吗?

我想说,这是一种已知的“有效”模式。 Boost有一个名为value_initialized的类模板,它也可以做到这一点。

  

我使用正确的术语?

嗯,您的模板可以进行优化,以减少对类型参数的要求。截至目前,您的类型T需要一个复制构造函数,不幸的是。让我们将初始化器更改为以下

DefaultInitialize():m_value(){}

然后,从技术上讲,这种初始化称为value initialization,从C ++ 03开始。这有点奇怪,因为首先没有提供任何价值。好吧,这种初始化看起来像默认初始化,但是用于填充零,但是尊重任何用户定义的构造函数并执行它。

总结一下,您所做的是初始化类型为T的对象,然后将该对象复制到m_value。我上面的版本是什么值来直接初始化成员。

答案 1 :(得分:4)

似乎需要做很多工作才能避免输入m_double(0)。我认为乍一看更难理解,但只要一切都得到妥善实施,它看起来确实很好。

但值得吗?你真的想要到处#include "DefaultInitialize.h"吗?


为了澄清,基本上,你是:

  • 因包含而使您的编译时间更长。
  • 您的代码库更大,因为您必须管理看似简单的DefaultInitialize
  • 增加其他人阅读代码所需的时间。如果你有一个类double的成员,那对我来说很自然,但是当我看到DefaultInitialize时,我必须知道它是什么以及为什么创建它

所有这些因为你不喜欢输入构造函数。我知道不必这样做似乎很好,但是我写过的最值得学习的课程往往需要编写一个构造函数。

这当然只是我的意见,但我认为大多数人都会同意。那就是:不必将成员显式初始化为0会很方便,但另类(你的类)不值得。

更不用说在C ++ 0x中,你可以这样做;

class Foo
{
private:
    int i = 0; // will be initialized to 0
}

答案 2 :(得分:2)

某些编译器未正确实现值初始化。例如,请参阅Pavel Kuznetsov报告的Microsoft Connect,Value-initialization in new-expression

Fernando Cacciola的boost::value_initialized(已由litb提到)提供了解决此类编译器错误的方法。

答案 3 :(得分:1)

如果您只是将基本类型初始化为零,则可以覆盖new并将其memset分配的内存设置为零。可能更简单。这样做有利有弊。