自定义数组容器MyArray框架

#include<iostream>

using namespace std;

template <typename T>
class  MyArray
{
public:
    MyArray(int nCapacity)
    {
        this->mCapacity = nCapacity;
        this->mSize = 0;
        this->pAddr = new T[this->mCapacity];
    }

    //拷贝构造
    MyArray(const MyArray<T>& arr)
    {
        this->mCapacity = arr.mCapacity;
        this->mSize = arr.mSize;
        this->pAddr = new T[arr.mCapacity];
        for (size_t i = 0; i < arr.mSize; i++)
        {
            this->pAddr[i] = arr.pAddr[i];
        }
    }

    ~MyArray()
    {
        if (this->pAddr != NULL)
        {
            delete this->pAddr;
        }
    
    }

    //重载运算符[]
    T& operator[](int nIndex)
    {
        return this->pAddr[nIndex];    //返回数组偏移量为nIndex的引用
    }

    //重载运算符=
    MyArray<T> operator=(const MyArray<T>& arr)
    {
        if (this->pAddr != NULL)
        {
            delete this->pAddr;
        }

        this->mCapacity = arr.mCapacity;
        this->mSize = arr.mSize;
        this->pAddr = new T[arr.mCapacity];
        for (size_t i = 0; i < arr.mSize; i++)
        {
            this->pAddr[i] = arr.pAddr[i];
        }
        return *this;
    }
    //往数组里添加数据
    void PushBack(T& data)
    {
        //数组当前数据的个数等于或大于数组容量时,这时不能够添加数据
        if (this->mSize >= this->mCapacity)
        {
            return;
        }
        this->pAddr[this->mSize] = data;
        this->mSize++;
    }
    //往数组里添加数据,对右值取引用
    void PushBack(T&& data)
    {
        //数组当前数据的个数等于或大于数组容量时,这时不能够添加数据
        if (this->mSize >= this->mCapacity)
        {
            return;
        }
        this->pAddr[this->mSize] = data;
        this->mSize++;
    }
    

public:
    //当前数组一共可以容下多少个元素
    int mCapacity;
    //当前数组有多少个元素
    int mSize;
    //保存数据的首地址
    T* pAddr;

};

void TestOne()
{
    MyArray<int> myArray(30);
    int nData1, nData2, nData3;
    nData1 = 10;
    nData2 = 20;
    nData3 = 30;
    myArray.PushBack(nData1);
    myArray.PushBack(nData2);

    //当直接PushBack具体的数值时,例如100,就不能用void PushBack(T& data),不能对右值取引用,要用到void PushBack(T&& data),多一个&,表示对右值取引用
    //左值:可以在多行使用
    //右值:临时变量,只能当前使用
    myArray.PushBack(100);
    myArray.PushBack(200);

    for (size_t i = 0; i < myArray.mSize; i++)
    {
        cout << myArray[i] << endl;
    }
}

class Person
{
public:
    int nAge;
};

void TestTwo()
{
    Person p1;
    p1.nAge = 10;

    MyArray<Person> myArray(30);
    myArray.PushBack(p1);

    for (size_t i = 0; i < myArray.mSize; i++)
    {
        cout << myArray[i].nAge << endl;
    }

}

int main()
{
    
    TestOne();
    TestTwo();


    system("pause");
    return 0;
}

 

posted @ 2020-05-31 12:33  zwj鹿港小镇  阅读(235)  评论(0编辑  收藏  举报