1. 分析
重載一維數組下標很簡單,通過下標傳入的索引值,返回內部數組中相應的值。那重載二維數組的下標運算呢?
其實重載二維和一維本質是一樣的,因為 C/C++ 中所謂的 “二維或多維數組”都是由簡單的一維數組表示的。舉個例子哈:
下面是兩個 int 數組,第(1)個是熟悉的一維數組,第(2)個是熟悉的二維數組,現在你要做的就是將第(2)個數組看成是一個一維數組。
(1)int array[3];
(2)int array[3][4];
怎麼看?可以在頭腦中將第(2)個數組數組看成如下定義的方式, 數組 array 包含 3 個元素,其中每個元素又都是一個數組類型(或者說是一個指針類型)。
typedef int T[4];
T array[3];
至於更高維數的數組,也是這樣看,比如如下的三維數組,可以采用下面的方式來定義。
int array[3][4][5];
typedef int T1[5];
typedef T1 T2[4];
T2 array[3];
由於實際中二維數組用的較多,所以,下面主要是練習二維數組的下標重載。那重載二維數組的下標有什麼好處呢?最大的好處就在於可以使代碼簡潔直觀。
我在網上也看到過一些別人的實現方法,其中在 文章(http://edu.gamfe.com/tutor/d/24416.html)中就提到了一種重載方法,使用一維數組來表示二維數組,這是大多數的實現方法,但是其實現過程過於復雜,其構建了兩個類,分別用來獲取行和列,然後計算出指定的二維下標對應的內部一維數組的值並返回。
下面介紹我自己寫重載二維下標實現方式,不一定最好,但比上面提到的方式要好。
2. 重載固定維數的二維數組下標
struct Matrix4f { float m[4][4]; float * const operator[](const int i) { return m[i]; } };
Matrix4f m; m[0][0] = 1.0f; m[1][1] = 9.9f; cout << m[0][0] << endl; // 1 cout << m[1][1] << endl; // 9.9
3. 重載維數可變的二維數組下標
templateclass Matrix { public: Matrix(int row, int col) :m_row(row), m_col(col), m_data(nullptr) { m_data = new T[m_row * m_col]; } ~Matrix() { if (m_data != nullptr) { delete[] m_data; m_data = nullptr; } } // 返回二維數組的第 k 行地址,注意加上 const 因為數組地址是不可變的 T * const operator[](int k) { return &m_data[k * m_col]; } private: int m_row; int m_col; T *m_data; };
int arr1[3][4]; int arr2[3][4]; arr1[0] = arr2[0]; // ERROR!
測試賦值和取值操作:
Matrixm2(3, 4); m2[0][0] = 2; m2[2][3] = 9; cout << m2[0][0] << endl; // 2 cout << m2[2][3] << endl; // 9
和一般的二維數組一樣沒有越界檢查,所以越界操作也是可以的,但是盡量使用前檢查索引是否越界,以免引發未知錯誤。
轉載請注明出處:http://blog.csdn.net/xiaohui_hubei/article/details/21334141