動態數組是數據結構的基石。本文完整實現一個支援增刪改查、自動擴容、深拷貝的 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)。template <typename T>。手寫動態數組是理解 std::vector 內部機制的最佳途徑,建議讀者親自敲碼、單步調試,體會記憶體管理的每一步細節。