[C++]MyArray

头文件<MyArray.h>

#pragma once
#include<iostream>
using namespace std;

/*
该类为自定义的数组模板类
实现了数组的基本功能
*/
template<typename T>
class MyArray  
{
public:
    int mCapacity;  //数组容量
    int mSize;    //当前数组内元素个数
    T* mAddr;   //保存数据的首地址
public:
    MyArray();
    MyArray(int);   //传入参数是数组容量
    MyArray(const MyArray<T>&);   //方便数组拷贝
    ~MyArray();
    T& operator[](int);   //重载[]运算符
    MyArray<T> operator=(const MyArray&);  //重载=运算符
    void PushBack(T&);  //定义传入数据的函数
    void PushBack(T&&);   
    /*
    定义第二个pushback()函数的意义在于可以直接传入数据,例如
    arr.pushback(50);
    左值表示可以在多行使用的值
    右值一般表示临时变量,只能在当前行使用
    这里的50是一个右值
    两个&&表示对右值取引用
    */
};

源文件<MyArray.hpp>

#include "MyArray.h"


template<typename T>
MyArray<T>::MyArray(int capacity) {  //含参构造
    this->mCapacity = capacity;
    this->mSize = 0;
    //申请内存,new会调用malloc并且构造对象
    this->mAddr = new T[this->mCapacity];
}



template<typename T>
MyArray<T>::MyArray(const MyArray<T>& arr) {  //拷贝构造
    this->mCapacity = arr->mCapacity;
    this->mSize = arr->mSize;
    //注意,不能大意像上边一样直接赋值,这里需要先申请内存空间
    this->mAddr = new T[this->mCapacity];
    //循环遍历实现数据拷贝
    for (int i = 0; i < this->mSize; i++) {
        this->mAddr[i] = arr->mAddr[i];
    }
}



template<typename T>
T& MyArray<T>::operator[](int index) {  //索引
    return this->mAddr[index];
}

template<typename T>
MyArray<T> MyArray<T>::operator=(const MyArray& arr) {
    if (this->mAddr != NULL) {
        delete[] this->mAddr;
    }
    this->mCapacity = arr->mCapacity;
    this->mSize = arr->mSize;
    //注意,不能大意像上边一样直接赋值,这里需要先申请内存空间
    this->mAddr = new T[this->mCapacity];
    //循环遍历实现数据拷贝
    for (int i = 0; i < this->mSize; i++) {
        this->mAddr[i] = arr->mAddr[i];
    }
    return *this;

}


template<typename T>
void MyArray<T>::PushBack(T& data) {  
    //先判断容器中是否还有位置
    if (this->mSize >= this->mCapacity - 1) { return; }
    else {
        this->mAddr[this->mSize] = data;
        this->mSize++;
    }
}

template<typename T>
void MyArray<T>::PushBack(T&& data) {
    //先判断容器中是否还有位置
    if (this->mSize >= this->mCapacity - 1) { return; }
    else {
        //这里调用了拷贝构造=操作符
        //1. 对象元素必须能够被拷贝
        //2. 容器都是值寓意,而非引用寓意
        //向容器中放入元素,都是放入元素的拷贝,而不是元素引用
        //3. 如果元素的成员有指针,要注意深拷贝,浅拷贝问题
        this->mAddr[this->mSize] = data;
        this->mSize++;
    }
}


template<typename T>
MyArray<T>::~MyArray() {
    if (this->mAddr != NULL) {
        delete[] this->mAddr;
    }
}

主文件<main.cpp>

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

int main(){
    MyArray<int> arr1(20);
    arr1.PushBack(50);
    cout << arr1[0] << endl;
    return 0;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值