c++学习笔记-类模板-class_template

该程序实现一个通用的数组类
程序的功能可在程序看出
注意:作者是用clion进行编写的,故需要编写CMakeLists.txt文件
CMakeLists.txt文件内容如下:

project( class_template_case )
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_STANDARD 14)
add_executable(mian mian.cpp)p

首先建立一个MyArray.hpp文件,将数组类模板的写在这个文件里。
注意:为什么不用(c++和.h)
因为类模板中的成员函数在调用阶段才会创建,导致分文件(.cpp和.h)编写链接不到
MyArray.hpp源码如下

//
// Created by wenbo on 2020/10/28.
//

#ifndef CLASS_TEMPLATE_CASE_MYARRAY_HPP
#define CLASS_TEMPLATE_CASE_MYARRAY_HPP

#endif //CLASS_TEMPLATE_CASE_MYARRAY_HPP
#pragma once
#include <iostream>
#include <string>
using namespace std;
//定义类模板
//该类模板可以存放自己定义的数据类型
template<class T>
class MyArray
{
    
    
public:
    //有参构造,初始化
    MyArray(int capacity)
    {
    
    
        this->m_Capacity=capacity;//传入容量
        this->m_Size=0;//初始化数组大小
        this->PAddress= new T[this->m_Capacity];//开辟容量为m_Capacity的堆区,来存放数组
    }
    //利用拷贝构造和以及operator =重载 防止浅拷贝的问题
    //拷贝构造
    MyArray(const MyArray &arr)
    {
    
    
        this->m_Capacity=arr.m_Capacity;
        this->m_Size=arr.m_Size;
        //注意开辟新的堆区,防止浅拷贝
        this->PAddress=new T[arr.m_Capacity];
        //将arr中的数组内容拷贝过来
        for(int i=0;i<arr.m_Size;i++)
        {
    
    
            this->PAddress[i]=arr.PAddress[i];
        }
    }
    //operator = (重载)
    MyArray& operator =(const MyArray &arr)//返回引用的原因是因为  可以把返回的对象作为左值,比如 a=b=c
    {
    
    
        //要先判断堆区是否有数据,有的话要清空
        if(this->PAddress!=NULL)
        {
    
    
            delete [] this->PAddress;
            this->PAddress=NULL;
            this->m_Capacity=0;
            this->m_Size=0;
        }
        //进行拷贝
        this->m_Capacity=arr.m_Capacity;
        this->m_Size=arr.m_Size;
        //注意开辟新的堆区
        this->PAddress=new T[arr.m_Capacity];
        for(int i=0;i<this->m_Size;i++)
        {
    
    
            this->PAddress[i]=arr.PAddress[i];
        }
        return *this;//一定要返回自身,这样才可以 像a=b=c这种方式赋值;
    }
    //尾插法 赋值
    void Push_Back(const T &val)
    {
    
    
        //判断容量是否等于大小
        if(this->m_Capacity==this->m_Size)//如果相等,则说明容量已满
        {
    
    
            return;
        }
        this->PAddress[this->m_Size]=val;
        this->m_Size++;
    }
    //尾删法
    void Pop_Back()
    {
    
    
        //让用户访问不到最后一个元素,逻辑上的删除
        if(this->m_Size==0)//如果size都是0,说明数组里面没有内容
        {
    
    
            return;
        }
        this->m_Size--;
    }
    //通过下标访问数组元素(重载运算符[]),如arr[100]要做左值,则需要加引用&
    T & operator [] (int index)
    {
    
    
        return this->PAddress[index];
    }
    //返回数组容量
    int getCapaticy()
    {
    
    
        return this->m_Capacity;
    }
    //返回数组大小
    int getSize()
    {
    
    
        return this->m_Size;
    }

    //析构函数,释放堆区
    ~MyArray()
    {
    
    
        if(this->PAddress!=NULL)
        {
    
    
            delete this->PAddress;
            this->PAddress=NULL;
            this->m_Capacity=0;
            this->m_Size=0;
        }
    }

    //属性
private:
    T* PAddress;//PAddress指向堆区开辟的数组
    int m_Capacity;//数组容量
    int m_Size;//数组大小
};

之后我在主函数做了两个测试test01()、test02():一个是int类型的数据,一个是自定义的一个数据类型(是一个类)
main.cpp源码如下:

//
// Created by wenbo on 2020/10/28.
//
#include "MyArray.hpp"
#include<iostream>
#include <string>
using namespace std;
//输出int数据类型
void printperson(MyArray<int> &arr)
{
    
    
    for(int i=0;i<arr.getSize();i++)
    {
    
    
        cout<<arr[i]<<endl;
    }
}
void test01()
{
    
    
    MyArray<int> arr(5);
    //利用尾插赋值
    arr.Push_Back(1);
    arr.Push_Back(2);
    arr.Push_Back(3);
    arr.Push_Back(4);
    arr.Push_Back(5);
    //打印数组
    printperson(arr);
    cout<<"数组容量:"<<arr.getCapaticy()<<endl;
    cout<<"数组大小:"<<arr.getSize()<<endl;
}
//自定义数据类型测试MyArray 这个模板类
class Person
{
    
    
public:
    Person() {
    
    };
    Person(string name,int age)
    {
    
    
        this->m_Name=name;
        this->m_Age=age;
    }
    string m_Name;
    int m_Age;
};
//输出Person数据类型
void printperson(MyArray<Person> &arr)
{
    
    
    for(int i=0;i<arr.getSize();i++)
    {
    
    
        cout<<"姓名:"<<arr[i].m_Name<<"age = "<<arr[i].m_Age<<endl;
    }
}

void test02()
{
    
    
    MyArray<Person> arr(5);
    Person p1("sun",100);
    Person p2("zhu",200);
    Person p3("sha",300);
    Person p4("tang",400);
    Person p5("bai",500);
    //利用尾插赋值
    arr.Push_Back(p1);
    arr.Push_Back(p2);
    arr.Push_Back(p3);
    arr.Push_Back(p4);
    arr.Push_Back(p5);
    //打印数组
    printperson(arr);
    cout<<"数组容量:"<<arr.getCapaticy()<<endl;
    cout<<"数组大小:"<<arr.getSize()<<endl;


}

int main()
{
    
    
    cout<<"****************test01()*********************"<<endl;
    test01();
    cout<<"****************test02()*********************"<<endl;
    test02();
    return 0;
}

运行结果如下:

****************test01()*********************
1
2
3
4
5
数组容量:5
数组大小:5
****************test02()*********************
姓名:sunage = 100
姓名:zhuage = 200
姓名:shaage = 300
姓名:tangage = 400
姓名:baiage = 500
数组容量:5
数组大小:5

猜你喜欢

转载自blog.csdn.net/joun772/article/details/109345228