类的基本思想是 数据抽象(data abstraction) 和 封装(encapsulation)。
数据抽象是一种依赖于 接口(interface) 和 实现(implementation) 分离的编程技术。
类的接口包括用户所能执行的操作;类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。
7.1 定义抽象数据类型
封装实现了类的接口和实现的分离。
类要想实现数据抽象和封装,需要首先定义个抽象数据类型(abstract data type)。
7.1.1 设计 Sales_data 类
Sales_data 的接口应包含以下操作:
- 一个 isbn 成员函数,用于返回对象的 ISBN 编号
- 一个 combine 成员函数,用于将一个 Sales_data 对象加到另外一个对象上
- 一个名为 add 的函数,执行两个 Sales_data 对象的加法
- 一个名为 read 的函数,将数据从 istream 读入到 Sales_data 对象中
- 一个 print 函数,将 Sales_data 对象的值输出到 ostream
使用改进的 Sales_data 类
Sales_data total; // 保存当前求和结果的变量
if (read(cin, total)){
// 读入第一笔交易
Sales_data trans; // 保存下一条交易记录数据的变量
while(read(cin, trans)){
// 读入剩余的交易
if(total.isbn() == trans.isbn()) // 检查 isbn
total.combine(trans); // 更新变量 total 当前的值
else {
print(cout, total) << endl; // 输出结果
total = trans; // 处理下一本书
}
}
print(cout, total) << endl; // 输出最后一条交易
} else {
// 没有输入任何信息
cerr << "No data?" << endl; // 通知用户
}
7.1.2 定义改进的 Sales_data 类
定义和声明成员函数的方式与普通函数差不多。
成员函数的声明必须在类的内部,它的定义即可以在类的内部也可以在类的外部。作为接口组成部分的非成员函数,定义和声明都在类的外部。
改进的 Sales_data 类如下所示:
struct Sales_data {
// 新成员:关于 Sales_data 对象的操作
std::string isbn() const {
return bookNo; }
// std::string isbn() const { return this->bookNo;} // 也可以这么定义
Sales_data& combine(