在 C++ 中,class
和 struct
的核心区别仅在于 默认访问权限 和 默认继承方式,其他特性完全一致。以下是详细对比:
一、核心区别
特性 | class | struct |
---|---|---|
默认成员访问权限 | private | public |
默认继承方式 | private | public |
示例 1:默认访问权限
class MyClass {
int x; // 默认为 private
public:
void foo() {}
};
struct MyStruct {
int x; // 默认为 public
void foo() {}
};
示例 2:默认继承方式
class Base {};
class Derived : Base {}; // 默认 private 继承
struct Derived : Base {}; // 默认 public 继承
二、其他行为完全一致
以下特性在 class
和 struct
中表现一致:
- 支持成员函数、构造函数、析构函数
- 支持继承和多态
- 支持模板、友元、运算符重载
- 支持静态成员、虚函数、访问控制符(public/private/protected)
- 内存对齐、大小计算规则相同
三、使用场景约定(非语法强制)
1. struct
的典型用途
- 数据聚合:表示一组数据的集合(类似 C 的结构体)。
struct Point {
int x;
int y;
}; // 直接通过 p.x 访问
- POD 类型(Plain Old Data):兼容 C 的内存布局。
- 模板元编程:特化模板时默认 public 更方便。
template<typename T>
struct TypeTraits {
static const bool isPointer = false;
};
2. class
的典型用途
- 对象封装:需要隐藏数据、暴露接口的复杂类型。
class BankAccount {
double balance; // 私有数据
public:
void deposit(double amount) { /* 逻辑 */ }
};
- 多态继承:基类通常用
class
强调接口抽象。
四、代码风格建议
- 明确写出访问控制符(即使默认符合预期):
struct MyStruct {
public: // 显式声明,避免歧义
int x;
private:
int y;
};
- 统一继承方式:始终显式指定
public/private
,不依赖默认值:
class Derived : public Base {}; // 明确继承方式
五、底层实现完全一致
编译器对 class
和 struct
的处理没有区别,以下代码生成的汇编完全相同:
class A { int x; }; // 默认 private
struct B { int x; }; // 默认 public
总结
- 语法区别:仅默认访问权限和继承方式不同。
- 设计意图:
- 用
struct
强调数据公开(如坐标点、配置参数)。 - 用
class
强调数据封装(如银行账户、网络连接)。
- 用
- 代码一致性:团队应统一约定使用风格。