C++中struct定义末尾必须加分号,否则编译报错;默认访问权限为public,而class为private;struct支持成员函数、构造函数、继承和运算符重载;其内存布局受对齐规则影响,sizeof常大于成员大小之和。

struct 声明必须带分号,否则编译报错
这是最常踩的坑:C++ 中 struct 定义末尾**必须加英文分号**,否则编译器会报类似 expected ';' before '{' 的语法错误。它不是语句,但整个定义是一个声明(declaration),和变量声明一样需要结束符。
struct Point { int x, y; }; // ✅ 正确struct Point { int x, y; } // ❌ 缺少分号,编译失败- 即使后面紧跟变量定义,分号也不能省:
struct Data { int a; } d1, d2; // 分号在最后
struct 默认访问权限是 public,class 才是 private
很多初学者误以为 struct 和 class 只是“习惯写法不同”,其实关键差异就在默认成员访问控制上。这直接影响你能否直接读写成员变量。
struct S { int x; }; S s; s.x = 10; // ✅ 合法,x 是 publicclass C { int x; }; C c; c.x = 10; // ❌ 编译错误:x 是 private- 两者都可以显式用
public:/private:覆盖默认行为,但不写时行为不同 - 实际工程中,用
struct通常表示“纯数据聚合体”,不封装逻辑;用class表示需要隐藏实现或提供接口的对象
struct 可以有成员函数、构造函数甚至继承,不是 C 风格的纯数据块
C++ 的 struct 是 class 的全功能兄弟,唯一默认区别只有访问权限。它完全可以承担面向对象职责。
struct Vec2 { float x, y; Vec2(float x=0, float y=0) : x(x), y(y) {} float len() const { return sqrt(x*x + y*y); } };- 可以重载运算符:
Vec2 operator+(const Vec2& a, const Vec2& b) { return {a.x+b.x, a.y+b.y}; } - 可以继承:
struct ColorVec2 : Vec2 { uint8_t r,g,b; }; - 但要注意:如果加了构造函数或虚函数,就不再是 trivially copyable 类型,会影响 memcpy、memset 或 POD 判断逻辑
结构体对齐与 sizeof 不等于各成员 size 之和
内存布局受编译器对齐规则影响,sizeof(struct) 往往大于成员字节总和,尤其混用不同大小类型时。这对序列化、网络传输、GPU 结构体映射等场景很关键。
立即学习“C++免费学习笔记(深入)”;
-
struct Bad { char a; int b; char c; };在多数平台sizeof(Bad)是 12,不是 1+4+1=6 - 原因:编译器为
int b插入 3 字节填充,使其地址对齐到 4 字节边界;再为char c后补 3 字节使整个 struct 大小是 4 的倍数 - 控制对齐可用
#pragma pack(1)或alignas(1),但要小心性能损失(非对齐访问在某些 CPU 上慢甚至崩溃) - 跨平台结构体通信务必显式指定对齐,并用静态断言校验:
static_assert(sizeof(MyStruct) == 8, "MyStruct layout changed");
struct 直接 memcpy 到另一块内存,或者在 C 接口里传 C++ struct 却没确认其 ABI 兼容性。











