在C++中,class 和 struct 是两种定义用户自定义类型的关键词。它们在功能上极其相似,甚至可以说几乎完全等价,但存在几个关键的区别,主要体现在默认访问权限和编程范式/设计意图上。
以下是它们的主要区别:
- 默认访问权限 (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
};
- 默认继承权限 (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),这个默认行为就会被覆盖。
- 设计意图与编程范式 (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;
};
- 功能上的等价性
需要强调的是,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。
从技术上讲,你可以用其中一个做另一个能做的任何事,但遵循约定会让你的代码更清晰、更易理解。

被折叠的 条评论
为什么被折叠?



