学而时习之:C++ 中的抽象

41 阅读2分钟

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

可以看到:
变量 ab 被声明为 private,外部代码不能直接访问
用户只能通过 set()display() 这两个公有接口间接操作数据——这就是数据抽象的核心思想。