繁体   English   中英

初始化成员变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM