c++动态二维数组的双下标运算符重载
实现双下标的方式对元素进行赋值和读取的操作两种方法:
方法一:创建两个类,一个是存储行的类Row,另一个就是二维数组矩阵类Matrix。
方法二:创建一个类,类中动态生成二维数组,但此方法使得二维数组中的元素不连续。
示例代码(数据类型以int型为例)
方法一:
1 #include <iostream> 2 using namespace std; 3 //--------------行类定义开始---------------------------------- 4 class Row 5 { 6 public: 7 Row(); 8 ~Row(); 9 int& operator[](int aindex);//行下标运算符重载。 10 static void setsize(int asize);//静态成员函数对row_size进行修改。 11 private: 12 int *base; 13 static int row_size;//静态数据成员用于记录行元素的个数。 14 }; 15 16 //静态数据成员默认值设为1. 17 int Row::row_size=1; 18 19 /*------------------------------------------------------------ 20 构造函数。 21 ------------------------------------------------------------*/ 22 Row::Row() 23 { 24 base=new int[row_size];//申请行内存。 25 } 26 /*------------------------------------------------------------ 27 析构函数。 28 ------------------------------------------------------------*/ 29 Row::~Row() 30 { 31 if (base) 32 { 33 delete []base;//释放内存。 34 } 35 } 36 /*------------------------------------------------------------ 37 操作目的:设置静态变量值。 38 函数参数:int型的变量。 39 ------------------------------------------------------------*/ 40 void Row::setsize(int asize) 41 { 42 if (asize>0) 43 { 44 row_size=asize; 45 } 46 } 47 /*------------------------------------------------------------ 48 操作目的:一维数组类的下标运算符重载 49 函数参数:下标值 aindex 50 返回值:数组元素的引用。 51 ------------------------------------------------------------*/ 52 int& Row::operator [](int aindex) 53 { 54 //若下标值大于元素个数,则终止程序。 55 if (aindex>=row_size) 56 { 57 exit(-1); 58 } 59 //返回该元素本身。 60 return base[aindex]; 61 } 62 //------------------行类定义结束,数组类定义开始----------------------------------------- 63 64 class Matrix 65 { 66 public: 67 Matrix(int arow=5,int acol=5);//默认创建5行5列的二维数组。 68 ~Matrix();//析构函数。 69 Row& operator[](int aindex);//二维数组的下标运算符重载。 70 private: 71 Row *base;//行类型的指针。 72 int height;//记录行的高度。 73 }; 74 Matrix::Matrix(int arow,int acol) 75 { 76 //将行数赋给height 77 height=arow; 78 //此处先设置Row类中的静态变量,再申请类型为Row的连续内存。 79 Row::setsize(acol); 80 base=new Row[height]; 81 } 82 Matrix::~Matrix() 83 { 84 if (base) 85 { 86 delete []base;//此处释放Row类型的指针,会自动调用Row类的析构函数,进而释放行元素的内存空间。 87 } 88 } 89 Row& Matrix::operator [](int aindex) 90 { 91 //若下标值大于元素个数,则终止程序. 92 if (aindex>=height) 93 { 94 exit(-1); 95 } 96 /*返回一个Row类型的对象, 97 用Row类的对象调用第二个下标值,再返回Row类中的元素。*/ 98 return base[aindex]; 99 }
总结:
第一种方法使得元素在内存中连续存储。回收内存时自动调用两个类的析构函数使得内存回收高效简洁。
第二种方法在下次贴出。