【C++】005、struct与class的区别

一、语法区别

在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类的能力了