笔记 / 返回列表

编程语言

C++ 类、对象与访问控制基础

用一个最小示例区分 class 与 struct 的默认访问权限,并说明 public、private、protected 和继承的接口边界。

问题
用一个最小示例区分 class 与 struct 的默认访问权限,并说明 public、private、protected 和继承的接口边界。
环境
C++ · 面向对象 · class · struct
状态
待发布
首次发布
2026年4月7日
最后更新
2026年8月10日
预计阅读
2 分钟

生命周期说明(2026-08-10):本文由 2026 年的入门学习记录整理而来,保留基础概念与可验证示例。它不覆盖资源管理、模板、并发或现代 C++ 的完整工程实践;涉及具体语言版本时,应以当前编译器和标准文档为准。

class 与 struct

两者都能定义数据成员、成员函数、构造函数和继承关系。最常用的区别是默认访问权限:

  • class 的成员和基类默认是 private;
  • struct 的成员和基类默认是 public。

因此,单纯承载公开数据的类型常使用 struct;需要明确封装边界的类型常使用 class。这只是约定而不是硬性规则。

struct Point {
int x = 0; // 默认 public
int y = 0;
};
class Counter {
int value_ = 0; // 默认 private
public:
void increment() { ++value_; }
int value() const { return value_; }
};
int main() {
Point point{1, 2};
Counter counter;
counter.increment();
return point.x + counter.value();
}

访问说明符

public、private 和 protected 定义的是源码层面的访问边界:

  • public 成员构成类型对外提供的接口;
  • private 成员只能由该类的成员函数和友元直接访问;
  • protected 成员可由该类及其派生类访问,但不能由普通外部代码直接访问。

访问控制有助于防止调用方依赖内部表示。例如,Counter 可以把 int 换成其他实现,而只要 increment() 与 value() 的契约不变,调用方通常不需要修改。

访问控制不是运行时安全机制,也不能替代输入校验、权限控制或线程同步。

继承时的可见性

继承方式会影响基类的 public 与 protected 成员在派生类接口中的可见程度:

  • public 继承通常表示“派生类是一种基类”,基类的公开接口仍保持公开;
  • protected 与 private 继承会分别收紧这些成员对外的可见性;
  • 不论使用哪种继承方式,基类的 private 成员都不能被派生类直接访问。

是否使用继承应从替换关系和接口设计出发。仅为复用实现时,组合往往比继承更容易控制依赖边界。

下一步

在掌握访问控制后,可继续练习构造与析构、const 成员函数、资源所有权,以及用编译器警告和小型测试验证接口约束。网络程序中的对象生命周期与错误处理可参阅本站的 Linux TCP Socket 基础。

SEARCH / QUICK JUMP

搜索工程档案

↑↓ 选择 · Enter 打开 · Esc 关闭