#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; }