当你开始学习C++的面向对象编程(OOP)时,struct和class是两个你无法绕过的关键字。它们都允许你将不同的数据类型打包在一起,创建一个自定义的“复合类型”。那么,它们之间到底有什么区别?很多人会说:“struct是C的,class是C++的”,或者“struct只能放数据,class可以放函数”。这些说法都不完全准确

在C++中,struct和class的真正区别,归根结底只有一个词:默认访问权限 (Default Access Specifier)

一、唯一的本质区别:public vs private

  • struct: 其成员的默认访问权限是 public(公开的)
    这意味着,如果你不明确指定,struct里的所有成员变量和成员函数,在外部都可以被直接访问。

  • class: 其成员的默认访问权限是 private(私有的)
    这意味着,如果你不明确指定,class里的所有成员变量和成员函数,在外部都是不可访问的,它们被保护了起来。

代码胜于雄辩:

#include <iostream>

struct PlayerStruct {
    // 未指定,默认为 public
    std::string name;
    int score;
};

class PlayerClass {
    // 未指定,默认为 private
    std::string name;
    int score;
};

int main() {
    PlayerStruct p_struct;
    p_struct.name = "StructPlayer"; // OK! 因为name是public
    p_struct.score = 100;           // OK! 因为score是public
    std::cout << "Struct Player: " << p_struct.name << std::endl;

    PlayerClass p_class;
    // p_class.name = "ClassPlayer"; // 编译错误!因为name是private,无法从外部访问
    // p_class.score = 100;          // 编译错误!因为score是private

    return 0;
}

上面的代码中,访问p_struct的成员完全没问题,但访问p_class的成员则会导致编译失败。这就是它们唯一的、本质的区别。

二、在C++中,struct能做的,class都能做,反之亦然

除了默认权限,struct和class在功能上几乎完全等价

  • struct可以有成员函数吗?可以!

  • struct可以有构造函数和析构函数吗?可以!

  • struct可以使用继承吗?可以!

你完全可以写一个功能上和class一模一样的struct,只要手动把所有成员都声明为private或public即可。

class MyClass {
public: // 手动设为public
    int data;
};

struct MyStruct {
    // 默认就是public
    int data;
};

// 上面两者在使用上完全一样

三、编程约定:我们应该如何选择?

既然功能一样,那我们平时该如何选择呢?在C++社区,有一个广泛遵循的编程约定,这比语法区别更重要:

  • 使用 struct:
    当你只是想把一堆纯数据(Plain Old Data, POD)打包在一起,而且这些数据不需要复杂的逻辑来保护时,就用struct。它强调的是数据的集合
    例子:

    struct Point {
        double x;
        double y;
        double z;
    };
    
    struct RGBColor {
        int r, g, b;
    };
  • 使用 class:
    当你创建的对象不仅有数据,还需要有行为(成员函数),并且需要通过封装(private)来保护其内部状态不被随意修改时,就用class。它强调的是数据与操作的统一信息隐藏。这是面向对象编程的核心思想
    例子:

    class BankAccount {
    private:
        double balance; // 余额是私有的,不能随便改
    public:
        void deposit(double amount); // 只能通过公共方法存款
        bool withdraw(double amount); // 只能通过公共方法取款
    };

总结

struct和class在C++中的唯一技术区别是默认访问权限。但更重要的是它们在设计思想上的约定:用struct来表示简单的数据集合,用class来构建需要封装和复杂行为的对象。遵循这个约定,能让你的代码意图更清晰,也更专业!👍

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐