C++ //模板案例-数组封装类

  1 //模板案例-数组封装类
  2 //描述
  3 //实现一个通用的数组类
  4 //1.可以对内置数据类型以及自定义数据类型的数据进行储存
  5 //2.将数组很脏的数据储存到堆区
  6 //3.构造函数中可以传入数组的容量
  7 //4.提供对应的拷贝构造函数以及operator=防止浅拷贝问题
  8 //5,提供尾插法和尾删法对数组中的数据进行增加和删除
  9 //6.可以通过下标的方式访问数组的元素
 10 //7.可以获取数组在当前元素个数和数组的容量
 11 
 12 #include <iostream>
 13 #include <string>
 14 #include<fstream>
 15 #include"MyArray.hpp"
 16 using namespace std;
 17 
 18 void printfIntArray(MyArray <int>&arr)
 19 {
 20     for (int i = 0; i < arr.getSize(); i++)
 21     {
 22         cout << arr[i] << endl;
 23     }
 24 }
 25 
 26 
 27 void test01()
 28 {
 29     MyArray <int>arr1(5);
 30 
 31     for (int i = 0; i < 5; i++)
 32     {
 33         //利用尾插法向数组中插入数据
 34         arr1.Push_Back(i);
 35     }
 36     cout << "arry1的打印输出为: " << endl;
 37     printfIntArray(arr1);
 38 
 39     cout << "arr1的容量为: " << arr1.getCapacity() << endl;
 40     cout << "arr1的大小为: " << arr1.getSize() << endl;
 41 
 42     
 43     cout << "arry2的打印输出为: " << endl;
 44     MyArray<int>arr2(arr1);
 45     printfIntArray(arr2);
 46 
 47     //尾删
 48     arr2.Pop_Back();
 49     cout << "arr2尾删后: " << endl;
 50 
 51     cout << "arr2的容量为: " << arr2.getCapacity() << endl;
 52     cout << "arr2的大小为: " << arr2.getSize() << endl;
 53     //MyArray<int>arr3(100);
 54     //arr3 = arr1;
 55 }
 56 
 57 //测试自定义数据类型
 58 class Person
 59 {
 60 public:
 61 
 62     Person()
 63     {
 64 
 65     }
 66     Person(string name, int age)
 67     {
 68         this->m_Name = name;
 69         this->m_Age = age;
 70     }
 71 
 72 
 73     string m_Name;
 74     int m_Age;
 75 };
 76 void printPersonArray(MyArray<Person>& arr)
 77 {
 78     for (int i = 0; i < arr.getSize(); i++)
 79     {
 80         cout << "姓名: " << arr[i].m_Name << " 年龄:" << arr[i].m_Age << endl;
 81 
 82 
 83     }
 84 }
 85 void test02()
 86 {
 87     MyArray<Person>arr(10);
 88 
 89     Person p1("张三", 200);
 90     Person p2("李四",20);
 91     Person p3("王五", 30);
 92     Person p4("赵六",99);
 93     Person p5("孙七", 48);
 94 
 95     //将数据插入到数组中
 96     arr.Push_Back(p1);
 97     arr.Push_Back(p2);
 98     arr.Push_Back(p3);
 99     arr.Push_Back(p4);
100     arr.Push_Back(p5);
101 
102     //打印数组
103     printPersonArray(arr);
104 
105     //打印容量
106     cout << "arr容量为:" << arr.getCapacity() << endl;
107 
108     //打印大小
109     cout << "arr容量为:" << arr.getSize() << endl;
110 
111 }
112 int main()
113 {
114 
115     test01();
116     test02();
117 
118     system("pause");
119 
120     return 0;
121 
122 }
  1 MyArray.hpp
  2 
  3 #pragma once
  4 //自己的通用数组类
  5 #include<iostream>
  6 using namespace std;
  7 
  8 template<class T>
  9 class MyArray
 10 {
 11 public:
 12 
 13     //有参构造  参数 容量
 14     MyArray(int capacity)
 15     {
 16         //cout << "Myarray有参构造调用"<<endl;
 17         this->m_Capacity = capacity;
 18         this->m_Size = 0;
 19         this->pAddress = new T[this->m_Capacity];
 20     }
 21     //拷贝构造
 22     MyArray(const MyArray& arr)
 23     {
 24         //cout << "Myarray有拷贝造调用" << endl;
 25         this->m_Capacity = arr.m_Capacity;
 26         this->m_Size = arr.m_Size;
 27         //this->pAddress = arr.pAddress;
 28 
 29 
 30         //深拷贝
 31         this->pAddress  = new T[arr.m_Capacity];
 32 
 33         //将arr中的数据都拷贝过来
 34         for (int i = 0; i < this->m_Size; i++)
 35         {
 36             this->pAddress[i] = arr.pAddress[i];
 37         }
 38 
 39 
 40     }
 41     //operator =防止浅拷贝的问题 a = b =c
 42     MyArray& operator = (const MyArray& arr)
 43     {
 44         //cout << "Myarray的 operator= 调用" << endl;
 45         //先判断原来堆区是否有数据 如果有先释放
 46         if (this->pAddress != NULL)
 47         {
 48             delete[]this->pAddress;
 49             this->pAddress = NULL;
 50             this->m_Capacity = 0;
 51             this->m_Size = 0;
 52         }
 53 
 54         //深拷贝
 55         this->m_Capacity = arr.m_Capacity;
 56         this->m_Size = arr.m_Size;
 57         this->pAddress = new T[arr.m_Capacity];
 58         for (int i = 0; i < this->m_Size; i++)
 59         {
 60             this->pAddress[i] = arr.pAddress[i];
 61         }
 62         return *this;
 63     }
 64 
 65     //尾插法
 66     void Push_Back(const T &val)
 67     {
 68         //判断容量是否等于大小
 69         if (this->m_Capacity == this->m_Size)
 70         {
 71             return;
 72         }
 73         //在数组末尾插入数据
 74         this->pAddress[this->m_Size] = val;
 75         this->m_Size++;  //更新数组大小
 76     }
 77     //尾删法
 78     void Pop_Back()
 79     {
 80         //让用户访问不到最后一个元素,即为尾删,逻辑删除
 81         if (this->m_Size == 0)
 82         {
 83             return;
 84         }
 85         this->m_Size--;
 86     }
 87 
 88     //通过下标的方式访问数组中的元素
 89     T& operator[](int index)
 90     {
 91         return this->pAddress[index];
 92     }
 93 
 94     //返回数组的容量
 95     int getCapacity()
 96     {
 97         return this->m_Capacity;
 98     }
 99     //返回数组大小
100     int getSize()
101     {
102         return this->m_Size;
103     }
104 
105 
106 
107 
108 
109     //析构函数
110     ~MyArray()
111     {
112         if (this->pAddress != NULL)
113         {
114             //cout << "Myarray析构函数调用" << endl;
115             delete[] this->pAddress;
116             this->pAddress = NULL;
117         }
118     }
119 private:
120 
121     T* pAddress;  //指针指向堆区开辟的真时数组
122 
123     int m_Capacity; //数组容量
124 
125     int m_Size;     //数组大小
126 };

 

posted on 2021-08-13 13:52  Bytezero!  阅读(158)  评论(0编辑  收藏  举报