目录
介绍:
分析:
实现:
.hpp框架创建
.hpp函数内容
有参构造
拷贝构造:
重载=
插入数据
删除数据
通过下标访问
获取数组大小
获取数组容量
析构函数
.cpp框架
int类型数据测试
char类型测试
总代码
.hpp代码
.cpp代码
介绍:
简单实现版本在这里:数组类模板(类模拟实现静态数组)(简单版)-CSDN博客
简单版本分析了案例要求怎么实现,对该项目的实现的思路有帮助哦
分析:
* 因为不可能把所有代码放在源文件,所以要创建头文件---->存放类模板的相关信息
* 因为用了类模板,所以在调用时才给类分配内存,因此不可以写成:.h文件中为类模板的声 明,.cpp中为类模板的实现,会报错
创建.hpp文件,存放类模板的声明和实现
实现:
.hpp框架创建
#pragma once/*头文件都要写这个哦,防止被重复包含,重复包含的弊端:编译阶段时编译器会将头文件全部展开放进源文件中,若重复包含,则头文件会被执行两次,占内存且耗时*/
#include <iostream>
using namespace std;
template<typename T>/*类模板*/
class MyArray
{
public:
private:
T* pAddress;
int m_Size;
int m_Capacity;
};
.hpp函数内容
有参构造
//有参构造
MyArray(int capacity)
{
this->m_Capacity = capacity;
this->m_Size = 0;
pAddress = new T[capacity];
}
拷贝构造:
//拷贝构造
MyArray(const MyArray& arr)
{
this->m_Capacity = arr.m_Capacity;
this->m_Size = arr.m_Size;
//浅拷贝
//this->pAddress = arr.pAddress;
//深拷贝
this->pAddress = new T[m_Capacity];//注意时m_Capacity,而不是m_Size
for (int i = 0; i < m_Size; i++)
this->pAddress[i] = arr.pAddress[i];
}
重载=
//重载=
MyArray& operator=(const MyArray& arr)//注意返回类型,如果是void,则在a = b = c时会出错,因为改变的不是本身的数据,而是拷贝对象的数据
{
//如果堆区有数据,要先释放再拷贝
if (pAddress != NULL)/**/
{
delete[] pAddress;
pAddress = NULL;
this->m_Capacity = 0;
this->m_Size = 0;
}
this->m_Capacity = arr.m_Capacity;
this->m_Size = arr.m_Size;
this->pAddress = new T[m_Capacity];
for (int i = 0; i < m_Size; i++)
this->pAddress[i] = arr.pAddress[i];
return *this;
}
插入数据
//插入
void MyInsert(T& e)
{
if (m_Size == m_Capacity)/**/
{
cout << "数组已存满" << endl;
return;
}
this->pAddress[m_Size] = e;
m_Size++;
}
删除数据
//删除
void MyDelet()
{
if (m_Size == 0)
{
cout << "数组已为空" << endl;
return;
}
m_Size--;
}
通过下标访问
//通过下标访问
//因为可能通过下标更改数据的值(a[0] = 100),所以要返回T&, 注意要是引用
T& operator[](int idx)
{
return this->pAddress[idx];
}
获取数组大小
//获取数组大小
int getSize()
{
return this->m_Size;
}
获取数组容量
//获取数组容量
int getCapacity()
{
return this->m_Capacity;
}
析构函数
//析构函数
~MyArray()
{
if (pAddress != NULL)/*防止重复释放*/
{
delete[] pAddress;
pAddress = NULL;
this->m_Capacity = 0;
this->m_Size = 0;
}
}
.cpp框架
#include "shu_zu_lei_mu_ban.hpp"/*头文件名称*/
//自己创建的头文件用""访问更快,是直接去该文件路径下面查找文件
//用<>是直接库函数下查找文件,当要查找库中的文件时,用<>快
int main()
{
return 0;
}
int类型数据测试
#include "shu_zu_lei_mu_ban.hpp"
//int数组
void PrintArr01(MyArray<int>& arr)
//注意参数中的类要写好类参数表<int>,因为类模板与函数模板不同,函数模板可以自动类型推导,而类模板不可
{
int size = arr.getSize();
for (int i = 0; i < size; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void test01()
{
MyArray<int>arr(10);
//放入数据
int size = arr.getCapacity();
for (int i = 0; i < size; i++)
{
arr.MyInsert(i);
}
//打印数组
PrintArr01(arr);
}
int main()
{
test01();
return 0;
}
char类型测试
#include "shu_zu_lei_mu_ban.hpp"
//char数组
void PrintArr02(MyArray<char>& arr)
{
int size = arr.getSize();
for (int i = 0; i < size; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void test02()
{
MyArray<char>arr(10);
//放入数据
arr.MyInsert('a');
arr.MyInsert('c');
arr.MyInsert('d');
arr.MyInsert('e');
//打印数组
PrintArr02(arr);
}
int main()
{
test02();
return 0;
}
大家可以去自定义类测试,这里我就不陈述了
总代码
.hpp代码
#pragma once/**/
#include <iostream>
using namespace std;
template<typename T>
class MyArray
{
public:
//有参构造
MyArray(int capacity)
{
this->m_Capacity = capacity;
this->m_Size = 0;
pAddress = new T[capacity];
}
//拷贝构造
MyArray(const MyArray& arr)
{
this->m_Capacity = arr.m_Capacity;
this->m_Size = arr.m_Size;
//浅拷贝
//this->pAddress = arr.pAddress;
//深拷贝
this->pAddress = new T[m_Capacity];//注意时m_Capacity,而不是m_Size
for (int i = 0; i < m_Size; i++)
this->pAddress[i] = arr.pAddress[i];
}
//重载=
MyArray& operator=(const MyArray& arr)//注意返回类型,如果是void,则在a = b = c时会出错,因为改变的不是本身的数据,而是拷贝对象的数据
{
//如果堆区有数据,要先释放再拷贝
if (pAddress != NULL)/**/
{
delete[] pAddress;
pAddress = NULL;
this->m_Capacity = 0;
this->m_Size = 0;
}
this->m_Capacity = arr.m_Capacity;
this->m_Size = arr.m_Size;
this->pAddress = new T[m_Capacity];
for (int i = 0; i < m_Size; i++)
this->pAddress[i] = arr.pAddress[i];
return *this;
}
//插入
void MyInsert(T e)
{
if (m_Size == m_Capacity)
{
cout << "数组已存满" << endl;
return;
}
this->pAddress[m_Size] = e;
m_Size++;
}
//删除
void MyDelet()
{
if (m_Size == 0)
{
cout << "数组已为空" << endl;
return;
}
m_Size--;
}
//通过下标访问
//因为可能通过下标更改数据的值(a[0] = 100),所以要返回T&, 注意要是引用
T& operator[](int idx)
{
return this->pAddress[idx];
}
//获取数组大小
int getSize()
{
return this->m_Size;
}
//获取数组容量
int getCapacity()
{
return this->m_Capacity;
}
//析构函数
~MyArray()
{
if (pAddress != NULL)/**/
{
delete[] pAddress;
pAddress = NULL;
this->m_Capacity = 0;
this->m_Size = 0;
}
}
private:
T* pAddress;
int m_Size;
int m_Capacity;
};
.cpp代码
#include "shu_zu_lei_mu_ban.hpp"
//int数组
void PrintArr01(MyArray<int>& arr)
{
int size = arr.getSize();
for (int i = 0; i < size; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void test01()
{
MyArray<int>arr(10);
//放入数据
int size = arr.getCapacity();
for (int i = 0; i < size; i++)
{
arr.MyInsert(i);
}
//打印数组
PrintArr01(arr);
}
//char数组
void PrintArr02(MyArray<char>& arr)
{
int size = arr.getSize();
for (int i = 0; i < size; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void test02()
{
MyArray<char>arr(10);
//放入数据
arr.MyInsert('a');
arr.MyInsert('c');
arr.MyInsert('d');
arr.MyInsert('e');
//打印数组
PrintArr02(arr);
}
int main()
{
//test01();
test02();
return 0;
}
题外话:
完结撒花~恭喜你又进步一点点啦~
如果你喜欢博主的话,用你的小手点点赞哦,点点收藏,如果想看博主的后序创作,可以点点关注哦
✨欢迎支持✨
🎈创作不易,麻烦点点赞哦🎈
博主主页:脑子不好的小菜鸟
该文章专栏:项目_脑子不好的小菜鸟的博客-CSDN博客
文章特点:关键点和步骤讲解放在代码相应位置,大多为算法和刷题文章