让我说我有一个对象我想在构造函数中初始化为0。 instanced对象占用的每一位都应该为0,包括所有非POD成员,完全忽略其个人默认构造函数。
这在C ++中是否可行?如果是这样,有没有办法可以做到这一点至少与通过初始化列表(如果允许)将每个成员初始化为0一样快?
(有明显的陷阱,但我很好奇;请假设我有一个不可靠的理由!)
答案 0 :(得分:1)
没有"魔法"语法来实现这一点。
如果类没有虚拟表,则可以使用memset(this, 0, sizeof(* this))
,但不建议使用。
您可以尝试使用offsetof
来查明第一个成员的地址,然后从那里删除。这比仅仅memset
整个事情要好一点,但它仍然让我感到不舒服:
// Example non-POD type.
class B
{
public:
B() : b(0xDEADBEEF) {}
int b;
};
class Monstrosity
{
public:
Monstrosity()
{
size_t offset = offsetof(Monstrosity, a);
uint8_t *eraseStart = (uint8_t *)this + offset;
memset(eraseStart, 0, sizeof(Monstrosity) - offset);
}
virtual int foo() { return 0; }
int a;
B b;
};
如果您的会员有虚拟桌子,如果有的话,您实际上已经搞砸了。