C++数组类模板

封装一个数组类模板,数组中可以存任意类型数据。注释全在代码里。

#include <iostream>
using namespace std;

class Person
{
private:
    string p_name;
	float p_age = 0;
public:
	Person() {};//无参构造
	Person(float age, string name)//有参构造
	{
		this->p_age = age;//参数受保护,需要通过this指针来修改。
		this->p_name = name;
	}

	float getage()//获取年龄
	{
		return this->p_age;
	}
	string getname()//获取姓名
	{
		return this->p_name;
	}
};
 
template<class T>
class Array
{
private:
	int size;//数组大小
	int len = 0;//数组有效长度也就是元素个数
	T* point = NULL;//point指针用来指向空间(数组)首地址
public:	
    Array(){};
	Array(int size) //构造数组函数
	{
		this->size = size;
		this->len = 0;
		point = new T[this->size];
	}
	
	Array(const Array& array)//拷贝构造函数(深拷贝):如test1()里b(a1)的操作
	{
		this->size = array.size;
		this->len = array.len;
		this->point = new T[size];
		for (int i = 0; i < array.len; i++) 
		{
			point[i] = array.point[i];
		}
	}
	Array<T>& operator=(const Array<T>& array) //等号运算符重载:如test1()里c=b的操作
	{
		delete[]point;
		this->len = array.len;
		this->size = array.size;
		point = new T[array.size];
		for (int i = 0; i < len; i++) 
		{
			point[i] = array.point[i];
		}
		return *this;
	}
 
	void add(const T& elem)//尾插法:如test2()里把对象p2的数据放入数组里(arr.add(p2)),其实是放在p1后面
	{
		if (this->len == this->size) 
		{
			cout << "容量已满" << endl;
			return;
		}
		point[this->len++] = elem;
	}
 
	void remove()//尾删法
	{
		if (this->len > 0)this->len--;
		else cout << "容器为空" << endl;
	}
 
	T& operator[](int index)//通过下标索取元素:如test1里c.operator[](3),获取对象c里下标为3的数
	{
		return point[index];
	}
 
	int get_len()//获取长度
	{
		return this->len;
	}
	int get_size()//获取数组大小
	{
		return this->size;
	}
 
	~Array()
	{
		if (this->point != NULL) 
		{
			delete[]this->point;
			point = NULL;
		}
	}
};
 
template<class T>
ostream& operator<<(ostream &out,Array<T> &array)//输出对象里的参数时使用,如test()里cout<<a1,如果不让输出运算符重载就无法直接输出对象(注意在输出时对象参数已存入数组里)
{
	for (int i = 0; i < array.get_len(); i++) 
	{
		out << array[i] << " ";
	}
	out << endl;
	return out;
}

template<class T>
void printPerson(Array<T> &array)
{
	for (int i = 0; i < array.get_len(); i++)
	{
		cout << array[i].getage() << " " << array[i].getname() << endl;
	}
}
 
void test1()//普通数据类型
{
	class Array<int> a1(20);
	a1.add(3);
	a1.add(4);
	a1.add(6);
	a1.add(112);
	a1.add(50);
	class Array<int> b(a1);
	class Array<int> c;
	c = b;
	cout << a1;
	cout << a1.get_len() << " " << a1.get_size() << endl;
	
	c.remove();//删除存储对象c数组的末尾一个参数,让len减1
    cout << c.get_len() << " " << c.get_size() << endl;
    cout << c;
	cout << "c[3]=" << c.operator[](3) << endl;
}

void test2()//自定义数据类型,小数,整数,字符串存入数组并通过printPerson(arr)函数输出
{
	Array <Person>arr(20);
	
	Person p1(22,"Eric");
	Person p2(33, "Lisa");
	Person p3(12.8, "Tom");
	Person p4(34.3, "Sam");
 
	arr.add(p1);
	arr.add(p2);
	arr.add(p3);
	arr.add(p4);
 
	printPerson(arr);
}
 
int main()
{
	test1();
	test2();
	return 0;
}

运行结果

 

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值