struct在C++中是支持成员函数、访问控制和继承的用户定义类型,默认成员和继承均为public;常见写法如struct Point { int x, y; void print() const { std::cout
结构体在 C++ 中不是“只能存数据”的 C 风格容器,而是可带成员函数、支持访问控制、能继承的用户定义类型。定义时用 struct 关键字,**默认成员和继承都是 public**,这点和 class 的 private 默认不同。
常见写法:
struct Point {
int x;
int y;
// 成员函数(可选)
void print() const {
std::cout << "(" << x << ", " << y << ")\n";
}
// 构造函数(可选)
Point(int x = 0, int y = 0) : x(x), y(y) {}
};
Point p1; 执行默认初始化(成员值未定义),Point p2{}; 才会零初始化struct Point { ... } p1, p2; 这种内联定义变量的写法合法但不推荐语义上没有本质区别,C++ 标准明确说 struct 和 class 仅在默认访问权限和默认继承方式上不同。其他所有能力(虚函数、模板、运算符重载、友元等)完全一致。
struct 成员默认 public;class 默认 private
struct Derived : Base 等价于 struct Derived : public Base;class Derived : Base 等价于 class Derived : private Base
struct 表达
“纯数据聚合”或 POD 类型(如配置项、几何点、网络包头),用 class 表达封装强、有不变量约束的类型C++11 起支持统一初始化语法,但不同初始化形式行为差异明显,尤其涉及聚合类型(aggregate)时。
Point p1{1, 2}; —— 聚合初始化(要求无用户定义构造函数、无私有/保护非静态成员等),安全且禁止窄化转换Point p2 = {1, 2}; —— 复制初始化,也走聚合规则(C++17 起与上者等价)Point p3(1, 2); —— 直接调用构造函数,绕过聚合规则;若定义了构造函数,{} 就不再按聚合初始化处理Point p4{1}; 编译失败(聚合初始化要求全字段提供,除非有默认成员初始化器)结构体对象在内存中是连续块,但编译器会按对齐规则插入填充字节。这意味着 sizeof(Point) 不一定等于各成员大小之和,也意味着直接 memcpy 或文件二进制写入可能出问题。
#pragma pack(1) 或 alignas(1) 可禁用填充,但影响性能,且需两端一致extern "C" + 显式 static_assert 检查 offsetof 和 sizeof,例如:static_assert(offsetof(Point, y) == 4, "y must be at offset 4");
结构体本身简单,但一旦涉及初始化顺序、内存对齐、ABI 兼容或生命周期管理,就很容易掉进隐性坑里。别只盯着语法,多看生成的汇编或用 offsetof 验证布局。