c ++ class generic array package

0x00 dynamic array (array length of the telescopic)

#pragma once
#ifdef ARRAY_H
#define ARRAY_H
template <class T>	//数组模板定义
class Array {
private:
	T* list;	//存放动态分配的数组内存首地址
	int size;	//数组长度
public:
	Array(int sz = 50);		//构造函数
	Array(const Array<T>& arr);	//复制构造函数
	~Array();	//析构函数
	Array<T>& operator = (const Array<T>& rhs);	//重载“=”
	T& operator [] (int i);	//重载“[]”
	const T& operator [] (int i) const;	//重载“[]”常函数
	operator T * ();	//重载到T * 类型的转换
	operator const T* () const;	//重载到T * 类型的常转换
	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() {
	delete[] list;
}
//浅复制
template<class T> Array<T>& Array<T>::operator=(const Array<T>& rhs)
{
	if (&rhs != this) {
		//如果本对象中数组大小与rhs大小不同,要重新构造数组
		if (size != rhs.size)
		{
			delete[] list;
			size = rhs.size;
			list = new T[size];
		}
		//从对象x复制数组元素到本对象
		for (int i = 0; i< size; i++)
		{
			list[i] = rhs.list[i];
		}
		return *this;	//返回当前对象的引用
	}
	// TODO: 在此处插入 return 语句
}
//下标运算符重载
template<class T> T& Array<T>::operator[](int i)
{
	assert(n >= 0 && n < size);
	return list[i];
}
template<class T> const T& Array<T>::operator[](int i) const
{
	assert(n >= 0 && n < size);
	return list[i];
}
//重载指针运算符,将Array类的对象转换为T类型的指针
// 不指定指针返回类型
template<class T> Array<T>::operator T * ()
{
	return list;
}
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;
}
//深克隆
template <class T> Array<T>::Array(const Array<T>& arr) {
	size = arr.size;
	list = new T[size];
	for (int i = 0; i < size; i++) {
		list[i] = a.list[i];	//对每一个数组元素赋值,进行深度复制
	}
}

//常引用只能读,不能写
//左值是引用指针,右值是值本身

#endif


Published 17 original articles · won praise 1 · views 10000 +

Guess you like

Origin blog.csdn.net/TowerOs/article/details/103949821