C++中struct定义必须以分号结尾,默认成员和继承均为public,与class仅在此两点不同;支持成员函数但推荐用于纯数据聚合,初始化推荐C++11统一初始化语法。

struct定义结构体的基本写法
直接用 struct 关键字加名字就能定义,不需要额外声明或头文件。C++里 struct 默认是 public 继承和访问权限,这点和 class 不同——class 默认是 private。
常见错误:把 struct 当成函数调用写成 struct Point(),或者漏掉结尾分号(;),编译会直接报错 expected ';' before '{'。
- 成员变量可直接在大括号内声明,类型+名字即可,比如
int x; - 可以包含函数(成员函数),但不推荐在结构体里塞复杂逻辑
- 定义后必须加分号,这是语法硬性要求,不是风格问题
struct Point {
double x;
double y;
}; // 这个分号不能少
struct变量的声明与初始化方式
定义完结构体类型,才能声明变量。C++支持多种初始化方式,选错容易引发隐式转换或值未定义的问题。
最安全的是统一初始化(C++11起):用花括号,不带等号,能阻止窄化转换。
立即学习“C++免费学习笔记(深入)”;
-
Point p1{1.0, 2.0};—— 推荐,明确、安全 -
Point p2 = {1.0, 2.0};—— 兼容旧代码,但某些场景会触发复制构造 -
Point p3(1.0, 2.0);—— 错误!除非你写了构造函数,否则编译不过 -
Point p4;—— 成员是未初始化的垃圾值(POD类型),x和y是随机值
struct和class在实际使用中怎么选
功能上几乎完全等价,差异只在默认访问控制和默认继承方式。别被“struct适合数据、class适合行为”这种说法带偏——C++标准没这限制。
真实项目里更看重团队约定和上下文:
- 纯数据聚合(比如配置项、几何点、网络包头)用
struct,一眼看出无封装意图 - 需要隐藏实现、提供接口契约、有非 trivial 析构/拷贝逻辑,优先用
class - 如果结构体开始加
private成员或public:标签,说明它已在向class演化,此时不如直接改用class
混用不会出错,但突然在 struct 里写 private: 容易让协作者困惑。
嵌套struct和typedef的坑
嵌套定义没问题,但要注意作用域和命名冲突。C++11之后不推荐用 typedef 给 struct 起别名,直接用 using 更清晰。
-
struct Config { struct Inner { int version; }; };——Inner必须通过Config::Inner访问 -
typedef struct { int a; } Data;—— C风格遗存,在C++里冗余,且容易和匿名struct混淆 -
using Data = struct { int a; };—— 合法但难读,匿名struct无法被其他地方引用 - 真正想复用类型名,就给结构体命名:
struct Data { int a; };,然后直接用Data
匿名 struct 在C++里不能作为模板参数、不能取地址、不能做 sizeof 的独立目标——这些限制常在泛型编程时暴露出来。


















