You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C++中union不会触发成员的构造函数?

为什么Union里的Vec2默认构造没被触发?

这是C++里union的初始化规则导致的,核心原因有两点:

  • union的默认行为是只初始化第一个成员,其他成员不会自动调用构造函数。你代码里的两个union,第一个成员都是匿名的float结构体,所以只有这两个匿名结构体被默认处理,Vec2作为union的非首成员,不会自动触发构造。
  • 一旦union里包含了有自定义构造函数的类型(比如你的Vec2),这个union就失去了默认构造函数,必须显式指定要初始化哪个成员——毕竟union同一时间只能有一个活跃成员,编译器不知道你要激活Vec2还是那个匿名结构体。

如果想让Vec2的构造函数执行,有两种常见办法:

  1. 在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 );
}
  1. 给每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:54:56