一、语法区别
在C++中,struct与class,除了默认访问权限和默认继承权限不同,其他功能都完全等价
|----------|--------------|---------------|
| 对比 | struct | class |
| 成员默认访问权限 | public(公开) | private(私有) |
| 继承默认访问权限 | public(公有继承) | private(私有继承) |
代码:
cpp
struct S { int a; }; // a 默认 public
class C { int b; }; // b 默认 private
struct D1 : S { }; // 默认 public 继承(S的public成员仍是public)
class D2 : S { }; // 默认 private 继承(S的public成员变成private)
-
除了上面两点不同外,包括成员,构造函数,析构函数,运算符重载,模版参数,和继承多态等都一样
-
注意:在C语言中,struct没有函数,他只是数据集合体
二、struct与class在工程中的使用场景
|---------------------------|------------------------------------------------|------------|
| 使用场景 | 推荐用 struct | 推荐用 class |
| 纯数据容器/POD(Plain Old Data) | ✅ 比如 Point{int x, y;}、RGBColor{uint8_t r,g,b;} | ❌ 过度设计 |
| 没有私有成员、没有复杂行为 | ✅ 仅用来聚合数据,不包含逻辑 | ❌ |
| 有复杂业务逻辑/封装/多态 | ❌ 容易误导阅读者 | ✅ 体现面向对象设计 |
| 需要访问控制(private/protected) | ❌ 虽然可以写,但语义不符 | ✅ |
| C语言兼容的头文件 | ✅ 必须用struct(C语言没有class) | ❌ C编译器不识别 |
总结:当你只想把数据包在一起时用struct,当你想构建一个具有不变量的对象时用class
- 代码:
cpp
// ✅ 好:struct 表示纯粹的数据聚合
struct Vec3 {
float x, y, z;
};
// ✅ 好:class 表示有约束的实体对象
class BankAccount {
private:
double balance; // 必须 >= 0,有业务约束(不变量)
public:
void deposit(double amount) { /* 校验逻辑 */ }
void withdraw(double amount) { /* 校验逻辑 */ }
};
三、底层本质
-
在汇编代码层面,struct与class没有任何区别,都是类类型,编译器只关心成员的偏移量和类型
-
C++要保留struct,是为了C语言的向后兼容
四、模版参数
-
C++中,struct不能作为模板的template的类型参数
-
只能使用class或typename引入类型参数
五、struct在C与C++语言中的区别
-
在C语言中,struct只包含数据,没有成员函数,也无继承等相关功能
-
但在C++语言中,struct已经是具备了class类的能力了