将 100 个类数据成员初始化为零

Initialize 100 class data members to zero

本文关键字:初始化 数据成员      更新时间:2023-10-16

有没有办法初始化具有用户定义构造函数的类的所有数据成员?

class CTest
{
private: 
    int a = 0;
    BYTE b; CHAR* c; int d; int e; int f; int g;
public:
    CTest() b:(0)
    {
        c = 0;
    }
};

假设我的类有 100 个数据成员,我想将它们全部初始化为零。

1 个

1 个做不是最佳选择。我现在使用的解决方法是:我将所有这些 100 个数据成员放在一个结构中,该结构是我的类的基础

喜欢

class : public base_with_all_members

当我想重置所有成员时,我只需在构造函数或initialize()函数中执行以下操作。

*dynamic_cast<base_with_all_members*>(this) = {};

这确实可以正确清除所有成员。

在这种情况下,

最简单的可能是使用较新的语法进行默认值初始化。当然,就打字时间而言,它可能"不是最佳的",但生成的代码应该是可比的。

class CTest
{
private: 
    int a = 0;
    BYTE b = 0;
    CHAR* c = nullptr;
    int d = 0;
    int e = 0;
    int f = 0;
    int g = 0;
public:
    CTest(): d(42)
    // initialiser list only needed is this particular
    // constructor doesn't initialise the value to 0
    {
    }
};

另一种选择是将数据成员农场化为 POD 样式的"数据结构",然后在类的构造函数中初始化它;

struct POD {
  int a;
  int b;
  std::unique_ptr<int> c;
  // etc.
};
class CTest {
  POD data_ = { };
};

进一步的替代方案可能包括使用上述 POD 数据结构的static来初始化成员 POD。


您在评论中提到您有一些无法复制的数据成员(但大概可以移动(,并且您也在寻找某种形式的"重置"功能。POD样品可以修改为;

class CTest {
  POD data_ = { };
public:
  void reset()
  {
    data_ = POD{}; // caters for moveable and copiable types
  }
};

在这里采样。


附带说明一下;这是大量的数据成员。也许进一步的数据划分也是一个好主意。当然,我接受这可能是一个非常特殊的情况,但无论如何考虑一些重构可能是值得的。

为什么不呢?然后,对于所有构造函数,它将仅在一个位置。

class Foo {
    public:
        Foo(): b(3) {}
    private:
        int a = 0;
        int b = 0;
        int c = 0;
        int d = 0;
        int e = 0;
};