1. 基本概念与差异
默认访问权限
在 C++ 的语义中,结构体(struct)与类(class)的核心差异来源于默认的成员访问控制。struct 的默认成员访问级别是 public,这意味着不显式指定访问修饰符时,成员对外部可见。反之,class 的默认成员访问级别是 private,需要显式添加 public/protected 以暴露接口,才能让外部使用。
这种差异直接影响到 API 的设计与封装边界。如果你只是需要一个简单的数据容器,struct 更贴近数据聚合的直观风格,便于外部直接访问字段。如果需要严格的封装与内部状态保护,则应优先考虑使用 class,并通过公有接口隐藏实现细节。
struct Point {int x;int y;
}; // public by defaultclass Person {int age; // private by default
public:Person(int a): age(a) {}int getAge() const { return age; }
};默认继承行为
在继承层面,struct 的默认继承方式是 public,而 class 的默认继承方式是 private。这意味着如果不显式指定继承修饰符,派生类型在访问基类时会遵循不同的可见性规则,影响成员的访问权限与接口暴露。
这一点决定了在设计层次结构时的选择:若希望保持简单的“向上兼容/对外暴露”的继承关系,struct 的默认公开继承更直观;若要实现更强的封装和对外部的控制,则使用 class,并显式设定继承方式和访问控制。
struct Base { int v; };
struct Derived : Base { void show() { /* ... */ } }; // public inheritance by defaultclass Base2 { int v; };
class Derived2 : Base2 { }; // private inheritance by default2. 选型指南与设计准则
何时使用 struct
当目标是简单的数据聚合或与 C 语言接口对齐时,使用 struct 更符合直观的语义。结构体通常用于“数据传输对象”或仅暴露数据字段的场景,便于在 API 边界上直接访问这些字段。
在需要最小开销的聚合类型、以及与 C 代码互操作时,struct 的默认公有成员可以减少额外的封装开销,提升数据布局的透明性。
// 与 C 语言互操作的一个示例
extern "C" {struct Vec3 { float x, y, z; };
}
何时使用 class
当需要严格的封装、数据隐藏以及对外暴露稳定接口时,应选用 class。通过将数据成员设为 private 或 protected,并提供公有的方法来访问和修改状态,可以实现更强的设计约束和可维护性。
在接口设计中,推荐把实现细节隐藏在私有成员中,同时提供清晰、稳定的公有接口(构造函数、访问器、行为方法等),以提升模块的可测试性和可扩展性。
class Account {
private:double balance;
public:Account(double b) : balance(b) {}double getBalance() const { return balance; }void deposit(double amt) { if (amt > 0) balance += amt; }
};3. 面试场景中的常见考点
常见问点与答题要点
在面试中,考官通常会聚焦于<默认访问、默认继承、以及在 API 设计中的<强>封装意图。对这三个要点的清晰解释,往往成为衡量候选人对 C++ 基础理解的关键。
一个简洁的回答框架包括:先说明结构体与类在语义上的差异,然后给出具体的默认行为(如默认访问与默认继承),最后结合设计场景给出选型理由和例子。
// 快速对比示例
struct S { int a; };
class C { int a; public: int getA() const { return a; } };
如何用简短的对比讲解给非技术背景的人
在面对非技术背景的听众时,可以用直观的比喻来说明:struct 更像是一个公开的数据框,字段对外开放;class 则像一个封装良好的对象,通过接口控制访问与修改,内部实现隐蔽。

一个简短的对比示例有助于沟通:你可以说“如果你只需要存放数值和简单数据结构,选 struct;如果你要实现复杂行为、保持数据一致性、并对外提供稳定接口,选 class。”
struct S { int a; }; // 公开字段
class C { private: int a; public: int getA() const { return a; } };
关键词回顾:默认访问、默认继承、封装设计。以上点在面试题中经常出现,掌握它们有助于快速作答。
这组内容围绕 C++中struct与class的区别与选型指南(面试题必看)展开,帮助理解在不同场景下如何进行合适的类型选择。


