c++中如何使用结构体struct_c++结构体定义与用法

6次阅读

struct 在 C ++ 中是支持成员函数、访问控制和继承的用户定义类型,默认成员和继承均为 public;常见写法如 struct Point {int x, y; void print() const {std::cout

c++ 中如何使用结构体 struct_c++ 结构体定义与用法

struct 在 C++ 中的定义语法和基本用法

结构体在 C++ 中不是“只能存数据”的 C 风格容器,而是可带成员函数、支持访问控制、能继承的用户定义类型。定义时用 struct 关键字,** 默认成员和继承都是 public**,这点和 classprivate 默认不同。

常见写法:

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; 这种内联定义变量的写法合法但不推荐
  • 结构体可以嵌套定义,但不能在内部直接使用自身类型作为成员(需用指针或引用)

struct 和 class 的关键区别在哪

语义上没有本质区别,C++ 标准明确说 structclass 仅在默认访问权限和默认继承方式上不同。其他所有能力(虚函数、模板、运算符重载、友元等)完全一致。

  • 默认访问控制:struct 成员默认 publicclass 默认 private
  • 默认继承方式:struct Derived : Base 等价于 struct Derived : public Baseclass Derived : Base 等价于 class Derived : private Base
  • 实际项目中,习惯用 struct 表达“纯数据聚合”或 POD 类型(如配置项、几何点、网络包头),用 class 表达封装强、有不变量约束的类型

struct 初始化的几种常见方式及陷阱

C++11 起支持统一初始化语法,但不同初始化形式行为差异明显,尤其涉及聚合类型(aggregate)时。

立即学习 C++ 免费学习笔记(深入)”;

  • Point p1{1, 2}; —— 聚合初始化(要求无用户定义构造函数、无私有 / 保护非静态成员等),安全且禁止窄化转换
  • Point p2 = {1, 2}; —— 复制初始化,也走聚合规则(C++17 起与上者等价)
  • Point p3(1, 2); —— 直接调用构造函数,绕过聚合规则;若定义了构造函数,{} 就不再按聚合初始化处理
  • 错误示例:Point p4{1}; 编译失败(聚合初始化要求全字段提供,除非有默认成员初始化器)

struct 内存布局与跨平台序列化注意事项

结构体对象在内存中是连续块,但编译器会按对齐规则插入填充字节。这意味着 sizeof(Point) 不一定等于各成员大小之和,也意味着直接 memcpy 或文件二进制写入可能出问题。

  • #pragma pack(1)alignas(1) 可禁用填充,但影响性能,且需两端一致
  • 结构体含指针、虚函数表指针(有虚函数时)、std::string 等非 POD 成员时,绝对不可 memcpy 或裸写入文件
  • 跨语言(如和 C 交互)时,务必用 extern "C" + 显式 static_assert 检查 offsetofsizeof,例如:
    static_assert(offsetof(Point, y) == 4, "y must be at offset 4");

结构体本身简单,但一旦涉及初始化顺序、内存对齐、ABI 兼容或生命周期管理,就很容易掉进隐性坑里。别只盯着语法,多看生成的汇编或用 offsetof 验证布局。

星耀云
版权声明:本站原创文章,由 星耀云 2026-01-05发表,共计290字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources