首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 實現動態數組:從零構建 Array 類

     編輯:C++ 入門

C++ 實現動態數組:從零構建 Array 類

動態數組是數據結構的基石。本文完整實現一個支援增刪改查、自動擴容、深拷貝的 Array 類,涵蓋構造/析構、運算符重載、記憶體管理等核心 C++ 特性。

類設計概覽

class Array {
public:
    // 四大函數
    Array(int size, int val = 0);           // 構造
    Array(const Array &array);              // 拷貝構造
    Array& operator=(const Array &array); // 賦值重載
    ~Array();                               // 析構

    // 運算符重載
    int operator[](int index) const;

    // 增刪改查
    void InsertAt(int index, int val);
    void PushBack(int val);
    void DeleteAt(int index);
    void SetAt(int index, int val);
    int GetAt(int index);
    void SetSize(int size);
    int GetSize();
    void printArray();

private:
    // 私有輔助方法
    void Init();
    void Free();
    bool isValidIndex(int index);
    void getMoreMemory();

    int *m_array;  // 動態陣列指針
    int m_size;    // 當前元素數
    int m_max;     // 當前容量
};

關鍵實現細節

記憶體管理

  • 擴容策略:容量不足時 m_max *= 2,分配新陣列,memcpy 複製數據,釋放舊陣列。
  • 深拷貝:拷貝構造與賦值運算符均分配新記憶體並逐元素複製,避免淺拷貝導致雙重釋放。
  • 自賦值檢查:賦值運算符首行 if (this != &array) 防止自我賦值崩潰。

插入與刪除

void InsertAt(int index, int val) {
    if (!isValidIndex(index)) { /* 錯誤處理 */ }
    if (m_size >= m_max) getMoreMemory();
    for (int i = m_size; i > index; --i)  // 從後向前移動
        m_array[i] = m_array[i - 1];
    m_array[index] = val;
    ++m_size;
}

void DeleteAt(int index) {
    if (!isValidIndex(index)) { /* 錯誤處理 */ }
    for (int i = index; i < m_size - 1; ++i)
        m_array[i] = m_array[i + 1];
    m_array[m_size - 1] = 0;
    --m_size;
}

下標運算符 operator[]

標記為 const,僅支援讀取;內部直接檢查邊界,非法則輸出錯誤並退出。

測試主程式與輸出

int main() {
    Array arr1(2);
    arr1.printArray();        // [0]0 [1]0
    arr1.InsertAt(1, 1);
    arr1.printArray();        // [0]0 [1]1 [2]0
    arr1.DeleteAt(1);
    Array arr2(arr1);         // 拷貝構造
    arr2.printArray();
    arr1.SetAt(1, 1);
    Array arr3 = arr1;        // 賦值運算符
    arr3.printArray();
    arr3.PushBack(2);
    cout << "size:" << arr3.GetSize() << endl;
    cout << "GetAt(2):" << arr3.GetAt(2) << endl;
    cout << "[2]:" << arr3[2] << endl;
    return 0;
}

進階優化方向

  • 使用 std::move 支援移動語義(C++11)。
  • 引入迭代器,兼容 STL 算法。
  • 模板化支援任意類型 template <typename T>。
  • 擴容因子可調(如 1.5 倍),平衡時間與空間。

手寫動態數組是理解 std::vector 內部機制的最佳途徑,建議讀者親自敲碼、單步調試,體會記憶體管理的每一步細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved