C++ 中的抽象
数据抽象是 C++ 面向对象编程中最核心、最重要的特性之一。抽象指的是仅向外界展示数据或功能的关键信息,而隐藏其内部实现细节。
举个现实生活中的例子:
司机开车时,只知道踩油门会加速、踩刹车会停车,但并不需要了解油门或刹车内部的机械结构、电路原理等细节。这种“只关心接口,不关心实现”的思想就是抽象。
抽象的分类:
- 数据抽象:只暴露与数据相关的必需信息,其余细节全部隐藏。
- 控制抽象:只暴露与实现流程相关的必需信息,其余细节全部隐藏。
使用访问限定符实现抽象
访问限定符是 C++ 实现抽象的“顶梁柱”。我们可以利用它们对类成员施加访问限制:
- public(公有)成员:可被程序中的任何代码访问。
- private(私有)成员:只能在本类内部被访问,任何外部代码均不可直接触碰。
借助这两条规则,抽象就能很自然地落地:
把描述对象内部实现细节的变量/函数标为 private;
把需要暴露给外界的关键接口标为 public;
由于 public 成员同属一类,它们随时可以访问 private 成员,从而既隐藏了实现,又提供了功能。
使用 abstract 关键字实现抽象(C++ 版说明)
C++ 没有像 Java、C# 那样的 abstract 关键字。
若想“用 abstract 思想”实现抽象,只能靠抽象类——即包含纯虚函数的类。
示例:(下面给出的代码并未真正用到抽象类,只是用私有数据 + 公有接口展示了最基本的封装/抽象思想。)
#include <iostream>
using namespace std;
class implementAbstraction {
private:
int a, b; // 外部无法直接访问
public:
// 公有接口:设置私有数据
void set(int x, int y) {
a = x;
b = y;
}
// 公有接口:显示私有数据
void display() {
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
};
int main() {
implementAbstraction obj;
obj.set(10, 20); // 只能通过接口操作
obj.display();
return 0;
}
a = 10
b = 20
可以看到:
变量 a、b 被声明为 private,外部代码不能直接访问;
用户只能通过 set() 和 display() 这两个公有接口间接操作数据——这就是数据抽象的核心思想。