Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;_C++_Struct_Initialization - Fatal编程技术网

C++ 如何在C++;

C++ 如何在C++;,c++,struct,initialization,C++,Struct,Initialization,下面是一个在C++上不起作用的相关C答案(作为结构的零初始值设定项):。提出的解决方案之一是: myStruct _m1 = {0}; 这在C中很好,但是在C++中不起作用。(: 错误:无法使用“int”类型的右值初始化“myScope::MyStruct”类型的成员子对象 打破了它们的初始化技术两个不同的问题。删除零: myStruct _m1 = {}; 它现在可以编译。但是,这并不是将结构的所有元素初始化为零!而是将结构初始化为其默认值 假设您有此结构: typedef struct

下面是一个在C++上不起作用的相关C答案(作为结构的零初始值设定项):。提出的解决方案之一是:

myStruct _m1 = {0}; 
<>这在C中很好,但是在C++中不起作用。(:

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

<如何在C++中初始化零结构?

相关的:
  • 初始化 C中0的结构:
  • 更新:(一个相邻但不重复的问题,结果也非常有用)
  • mods投票结束此问题:
    我的问题不是另一个问题的重复()这个问题不是问C++中初始化结构的各种方式,以及为什么C方法不起作用,而是问<强>为什么C++关键字<代码>显式< /代码>打破了它们的初始化技术<强>两个不同的问题。删除零:

    myStruct _m1 = {};
    
    它现在可以编译。但是,这并不是将结构的所有元素初始化为零!而是将结构初始化为其默认值

    假设您有此结构:

    typedef struct
    {
        int num1 = 100;
        int num2 = -100;
        int num3;
        int num4 = 150;
    } data_t;
    
    <> >注意:上面的代码< TyPulf< /Cord>是我在C++中测试这个东西而不是C++的一个转载(当然,默认的结构值在C中是不允许的)。对于C++,这是首选: 因此,如果我不必要地使用
    typedef
    来定义下面的结构,请忽略它

    无论如何,如果我声明上述
    数据\u 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是否为零,因为它被初始化为零,或者因为它未被初始化,而内存位置恰好包含零

    如此处所述,您还可以执行以下操作:

    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);
    
    …输出仍然不是我期望的,因为它只将第一个值设置为零!(我不明白为什么):

    但是,在C-style数组上(不是结构),这些语义工作得很好。请参阅此处的答案()。因此,在使用C++时,以下两行都将C-style数组的所有元素设置为零:

    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)
    
    因此,以下几种方法似乎是对结构进行零初始化的唯一方法,句号。如果您知道不同的方法,请在此处进行注释和/或留下您自己的答案

    能够在C++中初始化一个结构的唯一方法。
  • 要明确:

     // 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}
    
  • 使用
    memset()
    强制所有字节为零:

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

     // 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};
    
  • < p>编写C++结构体< /p>的构造函数
     // 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
    
  • 使用没有默认值的结构,并使您从中创建的对象成为静态的

     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;
    
  • 因此,如果您有一个具有非零默认值的结构,并且希望将所有值归零,则必须显式执行此操作!以下是一些其他方法:

     // 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();
    
  • 这里最大的收获是:
    数据{}
    数据{}
    ,和
    数据{0}
    ,实际上都没有将结构的所有成员设置为零!
  • data\u t d{}
    将所有值设置为结构中定义的默认值
  • data\u t d={}
    还将所有值设置为默认值
  • data_t d={0}
    仅将第一个值设置为零,将所有其他值设置为默认值
  • 所以,要明确

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

    参考资料:
  • [最有用]
  • [非常有用]
  • [非常有用]将数组(非结构)的所有成员初始化为相同的值:
  • [仅通用条款]
  • 克隆此repo并使用
    cpp/run\u struct\u initialization.sh运行代码
  • 相关的:
  • *****[我自己的答案,它演示了在任何函数中的这种结构修改/聚合成员重新分配:
    led[0]={10,20,30,40,50};
    ]

  • 我想出来了:要编译它,只需删除零:

    myStruct _m1 = {};
    
    它现在可以编译。但是,这并不是将结构的所有元素初始化为零!而是将结构初始化为其默认值

    假设您有此结构:

    typedef struct
    {
        int num1 = 100;
        int num2 = -100;
        int num3;
        int num4 = 150;
    } data_t;
    
    <> >注意:上面的代码< TyPulf< /Cord>是我在C++中测试这个东西而不是C++的一个转载(当然,默认的结构值在C中是不允许的)。对于C++,这是首选: 因此,如果我不必要地使用
    typedef
    来定义下面的结构,请忽略它

    无论如何,如果我声明上述
    数据\u 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是否为零,因为它被初始化为零,或者因为它未被初始化,而内存位置恰好包含零

    如此处所述,您还可以执行以下操作:

    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);
    
    …输出仍然不是我期望的,因为它只将第一个值设置为零!(我不明白为什么):

    但是,在C-style数组上(不是结构),这些语义工作得很好。请参阅此处的答案()。因此,在使用C++时,以下两行都将C-style数组的所有元素设置为零:

    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)
    
    所以,看起来以下几种方法是唯一的归零方法