C++_class和struct的区别和联系

在C++中,class 和 struct 是两种定义用户自定义类型的关键词。它们在功能上极其相似,甚至可以说几乎完全等价,但存在几个关键的区别,主要体现在默认访问权限和编程范式/设计意图上。

以下是它们的主要区别:

  1. 默认访问权限 (Default Access Level)

这是 class 和 struct 最核心、最本质的区别。

class:
    在类定义中,如果没有明确指定访问修饰符(public、private、protected),成员默认是 private 的。
    这意味着类的成员变量和成员函数默认对外部隐藏,体现了面向对象的封装思想。

struct:
    在结构体定义中,如果没有明确指定访问修饰符,成员默认是 public 的。
    这使得 struct 更像是一个开放的数据容器,可以直接访问其成员。

示例对比:


class MyClass {
    int x;      // 默认是 private
    void func(); // 默认是 private
public:
    // ... 显式声明 public 成员
};

struct MyStruct {
    int x;      // 默认是 public
    void func(); // 默认是 public
    // ... 其他成员也默认 public
};
  1. 默认继承权限 (Default Inheritance Mode)

当进行继承时,如果没有显式指定继承方式,两者的默认行为也不同。

class:
    默认继承方式是 private 继承。

cpp
深色版本

class Base {};
class Derived : Base {}; // 等价于 class Derived : private Base {};

struct:

默认继承方式是 public 继承。

    struct Base {};
    struct Derived : Base {}; // 等价于 struct Derived : public Base {};
⚠️ 注意:一旦显式指定了继承方式(如 public、private),这个默认行为就会被覆盖。
  1. 设计意图与编程范式 (Design Intent and Paradigm)

虽然C++允许你用 struct 实现复杂的面向对象特性,但社区和语言设计者鼓励一种约定俗成的用法:
类型 推荐用途 设计意图
class 面向对象编程 (OOP) 用于定义具有封装、继承、多态特性的复杂对象。强调数据隐藏和行为抽象。通常包含 private 数据成员和 public 成员函数接口。
struct 数据聚合 (Data Aggregation) 用于定义简单的数据结构(Plain Old Data, POD)。主要用来组合相关的数据项,通常不包含复杂的逻辑或需要隐藏的状态。成员往往是公开的。

示例:


// 推荐使用 struct:简单的数据容器
struct Point {
    double x, y;
};

struct Config {
    std::string server;
    int port;
    bool debug;
};

// 推荐使用 class:需要封装和行为的对象
class BankAccount {
private:
    std::string owner;
    double balance;
public:
    void deposit(double amount);
    void withdraw(double amount);
    double getBalance() const;
};
  1. 功能上的等价性

需要强调的是,class 和 struct 在能力上是完全等价的:

两者都可以包含:
    成员变量(数据)
    成员函数(方法)
    构造函数和析构函数
    静态成员
    友元(friend)
    模板(template)
    虚函数(实现多态)
    继承(单继承、多继承)

你可以用 struct 写出完全封装的类:

struct Encapsulated {
private:
   int secret;
public:
   void setSecret(int s) { secret = s; }
   int getSecret() const { return secret; }
};

这个 struct 的行为与用 class 定义的类完全一样。

你也可以用 class 写出完全开放的结构体:


    class OpenData {
    public:
        int x, y, z;
    };

总结
特性 class struct
默认成员访问权限 private public
默认继承方式 private public
典型用途 面向对象、封装、复杂行为 数据聚合、简单结构体、POD
设计哲学 抽象、隐藏、安全性 简单、直接、透明

简单来说:

class 和 struct 的区别主要在于“默认设置”和“编程约定”。

    如果你想要一个封装良好的对象,用 class。
    如果你想要一个简单的数据集合,用 struct。

从技术上讲,你可以用其中一个做另一个能做的任何事,但遵循约定会让你的代码更清晰、更易理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值