• 实现:类模板的数组类封装


    前言:不管再这么讨厌综合案例,但是不得不说学着做一次综合案例胜过自己看千万次

    示例代码:

    Myarray.hpp

    #include<string>
    #include<iostream>
    
    using namespace std;
    
    template<class t>
    class Myarray {
    public:
    	Myarray(int capacity) {
    		//cout << "这是构造函数的调用" << endl;
    		this->m_size = 0;
    		this->m_capacity = capacity;
    		m_array = new t[this->m_capacity]; // m_array指针堆区开辟的数组,容量位m_capacity
    	}
    
    	~Myarray() { //定义析构函数,结束之后进行内存释放的操作
    		if (this->m_array != NULL) { //首先进行判断是否为空
    			//cout << "这是析构函数的调用" << endl;
    			delete[] m_array ; //释放内存
    			this->m_array = NULL; //防止成为野指针
    			this->m_size = 0; //接下来的两步其实可有可无
    			this->m_capacity = 0;
    		}
    	}
    	
    	//拷贝函数需要进行解决的是深浅拷贝引发的内存问题
    	Myarray(const Myarray & arr) {   //传参为arr
    		//cout << "这里拷贝函数的调用" << endl;
    		this->m_capacity = arr.m_capacity;
    		this->m_size = arr.m_size;
    		this->m_array = new t[this->m_capacity];//唯一会引发内存问题的就在这,这里自己开辟新的内存其数据类型为t到堆区赋值
    		for (int i = 0; i < this->m_size; i++)
    		{
    			//如果T为对象,而且还包含指针,必须需要重载 = 操作符,因为这个等号不是 构造 而是赋值,
    			// 普通类型可以直接= 但是指针类型需要深拷贝
    			this->m_array[i] = arr.m_array[i];
    		}
    	}
    
    	//operator= 引起的深浅拷贝的问题我们也需要解决
    	Myarray& operator=(const Myarray & arr) { //返回的对象为Myarray的引用,原因是a=b=c的 连续赋值的问题
    		//cout << "这里operator=调用" << endl;
    		if (this->m_array != NULL) { //首先进行判断是否为空
    			delete[] m_array; //释放内存
    			this->m_size = 0; //接下来的两步其实可有可无
    			this->m_capacity = 0;
    		}
    
    		//然后在得到赋值右边的数据内容
    		this->m_capacity = arr.m_capacity;
    		this->m_size = arr.m_size;
    		this->m_array = new t[this->m_capacity];
    		
    		//然后再拿到指针中的数据
    		for (int i = 0; i < this->m_size; i++) {
    			this->m_array[i] = arr.m_array[i];
    		}
    		
    		return *this; //返回当前对象本身,因为this 本身就是 Myarray * const a 
    	}
    
    	friend void to_print(Myarray<t> & m) {
    		for (int i = 0; i < m.m_size; i++) {
    			cout << m.m_array[i] << " ";
    		}
    	}
    
    	//尾插法的实现
    	void tail_in(t num) {
    		if (this->m_size == this->m_capacity) {
    			cout << "存储内容已满" << endl;
    		}else {
    			this->m_array[this->m_size] = num;
    			this->m_size++;
    		}
    	}
    
    	//尾删法的实现
    	void tail_out() {
    		if (this->m_size == 0) {
    			cout << "存储内容已空" << endl;
    		}
    		else {
    			this->m_size--; //只实现逻辑删除
     		}
    	}
    
    	//获取数组的容量和大小
    	void to_get_size() {
    		cout << "当前数组的存储容量为: " << this->m_capacity << endl;
    		cout << "当前数组的存储大小为: " << this->m_size << endl;
    	}
    
    
    private:
    	int m_size; //具体存放的数量
    	int m_capacity; //存放的容量
    	t * m_array;  //定义的一个存放数组类型t的指针
    
    
    };
    

    1.cpp

    #include "Myarray.hpp"
    
    
    void test01() { //函数开辟栈区,测试析构
    	Myarray<int> arr1(5);
    	arr1.tail_in(5);
    	arr1.tail_in(10);
    	arr1.tail_out();
    	to_print(arr1);
    
    }
    
    int main() {
    	test01();
    	system("pause");
    	return 0;
    }
    
  • 相关阅读:
    POJ 1703 Find them, Catch them
    POJ 2236 Wireless Network
    POJ 2010 Moo University
    POJ 2184 Cow Exhibition
    POJ 3280 Cheapest Palindrome
    POJ 3009 Curling 2.0
    POJ 3669 Meteor Shower
    POJ 2718 Smallest Difference
    POJ 3187 Backward Digit Sums
    POJ 3050 Hopscotch
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/11924534.html
Copyright © 2020-2023  润新知