阿狸先森|一文让你学完C++,干货收藏( 十 )


例如 , 程序可以调用 sort() 函数 , 而不需要知道函数中排序数据所用到的算法 。 实际上 , 函数排序的底层实现会因库的版本不同而有所差异 , 只要接口不变 , 函数调用就可以照常工作 。
在 C++ 中 , 我们使用类来定义我们自己的抽象数据类型(ADT) 。 可以使用类 iostream 的 cout 对象来输出数据到标准输出 , 如下所示:
实例
#include using namespace std; int main( ){cout << "Hello C++" <在这里 , 暂时不需要理解 cout 是如何在用户的屏幕上显示文本 。 只需要知道公共接口即可 , cout 的底层实现可以自由改变 。
访问标签强制抽象在 C++ 中 , 我们使用访问标签来定义类的抽象接口 。 一个类可以包含零个或多个访问标签:

  • 使用公共标签定义的成员都可以访问该程序的所有部分 。 一个类型的数据抽象视图是由它的公共成员来定义的 。
  • 使用私有标签定义的成员无法访问到使用类的代码 。 私有部分对使用类型的代码隐藏了实现细节 。
访问标签出现的频率没有限制 。 每个访问标签指定了紧随其后的成员定义的访问级别 。 指定的访问级别会一直有效 , 直到遇到下一个访问标签或者遇到类主体的关闭右括号为止 。
数据抽象的好处
数据抽象有两个重要的优势:
  • 类的内部受到保护 , 不会因无意的用户级错误导致对象状态受损 。
  • 类实现可能随着时间的推移而发生变化 , 以便应对不断变化的需求 , 或者应对那些要求不改变用户级代码的错误报告 。
如果只在类的私有部分定义数据成员 , 编写该类的作者就可以随意更改数据 。 如果实现发生改变 , 则只需要检查类的代码 , 看看这个改变会导致哪些影响 。
如果数据是公有的 , 则任何直接访问旧表示形式的数据成员的函数都可能受到影响 。
数据抽象的实例C++ 程序中 , 任何带有公有和私有成员的类都可以作为数据抽象的实例 。 请看下面的实例:
实例
#include using namespace std; class Adder{public:// 构造函数Adder(int i = 0){total = i;}// 对外的接口void addNum(int number){total += number;}// 对外的接口int getTotal(){return total;};private:// 对外隐藏的数据int total;};int main( ){Adder a;a.addNum(10);a.addNum(20);a.addNum(30);cout << "Total " << a.getTotal() <当上面的代码被编译和执行时 , 它会产生下列结果:
Total 60上面的类把数字相加 , 并返回总和 。 公有成员 addNum 和 getTotal 是对外的接口 , 用户需要知道它们以便使用类 。 私有成员 total 是用户不需要了解的 , 但又是类能正常工作所必需的 。
C++ 数据封装所有的 C++ 程序都有以下两个基本要素:
  • 程序语句(代码):这是程序中执行动作的部分 , 它们被称为函数 。
  • 程序数据:数据是程序的信息 , 会受到程序函数的影响 。
封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念 , 这样能避免受到外界的干扰和误用 , 从而确保了安全 。 数据封装引申出了另一个重要的 OOP 概念 , 即数据隐藏 。
数据封装是一种把数据和操作数据的函数捆绑在一起的机制 , 数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制 。
C++ 通过创建类来支持封装和数据隐藏(public、protected、private) 。 我们已经知道 , 类包含私有成员(private)、保护成员(protected)和公有成员(public)成员 。 默认情况下 , 在类中定义的所有项目都是私有的 。 例如
class Box{public:double getVolume(void){return length * breadth * height;}private:double length;// 长度double breadth;// 宽度double height;// 高度};


推荐阅读