头文件<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;
}