zoukankan      html  css  js  c++  java
  • 实现:类模板的数组类封装

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

    示例代码:

    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;
    }
    
  • 相关阅读:
    浅谈图标布局
    和浏览器异步请求取消相关的那些事
    chrome浏览器的跨域设置——包括版本49前后两种设置
    cordova加载层、进度条、文件选择插件
    js构建ui的统一异常处理方案(四)
    js构建ui的统一异常处理方案(三)
    通过 IntelliJ IDEA 来 Debug Jar包
    JPA使用Specification like查询时特殊字符%和_处理问题 Escape示例
    java8新特性:利用Lambda处理List集合
    让开发部署提速的 IDEA 插件神器攻略(转)
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/11924534.html
Copyright © 2011-2022 走看看