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;
    }
    
  • 相关阅读:
    hadoop配置支持LZO压缩格式并支持分片
    CSS 图片:如何使用 CSS 来布局图片
    CSS3 用户界面:用户界面特性来调整元素尺寸,框尺寸和外边框
    CSS3 多列:如何将文本内容设计成像报纸一样的多列布局?
    mac Pycharm:如何使用anaconda安装jieba
    pycharm如何安装jieba词频统计器?
    CSS3 动画:使元素从一种样式逐渐变化为另一种样式的效果
    CSS3 过渡:用鼠标移过逐渐改变它原有样式
    CSS3 3D 转换:使用 3D 转换来对元素进行格式化
    CSS3 2D 转换:对元素进行移动、缩放、转动、拉长或拉伸
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/11924534.html
Copyright © 2011-2022 走看看