?? array.h
字號:
#ifndef ARRAY_CLASS
#define ARRAY_CLASS
#include <stdlib.h>
template <class T>
class Array
{
private:
// 一個動態申請的包含 size 個元素的表
T *alist;
int size;
public:
// 構造函數和析構函數
Array(int sz = 50);
Array(const Array<T>& A);
~Array(void);
// 賦值,下標和指針轉換操作
Array<T>& operator= (const Array<T>& rhs);
T& operator[](int i);
operator T* (void) const;
// 有關表大小的函數
int ListSize(void) const; // 取表的大小
void Resize(int sz); // 修改表的大小
};
// 構造函數
template <class T>
Array<T>::Array(int sz)
{
// 檢查數組的大小參數是否合法
if (sz <= 0)
throw "Array::Array: Invalid array size";
size = sz;
alist = new T[size];
}
// 析構函數
template <class T>
Array <T>::~Array(void)
{
delete [] alist;
}
// 復制構造函數
template <class T>
Array <T>::Array(const Array<T> &A)
{
// 取得對象 A 的大小并將其賦值給當前對象
int n = A.size;
size = n;
// 為對象申請新內存并進行出錯檢查
alist = new T[n]; // 申請動態內存
T *srcptr = A.alist; // A.alist 的首地址
T *destptr = alist; // alist 的首地址
while (n--) // 拷貝表
*destptr++ = *srcptr++;
}
// 賦值操作,將 rhs 分配到當前對象
template <class T>
Array<T>& Array<T>::operator= (const Array<T>& rhs)
{
// 記錄 rhs 的大小
int n = rhs.size;
// 如果 sizes 不相同,刪除內存并重新分配
if (size != n)
{
delete [] alist; // 釋放原始內存
alist = new T[n]; // 分配新數組
size = n;
}
// 將數組項目從 rhs 拷貝到當前對象
T* destptr = alist;
T* srcptr = rhs.alist;
while (n--)
*destptr++ = *srcptr++;
// 返回當前對象的引用
return *this;
}
// 重載下標運算符
template <class T>
T& Array<T>::operator[](int n)
{
// 數據越界檢查
if (n < 0 || n > size - 1)
throw "Array::operator[]: invalid index";
// 從私有數組中返回元素值
return alist[n];
}
// 指針轉換運算符
template <class T>
Array<T>::operator T* (void) const
{
// 返回當前對象中私有數組的首地址
return alist;
}
template <class T>
int Array<T>::ListSize(void) const
{
return size;
}
// 調整數組大小運算符
template <class T>
void Array<T>::Resize(int sz)
{
// 檢查新的大小參數;若其小于等于0,則退出程序
if (sz <= 0)
throw "Array::Array: Invalid array size";
// 若大小不變,則簡單返回
if (sz == size)
return;
// 需申請新的內存;確認系統已分配所需內存
T *newlist = new T[sz];
// n 為需拷貝元素的個數
int n = (sz < size) ? sz : size;
// 從舊表中拷貝 n 個數組元素的新表
T* srcptr = alist; // alist 的首地址
T* destptr = newlist; // newlist 的首地址
while (n--) // 拷貝表
*destptr++ = *srcptr++;
// 刪除舊表
delete [] alist;
// 將 alist 指針指向 newlist 并改變大小值
alist = newlist;
size = sz;
}
#endif // ARRAY_CLASS
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -