为何C++中union不会触发成员的构造函数?
为什么Union里的Vec2默认构造没被触发?
这是C++里union的初始化规则导致的,核心原因有两点:
- union的默认行为是只初始化第一个成员,其他成员不会自动调用构造函数。你代码里的两个union,第一个成员都是匿名的float结构体,所以只有这两个匿名结构体被默认处理,Vec2作为union的非首成员,不会自动触发构造。
- 一旦union里包含了有自定义构造函数的类型(比如你的Vec2),这个union就失去了默认构造函数,必须显式指定要初始化哪个成员——毕竟union同一时间只能有一个活跃成员,编译器不知道你要激活Vec2还是那个匿名结构体。
如果想让Vec2的构造函数执行,有两种常见办法:
- 在Rectangle的构造函数里用placement new显式构造Vec2成员:
Rectangle(){ // 直接在pos和size的内存位置调用Vec2构造 new(&pos) Vec2(); new(&size) Vec2(); printf( "construct Rectangle %f %f %f %f\n", x,y,w,h ); }
- 给每个union定义构造函数,明确指定初始化Vec2:
struct Rectangle { union { struct { float x,y; }; Vec2 pos; // 让union默认初始化pos union() : pos() {} }; union { struct { float w,h; }; Vec2 size; union() : size() {} }; Rectangle(){ printf( "construct Rectangle %f %f %f %f\n", x,y,w,h ); } };
注意:如果显式调用了Vec2的构造,后续也要记得显式调用它的析构函数(pos.~Vec2();),不然可能出现未定义行为。
内容的提问来源于stack exchange,提问作者bobobobo
相关产品推荐
相关产品推荐

