環(huán)境:ide:Mac+clion
視頻鏈接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5
需求:通過模版類,實現(xiàn)一個數(shù)組葛账。
#include <iostream>
using namespace std;
#ifndef CHAPTER6_MYARRAY_HPP
#define CHAPTER6_MYARRAY_HPP
template<class T>
class MyArray {
public:
//構(gòu)造函數(shù)
MyArray(int len) {
cout << "MyArray 構(gòu)造函數(shù)調(diào)用" << endl;
this->m_Capacity = len;//這里設(shè)定容量大小啥么,構(gòu)造函數(shù)傳遞進來嘿悬。
this->address = new T[len];
m_Size = 0;
}
//尾插法
void push_back(const T &data) {
if (this->m_Capacity > this->m_Size) {
this->address[this->m_Size] = data;//這個是再數(shù)組后面插入數(shù)據(jù)嫁怀。
this->m_Size++;//數(shù)組大小進行更新溉愁。
} else {
cout << "已經(jīng)超過容量维蒙,無法再插入错蝴。"<<endl;
return;
}
}
//尾刪法
void pull_back(){
if (this->m_Size == 0){
cout << "數(shù)組為空,無法刪除數(shù)據(jù)摇幻。"<<endl;
return;
}
// this->address[this->m_Size] = NULL;//刪除最后一個數(shù)據(jù),可以不進行設(shè)置為空横侦,通過下面代碼進行違刪除
this->m_Size--;//更新數(shù)組的大小。
}
//獲取容量
int getCapacity(){
return this->m_Capacity;
}
//獲取數(shù)組大小
int getArraySize(){
return this->m_Size;
}
//通過下標方式訪問绰姻。
T & operator[](int index){
return this->address[index];
}
//有了構(gòu)造就需要析構(gòu)函數(shù)
~MyArray() {
if (this->address != NULL) {
cout << "MyArray 析構(gòu)函數(shù)調(diào)用" << endl;
delete[]this->address;
this->address = NULL;
}
}
//拷貝構(gòu)造函數(shù)
MyArray(const MyArray &arr) {
cout << "MyArray 拷貝函數(shù)調(diào)用" << endl;
this->m_Size = arr.m_Size;
this->m_Capacity = arr.m_Capacity;
// this->address = arr.address;//這就是淺拷貝枉侧。會在析構(gòu)中刪除,
this->address = new T[arr.m_Capacity];//這里是為了解決淺拷貝的問題狂芋。
for (int i = 0; i < this->m_Size; i++) {
this->address[i] = arr.address[i];//這里如果在傳遞過來的arr 中榨馁,如果有其他數(shù)據(jù),需要逐一進行拷貝過來帜矾。
}
}
//重載operator=翼虫,注意這里需要返回MyArray&,返回這個可以直接進行鏈式賦值屑柔。
MyArray &operator=(const MyArray &arr) {
cout << "MyArray 賦值函數(shù)調(diào)用" << endl;
this->m_Size = arr.m_Size;
this->m_Capacity = arr.m_Capacity;
if (this->address != NULL) {
delete[]this->address;
this->address = NULL;
m_Size = 0;
m_Capacity = 0;
}
this->address = new T[arr.m_Capacity];
for (int i = 0; i < this->m_Size; i++) {
this->address[i] = arr.address[i];//這里如果在傳遞過來的arr 中,如果有其他數(shù)據(jù)珍剑,需要逐一進行拷貝過來掸宛。
}
return *this;
}
private:
T *address;//用來維護數(shù)組里面的數(shù)據(jù)。
int m_Size;//當(dāng)前數(shù)組的大小招拙。
int m_Capacity;//數(shù)組的容量唧瘾。
};
#endif //CHAPTER6_MYARRAY_HPP
測試代碼如下:
#include "MyArray.hpp"
void test(){//測試代碼
MyArray<int>arry1 (5);
MyArray<int>arry2(arry1);
MyArray<int>arry3(200);
arry1 = arry3;
// 以上的輸出如下:
// MyArray 構(gòu)造函數(shù)調(diào)用
// MyArray 拷貝函數(shù)調(diào)用
// MyArray 構(gòu)造函數(shù)調(diào)用
// MyArray 賦值函數(shù)調(diào)用
// MyArray 析構(gòu)函數(shù)調(diào)用
// MyArray 析構(gòu)函數(shù)調(diào)用
// MyArray 析構(gòu)函數(shù)調(diào)用
}
void myPrint(MyArray<int> &arry1){
for (int i=0;i<arry1.getArraySize();i++){
cout << arry1[i]<<endl;
}
}
void test1(){
MyArray<int>arry1 (5);
for (int i = 0;i<3;i++){
arry1.push_back(i);
}
myPrint(arry1);
cout << "刪除前容量:"<<arry1.getCapacity()<<endl;//5
cout << "刪除前大小:"<<arry1.getArraySize()<<endl;//3
arry1.pull_back();
cout << "刪除后容量:"<<arry1.getCapacity()<<endl;//5
cout << "刪除后大斜鸱铩:"<<arry1.getArraySize()<<endl;//2
}
class Person{
public:
Person(){//這個必須存在饰序,類模版初始化的時候需要。
}
Person(string name,int age){
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
//測試自定義數(shù)據(jù)類型
void test2(){
MyArray<Person>arry(5);
Person p1("sheik1",1);
Person p2("sheik2",2);
arry.push_back(p1);
arry.push_back(p2);
for (int i=0;i<arry.getArraySize();i++){
cout << "姓名: "<< arry[i].m_Name<<" 年齡: "<<arry[i].m_Age<<endl;
}
cout << "刪除前容量:"<<arry.getCapacity()<<endl;
cout << "刪除前大形偶恕:"<<arry.getArraySize()<<endl;
arry.pull_back();
cout << "刪除后容量:"<<arry.getCapacity()<<endl;
cout << "刪除后大芯稹:"<<arry.getArraySize()<<endl;
}