C++ 数据封装
C++ 数据封装
数据封装(Encapsulation) 是 面向对象编程(OOP) 的三大特性之一。它的核心思想是 把数据和操作数据的函数绑定在一起,并通过访问权限来保护数据。
也就是说,对象的内部状态对外部隐藏,只能通过类提供的接口访问。
实现方式
数据封装主要依赖类和访问控制符
public
: 对所有代码可见protected
: 对子类和本类可见private
: 仅对本类可见
封装示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
using namespace std;
class Student {
private:
string name; // 私有数据,外部无法直接访问
int age;
public:
// 构造函数
Student(string n, int a) : name(n), age(a) {}
// 公有接口:修改和访问数据
void setAge(int a) {
if (a > 0 && a < 150) {
age = a;
} else {
cout << "非法年龄!" << endl;
}
}
int getAge() const {
return age;
}
string getName() const {
return name;
}
};
int main() {
Student s("Alice", 20);
cout << s.getName() << " 的年龄是 " << s.getAge() << endl;
s.setAge(25); // ✅ 正确
cout << "更新后的年龄: " << s.getAge() << endl;
// s.age = -100; ❌ 错误,age 是 private
}
数据封装和数据抽象对比
特性 | 数据封装 | 数据抽象 |
---|---|---|
关注点 | 隐藏数据(内部状态保护) | 隐藏实现(只暴露接口) |
实现方式 | private/protected/public | 抽象类、虚函数 |
目的 | 防止外部随意修改数据 | 让用户只关心功能而非实现 |
举例 | private int age; + getter/setter | virtual void draw() = 0; |
封装是手段(保护数据),抽象是目的(简化接口)
本文由作者按照 CC BY 4.0 进行授权