MyArray框架搭建與實現

#include<iostream>
using namespace std;

template<class T>
class MyArray
{
public:
	//構造函數
	MyArray<T>(int capacity) {
        this->setmCapacity(capacity);
		//this->mCapacity = capacity  mCapacity是public才這樣用
		this->mSize = 0;
		//申請內存
		this->pAddr = new T[this->mCapacity];
	}

	//拷貝,const保證不改變原來的 MyArray
	MyArray<T>(const MyArray<T>& arr) {
		this->mCapacity = arr.mCapacity;
		this->mSize = arr.mSize;
		this->pAddr = new T[this.mCapacity];
        //數據拷貝
		for (int i = 0; i < this.mSize;i++) {
			this->pAddr[i] = arr.pAddr[i];
		}
	}


	//重載 [] 運算符
	T& operator[](int index) {
		return this->pAddr[index];
	}

	//重載 = 運算符
	MyArray<T>& operator=(const MyArray<T>& arr) {

		if (this->pAddr != NULL) {
			delete[] this->pAddr;
		}
		this->mSize = arr.mSize;
		this->mCapacity = arr.mCapacity;
		//申請內存空間
		this->pAddr = new T[this->mCapacity];
		//數據拷貝
		for (int i = 0; i < this->mSize; i++) {
			this->pAddr[i] = arr.pAddr[i];
		}
		return *this;
	}

	//添加元素
	void PushBack(T& data) {
		//判斷容器中是否有位置
		if (this->mSize >= this->mCapacity) {
			return;
		}

		//調用拷貝構造 =號操做符
		//1. 對象元素必須可以被拷貝
		//2. 容器都是值寓意,而非引用寓意 向容器中放入元素,都是放入的元素的拷貝份
		//3  若是元素的成員有指針,注意深拷貝和淺拷貝問題
		this->pAddr[this->mSize] = data;
		//msize++
		this->mSize++;	
	}
    
    
	/*
    定義第二個pushback()函數的意義在於能夠直接傳入數據,例如
    arr.pushback(50);
    左值表示能夠在多行使用的值
    右值通常表示臨時變量,只能在當前行使用
    這裏的50是一個右值
    兩個&&表示對右值取引用
    */

	void PushBack(T&& data) {
		//判斷容器中是否有位置
		if (this->mSize >= this->mCapacity) {
			return;
		}
		this->pAddr[this->mSize] = data;
		//msize++
		this->mSize++;
	}
    
    /*
    mCapacity是private
    */
    int getmCapacity(int capacity) {
		return this->mCapacity;
	}
	void setmCapacity(int capacity) {
		this->mCapacity=capacity;
	}


	//析構函數
	~MyArray() {
		if (this->pAddr != NULL) {
			delete[] this->pAddr;
		}
	}
public:
	//當前數組有多少元素
	int mSize;
	//保存數據的首地址
	T* pAddr;

private:
	//一共能夠容下多少個元素
	int mCapacity;
};


void test01() {

	MyArray<int> marray(20);
	int a = 10, b = 20, c = 30, d = 40;
	marray.PushBack(a);
	marray.PushBack(b);
	marray.PushBack(c);
	marray.PushBack(d);

	//不能對右值取引用
	//左值 能夠在多行使用
	//臨時變量 只能當前行使用
	marray.PushBack(100);
	marray.PushBack(200);
	marray.PushBack(300);

	for (int i = 0; i < marray.mSize; i++) {
		cout << marray[i] << " ";
	}
	cout << endl;
}

class Person {};
void test02() {
	Person p1, p2;
	MyArray<Person> arr(10);
	arr.PushBack(p1);
	arr.PushBack(p2);
}


int main()
{
	test01();
	test02();
    return 0;
}
相關文章
相關標籤/搜索