[英]Initializing member variables
我已经开始采用这种模式了:
template<typename T>
struct DefaultInitialize
{
DefaultInitialize():m_value(T()){}
// ... conversions, assignments, etc ....
};
因此,当我有原始成员的类时,我可以将它们设置为在构造时初始化为0:
struct Class
{
...
DefaultInitialize<double> m_double;
...
};
我这样做的原因是为了避免必须记住在每个构造函数中初始化成员(如果有多个构造函数)。 我想弄清楚是否:
这是一个有效的模式?
我想说,这是一种已知的“有效”模式。 Boost有一个名为value_initialized
的类模板,它也可以完成。
我使用正确的术语?
那么,您的模板可以进行优化,以减少对类型参数的要求。 截至目前,您的类型T
需要一个复制构造函数,不幸的是。 让我们将初始化器更改为以下内容
DefaultInitialize():m_value(){}
然后,从技术上讲,这种初始化称为value initialization
,从C ++ 03开始。 这有点奇怪,因为首先没有提供任何价值。 好吧,这种初始化看起来像默认初始化,但是用于填充零,但是尊重任何用户定义的构造函数并执行它。
总而言之,您所做的是将值初始化为具有类型T
的对象,然后将该对象复制到m_value
。 我上面的版本是什么值来直接初始化成员。
似乎需要做很多工作才能避免输入m_double(0)
。 我认为乍一看更难理解,但只要一切都得到妥善实施,它看起来确实很好。
但是这值得吗? 你到底想要#include "DefaultInitialize.h"
吗?
为了澄清,基本上,你是:
DefaultInitialize
类 double
,这对我来说很自然,但是当我看到DefaultInitialize
,我必须知道它是什么以及它为什么被创建 所有这一切,因为你不喜欢键入构造函数。 我知道不必这样做似乎很好,但是我写过的最值得学习的课程往往需要编写一个构造函数。
这当然只是我的意见,但我认为其他大多数人都会同意。 那就是:不必将成员显式初始化为0会很方便,但替代方案(你的类)不值得。
更不用说在C ++ 0x中,你可以做到这一点;
class Foo
{
private:
int i = 0; // will be initialized to 0
}
有些编译器没有正确实现值初始化 。 例如,请参阅Pavel Kuznetsov报告的Microsoft Connect, new-expression中的值初始化 。
Fernando Cacciola的boost :: value_initialized (这里已经提到过litb )为这样的编译器错误提供了一种解决方法。
如果您只是将基本类型初始化为零,则可以覆盖new并将其memset分配的内存设置为零。 可能更简单。 这样做有利有弊。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.