【LeetCode-C】struct & class

在C++中,structclass都可以用来定义类,核心区别在于默认的成员访问权限和默认继承方式。以下是两者的详细对比:

核心区别

特性structclass
默认成员访问权限publicprivate
默认继承方式public 继承private 继承

示例代码

// struct 示例
struct MyStruct {
    int x;     // 默认 public
    void foo(); // 默认 public
};

// class 示例
class MyClass {
    int x;     // 默认 private
    void foo(); // 默认 private
};

使用场景与惯例

场景structclass
典型用途数据聚合(如 POD 类型、数据传输对象)封装数据和行为(如业务逻辑对象)
代码风格成员直接暴露(如坐标点、配置参数)成员私有化,通过方法控制访问

示例代码

// 用 struct 定义数据聚合
struct Point {
    int x;
    int y;
    // 无复杂方法
};

// 用 class 封装对象
class BankAccount {
private:
    double balance;
public:
    void deposit(double amount) { /* 逻辑 */ }
    void withdraw(double amount) { /* 逻辑 */ }
};

继承行为差异

继承方式struct 默认行为class 默认行为
派生类对基类成员的访问public 继承(基类成员保持原访问权限)private 继承(基类成员在派生类中变为 private

示例代码

// struct 继承(默认 public)
struct BaseStruct {
    int publicVar;
};
struct DerivedStruct : BaseStruct { 
    // publicVar 在派生类中仍为 public
};

// class 继承(默认 private)
class BaseClass {
    int privateVar;
public:
    int publicVar;
};
class DerivedClass : BaseClass { 
    // publicVar 在派生类中变为 private
    // privateVar 不可访问
};

其他注意事项

  1. 模板参数声明
    在模板中,classtypename可以互换,但struct不能替代它们:

    template <class T>  // 合法
    template <struct T> // 非法!
    
  2. 兼容性
    C语言中的struct只能包含数据成员,而C++的struct可以包含成员函数、访问控制等,与class完全等价(除默认权限外)。

  3. 显式指定访问权限
    无论用struct还是class,均可显式指定访问权限:

    struct MyStruct {
    private:  // 显式声明 private
        int hiddenData;
    public:
        void showData() { /* 访问 hiddenData */ }
    };
    

总结

维度structclass
核心用途轻量级数据聚合(默认开放)复杂对象封装(默认封闭)
默认行为成员公有化、继承公有化成员私有化、继承私有化
代码风格面向数据(无封装强制要求)面向对象(强调封装性)

实际开发建议

  • 优先用class表示需要封装和行为的对象。
  • struct表示纯数据集合(如DTO、配置参数等)。
  • 无论用哪种,显式写明访问权限(public/private)和继承方式,避免依赖默认行为。
Licensed under CC BY-NC-SA 4.0
Last updated on Feb 27, 2025 00:00 UTC
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy