我已经开始采用这种模式了:
template<typename T>
struct DefaultInitialize
{
DefaultInitialize():m_value(T()){}
// ... conversions, assignments, etc ....
};
因此,当我有包含原始成员的类时,我可以将它们设置为在构造时初始化为0:
struct Class
{
...
DefaultInitialize<double> m_double;
...
};
我这样做的原因是为了避免必须记住在每个构造函数中初始化成员(如果有多个构造函数)。我想知道是否:
答案 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分配的内存设置为零。可能更简单。这样做有利有弊。