实现类似vector部分功能的动态数组类部分,注意写c++模板的时候,模板类的声明和实现都要写在头文件中,不能分开写。
#pragma once
#include <cassert>
template<class T>
class Array
{
private:
T *list;
int size;
public:
Array(int sz = 50);//构造函数
Array(const Array<T>& x);//复制构造函数
~Array();//析构函数
Array<T>& operator = (const Array<T>&rhs);//重载 = 运算符,使数组对象可以整体赋值,返回值为引用才是可以修改的左值
T& operator [] (int i);//重载 [] 运算符,使得Array对象起到普通数组的作用
const T& operator [] (int i) const;//重载 [] 运算符,[]针对const的重载
operator T* ();//重载到T*类型的转换
operator const T* () const;//到T*类型转换操作符针对const的重载
int getSize() const;//取数组的大小
void resize(int sz);//修改数组大小
};
//构造函数
template<class T>
Array<T>::Array(int sz) {
assert(sz >= 0);
size = sz;
list = new T[size];
}
//复制构造函数
template<class T>
Array<T>::Array(const Array<T>& x) {
size = x.size;
list = new T[size];
for (int i = 0; i < size; i++) {
list[i] = x.list[i];
}
}
//析构函数
template<class T>
Array<T>::~Array() {
delete[]list;
}
//重载 = 运算符,用于整体复制
template<class T>
Array<T>& Array<T>::operator=(const Array<T>& rhs) {
if (&rhs != this) {
if (size != rhs.size) {
delete[]list;
size = rhs.size;
list = new T[size];
}
for (int i = 0; i < size; i++)
list[i] = rhs.list[i];
}
return *this;
}
//重载 [] 运算符
template <class T>
T& Array<T>::operator [] (int i) {
assert(i >= 0 && i < size);
return list[i];
}
//重载 [] 运算符针对const常量
template<class T>
const T& Array<T>::operator [] (int i) const {
assert(i >= 0 && i < size);
return list[i];
}
//重载到T*类型的转换,就是直接用对象名访问
template<class T>
Array<T>::operator T*() {
return list;
}
//重载到T*类型的转换针对const常量
template<class T>
Array<T>::operator const T*() const {
return list;
}
//获取当前数组大小
template<class T>
int Array<T>::getSize() const {
return size;
}
//修改数组大小
template<class T>
void Array<T>::resize(int sz) {
assert(sz > 0);
if (sz == size)
return;
T* newlist = new T(sz);
int n = (sz < size) ? sz : size;
for (int i = 0; i < n; i++)
newlist[i] = list[i];
delete[]list;
list = newlist;
size = sz;
}