Ale*_*x O 1 c++ constructor sizeof memset
我想将派生结构的所有成员归零.
每隔一段时间就有数百个成员和更多成员被添加,所以我觉得明确地初始化它们容易出错.
结构没有虚函数,所有成员字段都是内置的.然而,由于具有非平凡的构造函数,它们不是POD.
除了练习的标准皱眉外,您是否看到以下任何问题?
struct Base
{
// Stuff
};
struct Derived : public Base
{
// Hundreds of fields of different built-in types
// including arrays
Derived()
{
::memset(reinterpret_cast<char*>this + sizeof (Base), 0, sizeof *this - sizeof (Base));
}
};
Run Code Online (Sandbox Code Playgroud)
谢谢.
这假设Base基类子对象位于开头Derived.如果添加另一个基类,这将不起作用.
此外,您的代码是错误的:指针算术是根据对象执行的,而不是以字节的形式执行.您需要使用reinterpret_cast<char*>(this)以字节为单位执行算术.无论如何,你仍然不应该这样做.
考虑以下非丑陋的,符合标准的方法,利用值初始化:
struct Derived : public Base
{
struct DerivedMembers { /* ... */ }
DerivedMembers data;
Derived() : data() { }
};
Run Code Online (Sandbox Code Playgroud)
只要DerivedMembers没有构造函数,这将初始化每个数据成员的值data,这看起来就像你想要的行为.
或者,如果您希望在不使用" data"成员变量的情况下访问成员,请考虑使用另一个基类:
struct DerivedMembers { /* ... */ }
struct Derived : Base, DerivedMembers
{
Derived() : DerivedMembers() { }
};
Run Code Online (Sandbox Code Playgroud)