C++的逐层抽象:从结构体到类、模板

C++在C的面向过程概念的基础上提供了面向对象和模板(泛型编程)的语法功能 。
下面以一个简单实例(动态数组的简单封装,包括下标的值可以是任意正数值,并提供边界检查)来说明C++是如何实现其逐层抽象的 。
1 用结构体实现
// array.h// array库的接口#ifndef _array_h#define _array_h// 可指定下标范围的数组的存储struct DoubleArray{int low;int high;double *storage;};// 根据low和high为数组分配空间 。分配成功,返回值为true,否则返回值为falsebool initialize(DoubleArray &arr, int low, int high);// 设置数组元素的值// 返回值为true表示操作正常,返回值为false表示下标越界bool insert(const DoubleArray &arr, int index, double value);// 取数组元素的值// 返回值为true表示操作正常,返回值为false表示下标越界bool fatch(const DoubleArray &arr, int index, double &value);// 回收数组空间void cleanup(const DoubleArray &arr);#endif// array.cpp// array库的实现#include "array.h"#include <IOStream>using namespace std;// 根据low和high为数组分配空间 。分配成功,返回值为true,否则返回值为falsebool initialize(DoubleArray &arr, int low, int high){arr.low = low;arr.high = high;arr.storage = new double [high - low + 1];if (arr.storage == NULL)return false;elsereturn true;}// 设置数组元素的值// 返回值为true表示操作正常,返回值为false表示下标越界bool insert(const DoubleArray &arr, int index, double value){if (index < arr.low || index > arr.high)return false;arr.storage[index - arr.low] = value;return true;}// 取数组元素的值// 返回值为true表示操作正常,返回值为false表示下标越界bool fatch(const DoubleArray &arr, int index, double &value){if (index < arr.low || index > arr.high)return false;value = https://www.isolves.com/it/cxkf/yy/C/2021-10-18/arr.storage[index - arr.low] ;return true;}// 回收数组空间void cleanup(const DoubleArray &arr){if (arr.storage)delete [] arr.storage; }// arrayApp.cpp// array库的应用示例#include using namespace std;#include "array.h"int main() { DoubleArray array;// DoubleArray是array库中定义的结构体类型double value; int low, high, i;//输入数组的下标范围 cout <<"请输入数组的下标范围:"; cin >> low >> high;//初始化数组array,下标范围为20到30 if (!initialize(array, low, high)) {cout <<"空间分配失败" ; return 1;}for (i = low; i <= high; ++i) {// 数组元素的输入cout <<"请输入第"<< i <<"个元素:";cin >> value;insert(array, i, value);// 将value存入数组array的第i个元素}while (true) {// 读取第i个元素cout <<"请输入要读取的元素序号(0表示结束):";cin >> i;if (i == 0)break;if (fatch(array, i, value))cout << value << endl;elsecout <<"下标越界n";}cleanup(array);//回收存储数组元素的空间return 0;}相关的函数全部有一个结构体函数参数,来操作结构体 。通过头文件包括结构体和函数声明来实现模块化并提供接口,实现一个较松散的数据与函数的结合 。
而类则不同,类除了提供数据聚合的结构体功能以外,还可以将函数封装进去,通过类名实现名字空间,并为成员函数提供一个隐含的指向类对象的this指针,使其成员函数能够访问并操作数据成员 。
2 用一个不完整的类来模拟结构体实现
// array.h// 改进后的array接口#ifndef _array_h#define _array_hstruct DoubleArray{int low;int high;double *storage;// 根据low和high为数组分配空间 。分配成功,返回值为true,否则返回值为falsebool initialize(int lh, int rh);// 设置数组元素的值// 返回值为true表示操作正常,返回值为false表示下标越界bool insert(int index, double value);// 取数组元素的值// 返回值为true表示操作正常,返回值为false表示下标越界bool fatch(int index, double &value);// 回收数组空间void cleanup();};#endif// array.cpp// 改进后的array库的实现#include "array.h"#include <iostream>using namespace std;// 根据low和high为数组分配空间 。分配成功,返回值为true,否则返回值为falsebool DoubleArray::initialize(int lh, int rh){low = lh;high = rh;storage = new double [high - low + 1];if (storage == NULL)return false;else return true;}// 设置数组元素的值// 返回值为true表示操作正常,返回值为false表示下标越界bool DoubleArray::insert(int index, double value){if (index < low || index > high)return false;storage[index - low] = value;return true;}// 取数组元素的值// 返回值为true表示操作正常,返回值为false表示下标越界bool DoubleArray::fatch(int index, double &value){if (index < low || index > high)return false;value = https://www.isolves.com/it/cxkf/yy/C/2021-10-18/storage[index - low] ;return true;}//回收数组空间void DoubleArray::cleanup(){if (storage)delete [] storage; }// arrayapp.cpp// 改进后的array库的应用示例#include


推荐阅读