c++之类模板案例

时间:2022-07-23
本文章向大家介绍c++之类模板案例,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

描述:使用一个通用的数组类,要求如下:

1.可以对内置数据类型以及自定义数据类型进行存储;

2.将数组中的数据存储到堆区;

3.构造函数中可以传入数组的容量;

4.提供对应的拷贝函数以及operator=防止浅拷贝问题;

5.提供尾插法和尾删法对数组中的元素进行增加和删除;

6.可通过下标进行访问数组中的元素;

7.可以获得数组中当前元素的个数以及容量;

头文件:MyArray.hpp

#include<iostream>
using namespace std;

template<class T>
class MyArray {
public:
    //有参构造
    MyArray(int capacity) {
        cout << "有参构造函数调用" << endl;
        this->m_Capacity = capacity;
        this->m_Size = 0;
        this->pAddress = new T[this->m_Capacity];
    } 
    //析构函数
    ~MyArray() {
        cout << "析构函数调用" << endl;
        if (this->pAddress != NULL) {
            delete[] this->pAddress;
            this->pAddress = NULL;
        }
    }
    //拷贝构造
    MyArray(const MyArray& arr) {
        cout << "拷贝构造函数调用" << endl;
        this->m_Capacity = arr.m_Capacity;
        this->m_Size = arr.m_Size;
        //this->pAddress = arr.pAddress;
        //深拷贝
        this->pAddress = new T[arr.m_Capacity];
        //还要将原有数据拷贝过来
        for (int i = 0; i < this->m_Size; i++) {
            this->pAddress[i] = arr.pAddress[i];
        }
    }
    //operator=也是为了防止浅拷贝问题
    MyArray& operator=(const MyArray& arr) {
        cout << "重载=调用" << endl;
        //先判断原来的堆区是否有数据,如果有先释放
        if (this->pAddress != NULL) {
            delete[] this->pAddress;
            this->pAddress = NULL;
            this->m_Size = 0;
            this->m_Capacity = 0;
        }
        for (int i = 0; i < this->m_Size; i++) {
            this->pAddress[i] = arr.pAddress[i];
        }
        return *this;
    }
    //尾插法插入数据
    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--;
    }
    //通过数组下标访问数据
    T& operator[](int index) {
        return this->pAddress[index];
    }
    //返回数组的容量
    int getCapacity() {
        return this->m_Capacity;
    }
    //返回数组的大小
    int getSize() {
        return this->m_Size;
    }
private:
    T* pAddress;//指针指向堆区开辟的真实数组
    int m_Capacity;//容量
    int m_Size;//数组大小

};

源文件:test.cpp

#include "myArray.hpp"

void printArr(MyArray <int>& arr) {
    for (int i = 0; i < arr.getSize(); i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
}

void test() {
    MyArray <int>arr1(5);
    //MyArray <int>arr2(arr1);
    //MyArray <int>arr3(10);
    //arr3 = arr1;
    //插入数据
    arr1.Push_Back(1);
    arr1.Push_Back(2);
    cout << "插入之后的数组:" << endl;
    printArr(arr1);
    cout << "删除最后一个元素的数组:" << endl;
    arr1.Pop_back();
    printArr(arr1);
    cout << "此时数组的大小:" << arr1.getSize()<<endl;
    cout << "此时数组的容量:" << arr1.getCapacity() << endl;

}

int main() {
    test();
    system("pause");
    return 0;
}

运行结果: