?? 9_3.h
字號(hào):
//9-3.h
#ifndef ARRAY_CLASS
#define ARRAY_CLASS
#include <iostream>
#include <cstdlib>
#ifndef NULL
const int NULL = 0;
#endif // NULL
//錯(cuò)誤類型集合,共有三種類型的錯(cuò)誤:數(shù)組大小錯(cuò)誤、內(nèi)存分配錯(cuò)誤和下標(biāo)越界
enum ErrorType
{invalidArraySize, memoryAllocationError, indexOutOfRange};
//錯(cuò)誤信息
char *errorMsg[] =
{
"Invalid array size", "Memory allocation error",
"Invalid index: "
};
//數(shù)組類模板聲明
template <class T>
class Array
{
private:
T* alist; //T類型指針,用于存放動(dòng)態(tài)分配的數(shù)組內(nèi)存首地址
int size; //數(shù)組大小(元素個(gè)數(shù))
void Error(ErrorType error,int badIndex=0) const; // 錯(cuò)誤處理函數(shù)
public:
Array(int sz = 50); //構(gòu)造函數(shù)
Array(const Array<T>& A); //拷貝構(gòu)造函數(shù)
~Array(void); //析構(gòu)函數(shù)
Array<T>& operator= (const Array<T>& rhs); //重載"="使數(shù)組對(duì)象可以整體賦值
T& operator[](int i); //重載"[]",使Array對(duì)象可以起到C++普通數(shù)組的作用
operator T* (void) const; //重載T*,使Array對(duì)象可以起到C++普通數(shù)組的作用
int ListSize(void) const; // 取數(shù)組的大小
void Resize(int sz); // 修改數(shù)組的大小
};
//以下為類成員函數(shù)的定義
//模扳函數(shù)Error實(shí)現(xiàn)輸出錯(cuò)誤信息的功能
template <class T>
void Array<T>::Error(ErrorType error, int badIndex) const
{
//由于頭文件有可能被許多其它源程序文件包含,因此不以將std名名空間中的全部
//標(biāo)識(shí)符引入當(dāng)前命名空間,也就是說不宜使用"using namespace std;"。
//為了使用std命名空間中的標(biāo)識(shí)符,如cout,這里使用了"std::"
std::cout << errorMsg[error]; //根據(jù)錯(cuò)誤類型,輸出相應(yīng)的錯(cuò)誤信息
if (error == indexOutOfRange)
std::cout << badIndex; //如果是下標(biāo)越界錯(cuò),輸出錯(cuò)誤的下標(biāo)
std::cout << endl;
exit(1);
}
//構(gòu)造函數(shù)
template <class T>
Array<T>::Array(int sz)
{
if (sz <= 0) //sz為數(shù)組大小(元素個(gè)數(shù)),若小于0,則輸出錯(cuò)誤信息
Error(invalidArraySize);
size = sz; // 將元素個(gè)數(shù)賦值給變量size
alist = new T[size]; //動(dòng)態(tài)分配size個(gè)T類型的元素空間
if (alist == NULL) //如果分配內(nèi)存不成功,輸出錯(cuò)誤信息
Error(memoryAllocationError);
}
// 析構(gòu)函數(shù)
template <class T>
Array<T>::~Array(void)
{ delete [] alist; }
// 拷貝構(gòu)造函數(shù)
template <class T>
Array<T>::Array(const Array<T>& X)
{
//從對(duì)象X取得數(shù)組大小,并賦值給當(dāng)前對(duì)象的成員
int n = X.size;
size = n;
//為對(duì)象申請(qǐng)內(nèi)存并進(jìn)行出錯(cuò)檢查
alist = new T[n]; // 動(dòng)態(tài)分配n個(gè)T類型的元素空間
if (alist == NULL) //如果分配內(nèi)存不成功,輸出錯(cuò)誤信息
Error(memoryAllocationError);
// 從對(duì)象X復(fù)制數(shù)組元素到本對(duì)象
T* srcptr = X.alist; // X.alist是對(duì)象X的數(shù)組首地址
T* destptr = alist; // alist是本對(duì)象中的數(shù)組首地址
while (n--) // 逐個(gè)復(fù)制數(shù)組元素
*destptr++ = *srcptr++;
}
// 重載"="運(yùn)算符,將對(duì)象rhs賦值給本對(duì)象。實(shí)現(xiàn)對(duì)象之間的整體賦值
template <class T>
Array<T>& Array<T>::operator= (const Array<T>& rhs)
{
int n = rhs.size; // 取rhs的數(shù)組大小
//如果本對(duì)象中數(shù)組大小與rhs不同,則刪除數(shù)組原有內(nèi)存,然后重新分配
if (size != n)
{
delete [] alist; // 刪除數(shù)組原有內(nèi)存
alist = new T[n]; // 重新分配n個(gè)元素的內(nèi)存
if (alist == NULL) //如果分配內(nèi)存不成功,輸出錯(cuò)誤信息
Error(memoryAllocationError);
size = n; //記錄本對(duì)象的數(shù)組大小
}
// 從rhs向本對(duì)象復(fù)制元素
T* destptr = alist;
T* srcptr = rhs.alist;
while (n--)
*destptr++ = *srcptr++;
return *this; // 返回當(dāng)前對(duì)象的引用
}
// 重載下標(biāo)運(yùn)算符,實(shí)現(xiàn)與普通數(shù)組一樣通過下標(biāo)訪問元素,并且具有越界檢查功能
template <class T>
T& Array<T>::operator[] (int n)
{
if (n < 0 || n > size-1) // 檢查下標(biāo)是否越界
Error(indexOutOfRange,n);
return alist[n]; // 返回下標(biāo)為n的數(shù)組元素
}
//重載指針轉(zhuǎn)換運(yùn)算符,將Array類的對(duì)象名轉(zhuǎn)換為T類型的指針,
//指向當(dāng)前對(duì)象中的私有數(shù)組。
//因而可以象使用普通數(shù)組首地址一樣使用Array類的對(duì)象名
template <class T>
Array<T>::operator T* (void) const
{
return alist; // 返回當(dāng)前對(duì)象中私有數(shù)組的首地址
}
//取當(dāng)前數(shù)組的大小
template <class T>
int Array<T>::ListSize(void) const
{
return size;
}
// 將數(shù)組大小修改為sz
template <class T>
void Array<T>::Resize(int sz)
{
if (sz <= 0) // 檢查是否sz<= 0
Error(invalidArraySize);
if (sz == size) // 如果指定的大小與原有大小一樣,什么也不做
return;
T* newlist = new T[sz]; // 申請(qǐng)新的數(shù)組內(nèi)存
if (newlist == NULL) // 測(cè)試申請(qǐng)內(nèi)存是否申請(qǐng)成功
Error(memoryAllocationError);
int n = (sz <= size) ? sz : size; // 將sz與size中較小的一個(gè)賦值給n
// 將原有數(shù)組中前n個(gè)元素復(fù)制到新數(shù)組中
T* srcptr = alist; // 原數(shù)組alist的首地址
T* destptr = newlist; // 新數(shù)組newlist的首地址
while (n--) // 復(fù)制數(shù)組元素
*destptr++ = *srcptr++;
delete[] alist; // 刪除原數(shù)組
alist = newlist; // 使alist 指向新數(shù)組
size = sz; // 更新size
}
#endif // ARRAY_CLASS
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -