封装一个数组类模板,数组中可以存任意类型数据。注释全在代码里。
#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;
}
运行结果