如何在 C++ 中将结构初始化为 0

加布里埃尔·斯台普斯

这是在 C++ 上不起作用的相关 C 答案(作为结构的零初始值设定项):Initializing a struct to 0提出的解决方案之一是:

myStruct _m1 = {0}; 

这在 C 中工作正常,但在 C++ 中不起作用。:( :

错误:无法使用类型为“int”的右值初始化“myScope::MyStruct”类型的成员子对象。

你如何在 C++ 中对结构进行零初始化?

有关的:

  1. 在 C 中将结构初始化为 0:将结构初始化为 0
  2. 更新:(一个相邻但不重复的问题,结果证明也非常有用)用空花括号初始化

投票结束这个问题的模组:

我的问题不是另一个问题的重复(用空花括号初始化),因为另一个问题不是在询问在 C++ 中初始化结构的各种方法以及为什么 C 方法不起作用,而是它们是询问为什么 C++ 关键字会explicit破坏他们的一种初始化技术两个截然不同的问题。不重复。

加布里埃尔·斯台普斯

我想通了:要让它编译,只需删除零:

myStruct _m1 = {};

它现在编译。然而,我运行了一堆测试来检查一些事情,这并没有将结构的所有元素初始化为零!相反,它将结构初始化为其默认值。

假设你有这个结构:

typedef struct
{
    int num1 = 100;
    int num2 = -100;
    int num3;
    int num4 = 150;
} data_t;

注意:typedef上面是我在 C 而不是 C++ 中测试这些东西时的遗留物(当然,C 中不允许使用默认的结构值)。对于 C++,这是首选:

struct data_t
{
    int num1 = 100;
    int num2 = -100;
    int num3;
    int num4 = 150;
};

所以请在我不必要地typedef用来定义下面的结构的地方忽略它

无论如何,如果我声明上述data_t结构之一,然后执行以下操作:

data_t d2 = {};
printf("d2.num1 = %i\nd2.num2 = %i\nd2.num3 = %i\nd2.num4 = %i\n\n",
       d2.num1, d2.num2, d2.num3, d2.num4);

...输出将是:

d2.num1 = 100
d2.num2 = -100
d2.num3 = 0
d2.num4 = 150

而且我什至不确定它d2.num3是零是因为它被初始化为零还是因为它没有初始化,并且该内存位置恰好包含零。

如此处所述:https : //en.cppreference.com/w/cpp/language/zero_initialization,您也可以这样做:

myStruct _m1{};

在上面的例子中,这段代码:

data_t d2{};
printf("d2.num1 = %i\nd2.num2 = %i\nd2.num3 = %i\nd2.num4 = %i\n\n",
       d2.num1, d2.num2, d2.num3, d2.num4);

...会产生与我上面显示的相同的输出。

即使在将结构设置为= {0}确实有效的情况下,例如:

// Does NOT do what I expected! Only sets the FIRST value in the struct to zero! 
// The rest seem to use default values.
data_t d3 = {0};
printf("d3.num1 = %i\nd3.num2 = %i\nd3.num3 = %i\nd3.num4 = %i\n\n",
       d3.num1, d3.num2, d3.num3, d3.num4);

...输出仍然不是我所期望的,因为它只将第一个值设置为零!(我不明白为什么):

d3.num1 = 0
d3.num2 = -100
d3.num3 = 0
d3.num4 = 150

然而,在 C 风格的数组(非结构)上,这些语义工作正常。请在此处参考此答案(如何将数组的所有成员初始化为相同的值?)。因此,以下几行在使用 C++ 时都将 C 样式数组的所有元素都设置为零:

uint8_t buffer[100] = {0}; // sets all elements to 0 in C OR C++
uint8_t buffer[100] = {};  // sets all elements to 0 in C++ only (won't compile in C)

因此,经过大量实验,看起来以下几种方法是对结构 PERIOD 进行零初始化的唯一方法。如果您有不同的了解,请在此处发表评论和/或留下您自己的答案。

在 C++ 中对结构进行零初始化的唯一方法。

  1. 明确:

     // C-style typedef'ed struct
     typedef struct
     {
         int num1 = 100;
         int num2 = -100;
         int num3;
         int num4 = 150;
     } data_t;
    
     // EXPLICITLY set every value to what you want!
     data_t d1 = {0, 0, 0, 0};
     // OR (using gcc or C++20 only)
     data_t d2 = {.num1 = 0, .num2 = 0, .num3 = 0, .num4 = 0}
    
  2. 使用memset()强制所有字节为零:

     data_t d3;
     memset(&d3, 0, sizeof(d3));
    
  3. 首先将所有默认值设置为零:

     // C-style typedef'ed struct
     typedef struct
     {
         int num1 = 0;
         int num2 = 0;
         int num3 = 0;
         int num4 = 0;
     } data_t;
    
     // Set all values to their defaults, which are zero in
     // this case
     data_t d4 = {};
     // OR
     data_t d5{}; // same thing as above in C++
    
     // Set the FIRST value only to zero, and all the rest
     // to their defaults, which are also zero in this case
     data_t d6 = {0};
    
  4. 为 C++ 结构编写一个构造函数

     // 1. Using an initializer list
     struct data
     {
         int num1;
         int num2;
         int num3;
         int num4;
    
         data() : 
             num1(0),
             num2(0),
             num3(0),
             num4(0) {}
     };
    
     data d7; // all values are zero
    
     // OR: 2. manually setting the values inside the constructor
     struct data
     {
         int num1;
         int num2;
         int num3;
         int num4;
    
         data()
         {
             num1 = 0;
             num2 = 0;
             num3 = 0;
             num4 = 0;
         }
     };
    
     data d8; // all values are zero
    
  5. 使用没有默认值的结构,并使用它创建您的对象 static

     tpedef struct
     {
         int num1;
         int num2;
         int num3;
         int num4;
     } data_t;
    
     // `static` forces a default initialization of zero for each
     // value when no other default values are set
     static data_t d9;
    
  6. 因此,如果您有一个具有非零默认值的结构,并且您想将所有值归零,您必须明确地做到这一点!这里还有一些方法:

     // 1. Have a `constexpr` copy of the struct that you use to
     // reset other struct objects. Ex:
    
     struct data
     {
         int num1 = 1;
         int num2 = 7;
         int num3 = -10;
         int num4 = 55;
     };
    
     constexpr data DATA_ALL_ZEROS = {0, 0, 0, 0};
    
     // Now initialize d13 to all zeros using the above `constexpr` struct 
     // object
     data d13 = DATA_ALL_ZEROS; 
    
    
     // OR 2. Use a `zero()` member function to zero the values:
    
     struct data
     {
         int num1 = 1;
         int num2 = 7;
         int num3 = -10;
         int num4 = 55;
    
         zero()
         {
             num1 = 0;
             num2 = 0;
             num3 = 0;
             num4 = 0;
         }
     };
    
     data d14;
     d14.zero();
    

这里最大的收获是这些:data_t d{}, data_t d = {}, and 中的data_t d = {0}任何一个实际上都将结构的所有成员设置为零!

  1. data_t d{} 将所有值设置为结构中定义的默认值。
  2. data_t d = {} 还将所有值设置为其默认值。
  3. 并且data_t d = {0}仅将 FIRST 值设置为零,并将所有其他值设置为其默认值。

所以,要明确

请注意,我写的上述关键要点似乎与本文档相矛盾,因此我提出了这个后续问题,在下面列为参考文献 #1,事实证明这对我的理解非常有帮助!

参考:

  1. [最有用]为什么不将 C++ 结构初始化为 `= {0}` 将其所有成员设置为 0?
  2. [很有用]
  3. https://en.cppreference.com/w/cpp/language/zero_initialization
  4. https://en.cppreference.com/w/cpp/language/aggregate_initialization
  5. https://en.cppreference.com/w/cpp/language/value_initialization
  6. [非常有用] 将数组(不是结构)的所有成员初始化为相同的值:
  7. 如何将数组的所有成员初始化为相同的值?
  8. [gcc only]如何将数组的所有成员初始化为相同的值?
  9. https://github.com/ElectricRCAircraftGuy/eRCaGuy_hello_world/blob/master/cpp/struct_initialization.cpp
  10. 克隆这个 repo 并自己运行代码 cpp/run_struct_initialization.sh

有关的:

  1. 在结构中初始化默认值
  2. *****[我自己的答案,它演示了任何函数中的这种结构修改/聚合成员重新分配:leds[0] = {10, 20, 30, 40, 50};] Arduino Stack Exchange:初始化结构数组

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在C中将数组初始化为0?

如何在C中将数组初始化为全0?

如何在C中将结构数组初始化为Global?

如何在bash中将数组元素初始化为0?

无法在C中将int初始化为0

如何在cython中将结构初始化为NULL?

编译器如何在C中将数组初始化为零?

如何在C ++中的函数中将静态数组初始化为特定值?

如何在C中将文字初始化为size_t?

默认情况下,C ++结构的成员是否初始化为0?

如何将结构数组初始化为非零值,如 0xFF?

将结构初始化为0

Objective-C如何将C结构初始化为属性?

为什么不将C ++结构初始化为`= {0}`并将其所有成员都设置为0?

如何使用c#在SharePoint中将字符串初始化为日期时间字段类型

如何在 C++ 初始值设定项列表中将常量引用成员初始化为另一个成员(标准向量)

如何在TypeScript中将{[key:string]:string}初始化为{}?

如何在TypeScript中将数组初始化为元组类型?

如何在C ++中新建和初始化结构?

如何在C中初始化结构?

如何在C ++中的结构中初始化向量

如何在 C 中初始化结构

如何将foreach函数或变量初始化为0

如何将抽象数字初始化为0?

如何将函数的绘图初始化为从 0 开始?

为什么malloc在gcc中将值初始化为0?

如何在C中将我的整数数组从0标准化为10

在C中将二维结构数组初始化为零(将图像设置为全黑)

我们如何在C ++中初始化所有值为0的向量