程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [C++]重載二維數組下標 [ ][ ]

[C++]重載二維數組下標 [ ][ ]

編輯:C++入門知識

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. 重載固定維數的二維數組下標

對於固定維數的二維數組下標重載,一般在像3D圖形方面經常涉及到一些平移轉換矩陣時用到,這裡以 4 * 4 的矩陣為例,實現代碼如下:

 

 

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. 重載維數可變的二維數組下標

對於可變的二維數組下標重載,在數組初始化時指定維數,之後可以像一般的二維數組進行賦值和取值操作,采用模板實現,代碼如下:

 

 

template 
class 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;
};

其中 operator[] 返回 T * const 類型是因為數組首地址是常量,防止非法的賦值操作,例如:

 

 

int arr1[3][4];
int arr2[3][4];
arr1[0] = arr2[0];           // ERROR!

 

測試賦值和取值操作:

 

Matrix m2(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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved