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 }

总结:

  第一种方法使得元素在内存中连续存储。回收内存时自动调用两个类的析构函数使得内存回收高效简洁。

第二种方法在下次贴出。