C++ C++;将结构数组归零?
我对如何将Obj归零感到困惑。它有几种不同类型的元素。是否必须将其所有成员设置为0? 像<代码>Obj[0].Str=“”代码> ? 所以问题是,正确的做法是什么 我的尝试:C++ C++;将结构数组归零?,c++,C++,我对如何将Obj归零感到困惑。它有几种不同类型的元素。是否必须将其所有成员设置为0? 像Obj[0].Str=“” ? 所以问题是,正确的做法是什么 我的尝试: struct OBJECT { unsigned int Var1; std::string Str1; ... bool YesNo; }; OBJECT Obj[ 327 ]; 我不确定我做的是否正确 哦,还有没有更快的方法将数组归零?正确的方法是为您的结构添加一个构造函数方法,该方法初始化没有自己构造函数的任何成员变量,例如:
struct OBJECT
{
unsigned int Var1;
std::string Str1;
...
bool YesNo;
};
OBJECT Obj[ 327 ];
我不确定我做的是否正确
哦,还有没有更快的方法将数组归零?正确的方法是为您的结构添加一个构造函数方法,该方法初始化没有自己构造函数的任何成员变量,例如:
::memset( &Obj, 0, sizeof( Obj ) );
在该示例中,您将注意到,Str1
未初始化;这是因为std::string
有自己的构造函数对其进行初始化。正确的方法是为您的结构添加一个构造函数方法,用于初始化任何没有自己构造函数的成员变量,例如:
::memset( &Obj, 0, sizeof( Obj ) );
在该示例中,您将注意到,
Str1
未初始化;这是因为std::string
有自己的构造函数对其进行初始化。提供自定义默认构造函数或使用编译器定义的默认构造函数:
OBJECT_STRUCT()
: Var1(0)
, YesNo(false)
{
}
请注意,
fill
方法fill仅在使用默认构造函数时有效。提供自定义默认构造函数或使用编译器定义的默认构造函数:
OBJECT_STRUCT()
: Var1(0)
, YesNo(false)
{
}
请注意,
fill
方法fill仅在使用默认构造函数时有效。不要这样做,因为您的结构中有非平凡的成员(例如std::string
)。如果所有成员都只是简单的数据类型,如int
、char
、double
或指针,则可以执行此操作
这种类型的结构的正确方法是定义一个构造函数,它正确地初始化所有成员
std::fill(std::begin(Obj), std::end(Obj), OBJECT());
不要这样做,因为您的结构中有非平凡的成员(例如,
std::string
)。如果所有成员都只是简单的数据类型,如int
、char
、double
或指针,则可以执行此操作
这种类型的结构的正确方法是定义一个构造函数,它正确地初始化所有成员
std::fill(std::begin(Obj), std::end(Obj), OBJECT());
你应该把你的声明改为
struct OBJECT {
OBJECT() : Var1(0), YesNo(false), ... {}
unsigned int Var1;
std::string Str1;
...
bool YesNo;
};
您应该在
std::array
或std::vector
上使用的数组将初始化对象。您应该将声明更改为
struct OBJECT {
OBJECT() : Var1(0), YesNo(false), ... {}
unsigned int Var1;
std::string Str1;
...
bool YesNo;
};
数组-您应该在
std::array
或std::vector
上使用它-将初始化对象。sizeof(TYPE)*327 not object itself提供正确的默认构造函数。@DenisErmolin感谢您捕捉到了这一点。我非常确定您的许多对象没有简单的副本/默认构造函数。一个memset
不是办法。@Jon不<代码>标准::字符串如果您将其设置为0,它将死机!sizeof(TYPE)*327 not object itself提供正确的默认构造函数。@DenisErmolin感谢您捕捉到了这一点。我非常确定您的许多对象没有简单的副本/默认构造函数。一个memset
不是办法。@Jon不<代码>标准::字符串如果您将其设置为0,它将死机!但这种想法有一个缺点:在添加新成员时,很容易忘记更新构造函数,而memset/std∷填充方式不需要更新。@Hi Angel是的,只要您只有微不足道的成员,您就是对的。但对于更复杂的成员,memset
甚至可能是危险的,因为它会践踏成员的内存。有关未初始化成员变量的讨论,请参阅。@OlafDietsche感谢您的建议;我试过了,但我不得不说,似乎没有一个好方法可以确定地找到单位化变量<代码>-Weffc++选项给出数百个错误警告,valgrind仅在运行时有用,而我正在使用运行时在嵌入式设备中的应用程序。也许cppcheck对此有用-不确定,我没有尝试过那个特定的问题。@Hi Angel我自己也没有尝试过这些,所以无法真正发表评论。快速检查显示,-Weffc++
和cppcheck似乎都不太可靠<代码>-Weffc++即使在有非POD类型的默认构造函数时也会抱怨,而在没有定义构造函数时,它根本不会抱怨。cppcheck根本不显示任何警告。也许更新的版本更好。但是这个想法有一个缺点:在添加新成员时,很容易忘记更新构造函数,而memset/std∷填充方式不需要更新。@Hi Angel是的,只要您只有微不足道的成员,您就是对的。但对于更复杂的成员,memset
甚至可能是危险的,因为它会践踏成员的内存。有关未初始化成员变量的讨论,请参阅。@OlafDietsche感谢您的建议;我试过了,但我不得不说,似乎没有一个好方法可以确定地找到单位化变量<代码>-Weffc++选项给出数百个错误警告,valgrind仅在运行时有用,而我正在使用运行时在嵌入式设备中的应用程序。也许cppcheck对此有用-不确定,我没有尝试过那个特定的问题。@Hi Angel我自己也没有尝试过这些,所以无法真正发表评论。快速检查显示,-Weffc++
和cppcheck似乎都不太可靠<代码>-Weffc++即使在有非POD类型的默认构造函数时也会抱怨,而在没有定义构造函数时,它根本不会抱怨。cppcheck根本不显示任何警告。也许更新的版本更好。