C++ 中 struct 与 class 的用法与区别
1. 概述
在 C++ 中,struct 与 class 都可以用来定义用户自定义类型(User-Defined Types)。
二者在语法能力上几乎完全相同,都可以:
- 定义成员变量
- 定义成员函数
- 构造函数 / 析构函数
- 访问修饰符(public / private / protected)
- 继承、多态
- 模板化
唯一真正的语法差异只有两点:默认访问权限与默认继承方式不同。
2. struct 与 class 的唯二语法差异
2.1 默认成员访问权限不同
| 类型 | 默认成员权限 |
|---|---|
struct |
public |
class |
private |
示例:
struct A {
int x; // 默认 public
};
class B {
int x; // 默认 private
};
2.2 默认继承方式不同
| 继承类型 | 使用 struct | 使用 class |
|---|---|---|
| 默认继承方式 | public |
private |
示例:
struct Base {};
struct Derived1 : Base {}; // 默认 public 继承
class Base2 {};
class Derived2 : Base2 {}; // 默认 private 继承
3. struct 与 class 其他方面完全一致
以下方面 struct 与 class 完全没有语法区别:
- ✔ 可以定义成员函数
- ✔ 可以定义构造/析构函数
- ✔ 可以继承 / 多态
- ✔ 可以模板化
- ✔ 可以有 private/protected/public
- ✔ 都可以作为面向对象编程的基本构件
- ✔ 都可以用于封装数据与行为
示例:struct 一样可以有复杂行为:
struct Foo {
Foo() {}
void run() {}
private:
int data;
};
而 class 一样可以是纯数据载体:
class Point {
public:
int x;
int y;
};
4. 使用上的习惯(行业广泛遵循)
虽然语法等价,但开发中通常遵循以下约定:
4.1 struct 用于“数据结构”
特点:
-
成员默认 public,更适合公开的数据载体
-
更倾向于作为 POD(Plain Old Data)
-
常用于:
- 函数返回结构体
- 配置参数
- 轻量数据结构
示例:
struct Vec3 {
float x, y, z;
};
4.2 class 用于“面向对象的封装”
特点:
-
成员多数为 private
-
强调封装性与行为逻辑
-
常用于:
- 对象抽象(Student、Car 等)
- 封装复杂行为
- 多态体系
示例:
class Student {
public:
void study();
private:
std::string name;
int age;
};
5. 使用注意事项
5.1 注意默认继承方式导致的 BUG
class Base {};
class Derived : Base {}; // 默认 private,会导致基类成员不可访问
若你期望 public 继承,一定要写:
class Derived : public Base {};
5.2 使用 struct + private 容易造成误解
虽然合法,但不符合常规阅读习惯:
struct Foo {
private:
int x; // 不推荐:struct+private 容易误导读者
};
5.3 struct 并不等于 POD(Plain Old Data)
POD 是否成立取决于类型特征,与是否为 struct/class 无关。
5.4 C 的 struct ≠ C++ 的 struct
C 语言的 struct:
- 不能有成员函数
- 不能有访问修饰符
- 不能继承
C++ 中 struct 和 class 完全等价,只是默认权限不同。
6. 示例代码总结
struct(适合“数据结构”)
struct PersonInfo {
std::string name;
int age;
double height;
};
class(适合“封装对象”)
class Person {
public:
Person(std::string name, int age) : name(name), age(age) {}
void introduce();
private:
std::string name;
int age;
};
7. 总结(面试高频答案)
C++ 中 struct 与 class 的唯二区别是:
- 默认成员权限不同:struct 默认 public,class 默认 private。
- 默认继承方式不同:struct 默认 public 继承,class 默认 private 继承。
除此之外二者完全一致。
struct 多用于数据载体,class 多用于封装对象行为,这是编码习惯而非语法规定。
浙公网安备 33010602011771号