一、语法区别

在C++中,struct与class,除了默认访问权限和默认继承权限不同,其他功能都完全等价

对比

struct

class

成员默认访问权限

public(公开)

private(私有)

继承默认访问权限

public(公有继承)

private(私有继承)

代码:

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

  • 代码:

// ✅ 好: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类的能力了

更多推荐