C++类模板案例-实现一个通用的数组类

2023-12-14 00:22:13

案例中用到的方法

  1. 可以对内置数据类型以及自定义数据类型的数据进行存储
  2. 将数组中的数据类型存储到堆区
  3. 构造函数中可以传入数组的容量
  4. 提供对应的拷贝构造函数以及operator=防止浅拷贝问题
  5. 提供尾插法和尾删法对数组中的数据进行增加和删除
  6. 可以通过下标的方式访问数组中的元素
  7. 可以获取数组中当前元素个数和数组的容量

·myarray.hpp头文件

#define _CRT_SECURE_NO_DEPRECATE
#pragma once
#include<iostream>

using namespace std;

template<class T>
class Myarray
{
public:
	//构造函数
	Myarray(int capacity)
	{
		this->m_capacity = capacity;
		this->m_size = 0;
		paddress = new T[this->m_capacity];
	}

	//拷贝构造
	Myarray(const Myarray& arr)
	{
		this->m_capacity = arr.m_capacity;
		this->m_size = arr.m_size;
		this->paddress = new T[this->m_capacity];
		for (int i = 0; i < this->m_size; i++)
		{
			//如果T为对象,而且还包括指针,必须需要重载 = 操作符 ,因为这个等号不是 构造 而是赋值
			//普通类型可以 = 但是指针类型需要深拷贝
			this->paddress[i] = arr.paddress[i];
		}
	}

	//重载 = 操作符  防止浅拷贝问题
	Myarray& operator=(const Myarray& myarray)
	{
		if (this->paddress != NULL)
		{
			delete[] this->paddress;
			this->m_capacity = 0;
			this->m_size = 0;
		}
		this->m_capacity = myarray.m_capacity;
		this->m_size = myarray.m_size;
		this->paddress = new T[this->m_capacity];
		for (int i = 0; i < this->m_size; i++)
		{
			this->paddress[i] = myarray[i];
		}
		return *this;
	}

	//重载 [] 操作符  arr[0]
	T& operator [](int index)
	{
		return this->paddress[index];  //不考虑跨界,用户自己去处理
	}

	//尾插法
	void Push_back(const T& val)
	{
		if (this->m_capacity == this->m_size)
		{
			return;
		}
		this->paddress[this->m_size] = val;
		this->m_size++;
	}

	//尾删法
	void Pop_back()
	{
		if (this->m_size == 0)
		{
			return;
		}
		this->m_size--;
	}

	//获取数组容量
	int getCapacity()
	{
		return this->m_capacity;
	}

	//获取数组大小
	int getSize()
	{
		return this->m_size;
	}

	//析构
	~Myarray()
	{
		if (this->paddress != NULL)
		{
			delete[] this->paddress;
			this->paddress = NULL;
			this->m_capacity = 0;
			this->m_size = 0;
		}
	}

private:
	T* paddress;  //指向一个堆空间,这个空间存储真正的数据
	int m_capacity;  //容量
	int m_size;  //大小
};

·主函数

#include<iostream>
using namespace std;
#include<string>
#include "myarray.hpp"

void printintarray(Myarray<int>& arr)  //参数是拷贝构造函数
{
	for (int i = 0; i < arr.getSize(); i++) {
		cout << arr[i] << " ";
	}
	cout << endl;
}

//测试内置数据类型
void test01()
{
	Myarray<int> array1(10);
	for (int i = 0; i < 10; i++)
	{
		array1.Push_back(i);
	}
	cout << "array1打印输出:" << endl;
	printintarray(array1);
	cout << "array1的大小: " << array1.getSize() << endl;
	cout << "array1的容量: " << array1.getCapacity() << endl;

}

//测试自定义数据类型
class Person {
public:
	//Person() {};必须添加默认的构造函数,可能因为在创建数组的时候还需要传参
	//Person() {};
	Person(string name, int age)
	{
		this->mname = name;
		this->mage = age;
	}
public:
	string mname;
	int mage;
};

void printpersonintarray(Myarray<Person>& arrperson) //参数是拷贝构造函数
{
	for (int i = 0; i < arrperson.getSize(); i++) {
		cout <<"姓名:" << arrperson[i].mname << "年龄 :"<<arrperson[i].mage;
	}
	cout << endl;
}

void test02()
{
	//如果在定义构造函数时候没有写默认构造函数Person() {}
	// 则在编译类模板成员函数 Myarray<Person>::Myarray(int)时
	//创建数组
	Myarray<Person> parray(10);  //
	Person p1("hg", 20);
	Person p2("hg", 20);
	Person p3("hg", 20);
	Person p4("hg", 20);
	parray.Push_back(p1);
	parray.Push_back(p2);
	parray.Push_back(p3);
	parray.Push_back(p4);

	printpersonintarray(parray);
	cout << "parray的大小" << parray.getSize() << endl;
	cout << "parray的容量" << parray.getCapacity() << endl;

}

int main()
{
	test01();
	test02();
	return 0;
}


文章来源:https://blog.csdn.net/weixin_55741769/article/details/134984464
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。