C++面试6——类和结构体的区别和使用场景
C++类(class
)和结构体(struct
)的区别和使用场景
核心区别
-
默认访问权限(最关键区别)
- 类 (
class
): 成员默认private
- 结构体 (
struct
): 成员默认public
class MyClass {int x; // 默认 private,外部无法访问 };struct MyStruct {int y; // 默认 public,外部可直接访问 };
- 类 (
-
默认继承权限
- 类 (
class
): 继承默认private
- 结构体 (
struct
): 继承默认public
class Base {}; class Derived : Base {}; // 等价于 private 继承struct BaseStruct {}; struct DerivedStruct : BaseStruct {}; // 等价于 public 继承
- 类 (
何时用 class
?
-
需要数据封装:隐藏内部状态,通过公共接口控制访问。
-
需要复杂行为:包含成员函数、构造函数、虚函数等。
-
实现面向对象特性:如多态、继承(尤其是私有/保护继承)。
-
示例场景:
class BankAccount { private:double balance; // 私有数据,外部不可直接修改 public:void deposit(double amount) { /* 验证逻辑 */ } // 安全操作接口virtual void display() const { /* 多态支持 */ } };
何时用 struct
?
-
纯数据聚合:仅包含数据字段,无复杂行为。
-
与C兼容:在C/C++混合编程中传递数据(确保无虚函数、无自定义构造/析构)。
-
临时数据容器:如返回多个值的辅助结构。
-
公开数据无风险:数据可直接读写,无需验证逻辑。
-
示例场景:
struct Point { // 仅需坐标数据int x; int y; };struct Config { // 配置参数集合int width;int height;bool fullscreen; };
编码惯例(重要!)
-
语义约定:
class
强调 封装 和 行为(对象的核心抽象)。struct
强调 数据聚合(被动数据结构)。
-
模板元编程:
template <typename T> struct TypeTraits { // 元编程中常用 struct(默认公有)static const bool isPointer = false; };
-
POD类型(Plain Old Data):
- 若需兼容C或内存布局控制(如网络传输),用
struct
确保无虚函数/继承。
- 若需兼容C或内存布局控制(如网络传输),用
面试点睛
- 不要死记硬背:强调设计意图(封装 vs 开放数据)。
- 澄清误区:技术上
class
和struct
几乎等价(仅默认权限不同),但约定不同。 - 举例反问:如面试官问“是否能用
struct
替代class
?” 可答:
“语法上可以,但会破坏封装性。若所有数据需公有,用struct
更直观;否则应用class
明确设计意图。”
总结表格
特性 | class | struct |
---|---|---|
默认访问权限 | private | public |
默认继承权限 | private | public |
典型用途 | 封装对象、复杂行为 | 数据聚合、简单容器 |
设计意图 | 隐藏实现、提供接口 | 公开数据、无操作逻辑 |
遵循这些原则,代码可读性和维护性会显著提升!