C++中class默认private、struct默认public是为了兼容C的struct语义并体现面向对象封装需求;private保护数据不被非法修改,public提供受控接口,protected仅限子类访问以支持安全继承。

为什么 class 默认是 private,而 struct 默认是 public
因为 C++ 要兼容 C 的 struct 语义。C 中的 struct 本就是“公开数据容器”,没有封装概念;而 C++ 引入 class 是为了支持面向对象,必须默认封闭实现细节。所以:
– 用 class 定义时,所有未加修饰的成员自动归为 private(哪怕你忘了写);
– 用 struct 定义时,未加修饰的成员默认是 public,保持与 C 的二进制兼容和行为一致。
这个差异不是风格偏好,而是语言设计层面的硬性约定——漏写访问修饰符时,class 和 struct 行为完全不同,容易引发隐蔽 bug。
private 不是“不让用”,而是“不让你绕过接口乱改”
很多新手把 private 当成障碍,其实它是保护机制。比如银行账户类里,balance 设为 private 后,外部不能直接写 account.balance = -1000;但可以通过 deposit() 或 withdraw() 这类 public 方法来操作,这些方法内部能校验金额合法性、记录日志、触发通知等。
– 直接暴露 public 成员变量,等于放弃所有业务约束;
– 把数据设为 private,再配一组受控的 public 接口,才能保证对象始终处于合法状态;
– 一旦后期要加审计、限流、异步更新等逻辑,改接口就行,调用方完全无感。
protected 的真实用途:只给子类留后门,不对外开门
protected 不是“半公开”,而是“继承专用通道”。它解决的是这样一个问题:基类有些数据或函数,子类需要复用或定制,但又不能让外界随意访问。
– 比如 Animal 类有个 healthLevel,子类 Dog 需要在 bark() 里根据该值调整音量,但它不该被用户通过 animal.healthLevel 直接读写;
– 若设为 private,子类无法访问,只能重复实现或暴露无意义的 getHealth();
– 若设为 public,用户可随意篡改,破坏封装;
– 所以用 protected,既满足继承链内协作,又守住对外边界。
注意:protected 成员在子类中只能通过子类对象的基类部分访问,不能通过任意基类对象访问——这是编译器强制的隔离,常被忽略。
三种权限一起用,才构成完整的封装契约
单靠一种权限没法支撑实际类设计:
– private 封装核心数据和辅助逻辑(如校验、缓存、内部状态管理);
– public 提供稳定、语义清晰的对外接口(构造/析构、增删查改、事件触发);
– protected 仅在明确需要被继承扩展时启用,且必须配合文档说明“此成员供派生类重写/调用”,否则会变成隐式 API,后续修改极易破环子类。
最容易被忽视的点是:权限不是静态标签,而是随类的角色变化的。同一个字段,在基类中可能是 protected,在最终派生类中可能根本不需要暴露——权限选择必须跟着职责走,而不是凭感觉填空。
立即学习“C++免费学习笔记(深入)”;


















