C++中类成员的清晰结构体

3
我想清空一个类的成员结构体。例如:
struct MyStruct
{
    int my_int;
    char my_array[10];
};

class MyClass {        
   public:       
       MyStruct some_struct;
       void myMethod() {  
           // Here I want to reset my structure
           MyStruct = {};
       }
};

我的假设是:

  1. MyStruct没有构造函数,这是POD类型。
  2. POD类型将通过零初始化。

这是正确的吗?my_int将为零,并且my_array将被填充为零吗?


3
MyStruct = {}; 可以翻译为 some_struct = MyStruct {};。在这个翻译中,变量名被更改为了 some_struct,并添加了大括号以指示创建一个空结构体。注意保留原始代码的意义和语法,同时让翻译更易于理解。 - Scheff's Cat
1
POD类型将被初始化为零。根据初始化的方式,这里是可以的。 - Jarod42
@Scheff:您的意思是 MyStruct = {}; 好一些还是和 some_struct = MyStruct {}; 一样好呢?;-) - Jarod42
@Jarod42 不完全是。但与此同时,我让自己相信即使 some_struct = { }; 也应该能够胜任... 在coliru上的演示 - Scheff's Cat
2个回答

3
你的直觉是正确的(但语法有误)。MyStruct 是一种聚合类型some_struct = {} 是对一个值初始化的聚合体进行赋值,它会变成零初始化,因为你使用了由空括号{}组成的初始化器。在零初始化期间,数组的每个元素都会被零初始化。

2

相反:

some_struct = {}

这里是测试代码:
#include <iostream>
struct MyStruct
{
    int my_int;
    char my_array[10];
};

class MyClass {
   public:
       MyStruct some_struct;
       void myMethod() {
           // Here I want to reset my structure
           some_struct = {};
       }
};

int main()
{
    MyClass test;
    test.some_struct={1, {1,1,1,1,1,1,1,1,1,1}};

    std::cout << "my_int "<< test.some_struct.my_int<<std::endl;
    for (int i: test.some_struct.my_array)
    {
        std::cout << i << "-";
    }

    test.myMethod();
    std::cout << std::endl;
    std::cout << "my_int "<< test.some_struct.my_int<<std::endl;
    for (int i: test.some_struct.my_array)
    {
        std::cout << i << "-";
    }
}


1
使用特殊/不同的初始化规则,测试大多只是一个提示,而不是证明。未初始化的值也可能为0。使用constexpr更好,因为不允许UB和未初始化的值(即使对于某些测试来说可能过于严格)。 - Jarod42
感谢您的指正,我会改进我的答案。 - Pat. ANDRIA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接