4.模板-数组类封装

文章目录

    • 功能
    • 代码
    • 运行结果

功能

利用模板进行数组类封装,在代码实现过程中,使用了
1.operator=重载,利用深拷贝防止浅拷贝问题;
2.operator[]重载,确保可以使用[]来仿真数组元素;
3.尾插法、尾删法、返回数组容量和数组大小;

代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>

using namespace std;

template<class T>
class MyArray
{
public:
	/*有参构造*/
	MyArray(int capacity)
	{
		/*cout << "构造" << endl;*/
		this->m_Capacity = capacity;
		this->m_size = 0;
		this->pAddress = new T[this->m_Capacity];
	}

	/*拷贝构造*/
	MyArray(const MyArray &arr)
	{
		/*cout << "拷贝构造" << endl;*/
		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 < this->m_size; i++)
		{
			this->pAddress[i] = arr.pAddress[i];
		}
	}

	/*operator= 防止浅拷贝问题*/
	MyArray& operator=(const MyArray& arr)
	{
		/*cout << "operator=调用" << endl;*/
		/*先判断原来堆区是否有数据,如果有先释放*/
		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;
	}

	/*尾插法*/
	void Push_Back(const T &val)
	{
		/*判断容量是否等于大小*/
		if (this->m_Capacity == this->m_size)
		{
			cout << "容量等于元素个数" << endl;
			return;
		}

		this->pAddress[this->m_size] = val;/*在数据末尾插入数据*/
		this->m_size++;/*更新数组大小*/
	}

	/*尾删法*/
	void Pop_Back()
	{
		/*让用户访问不到最后一个元素,即为尾删,逻辑删除*/
		if (this->m_size == 0)
		{
			cout << "元素个数为0,不执行尾删!" << endl;
		}
		this->m_size--;
	}

	/*通过下标方式访问数组中的元素*/
	T& operator[](int index)
	{
		return this->pAddress[index];
	}

	/*返回数组容量*/
	int GetCapaCity()
	{
		return this->m_Capacity;
	}

	/*返回数组大小*/
	int GetSize()
	{
		return this->m_size;
	}

	/*析构函数*/
	~MyArray()
	{
		/*cout << "析构" << endl;*/
		if (this->pAddress != NULL)
		{
			delete[] this->pAddress;
			this->pAddress = NULL;
		}
	}

private:
	T* pAddress;
	int m_Capacity;
	int m_size;
};

void printMyArray(MyArray<int> &arr)
{
	/*使用了arr.GetSize()*/
	for (int i = 0; i < arr.GetSize(); i++)
	{
		/*使用了[]重载*/
		cout << arr[i] << " ";
	}
	cout << endl;
}

void test01()
{
	MyArray<int>arr1(10);
	
	/*利用尾插法向数组中插入数据*/
	for (int i = 0; i < 5; i++)
	{
		arr1.Push_Back(i);
	}
	
	cout << "arr1中的数据打印:";

	printMyArray(arr1);

	cout << "arr1的容量: " << arr1.GetCapaCity() << endl;
	cout << "arr1的大小: " << arr1.GetSize() << endl;

	/*利用拷贝构造*/
	MyArray<int>arr2(arr1);
	cout << "--------------------" << endl;

	cout << "arr2中的数据打印:";

	printMyArray(arr2);

	cout << "arr2的容量: " << arr2.GetCapaCity() << endl;
	cout << "arr2的大小: " << arr2.GetSize() << endl;

	cout << "arr2尾删后的数据打印 ";

	arr2.Pop_Back();

	printMyArray(arr2);

	return;
}



int main()
{
	test01();

	return 0;
}

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/500094.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于主成分分析的机器学习分类代码

前言 本文内容主要实现基于主成分分析的数据降维和四种经典的机器学习分类算法&#xff0c;包括&#xff1a;支持向量机、随机森林、XGBoost分类器、scikit-learn的梯度提升分类器和Histogram-based Gradient Boosting分类器 1.数据准备 import pickle import pandas as pd …

消息队列RocketMQ环境搭建

消息队列RocketMQ环境搭建 1.下载:配置环境变量启动NameServer启动Broker发送和接收消息测试模拟发送消息模拟接收消息 控制台安装与启动 软硬件需求: 系统要求是 64 位的&#xff0c;JDK要求是1.8及其以上版本的 1.下载: https://rocketmq.apache.org/download/ 2.解压到指…

fast_bev学习笔记

目录 一. 简述二. 输入输出三. github资源四. 复现推理过程4.1 cuda tensorrt 版 一. 简述 原文:Fast-BEV: A Fast and Strong Bird’s-Eye View Perception Baseline FAST BEV是一种高性能、快速推理和部署友好的解决方案&#xff0c;专为自动驾驶车载芯片设计。该框架主要包…

数学逆元计算

定义&#xff0c;即是有&#xff08;在mod p 的意义下&#xff09;&#xff0c;也就是求倒数 根据定义&#xff0c;则有&#xff0c;b的逆元就是 所以得出第一个计算式 求&#xff0c;可以快速计算较大情况&#xff1a; 表示的逆元的值&#xff0c;则有&#xff1a; fac[0]…

基于STM32的汽车防窒息系统

文章目录 基于STM32的汽车防窒息系统系统简介材料展示视频制作硬件连接原理图PCB实物图GSM模块使用GSM模块代码 SGP30模块SGP30模块代码 步进电机驱动步进电机代码 其他模块主逻辑代码 总结 基于STM32的汽车防窒息系统 系统简介 随着社会的发展目前汽车的流行&#xff0c;汽车大…

骨传导耳机哪个品牌最好?精选五大热销产品深度测评!

作为一个经验丰富的数码测评师&#xff0c;我经常在生活中使用各类数码产品&#xff0c;骨传导耳机就是其中之一&#xff0c;但在之前&#xff0c;选购骨传导耳机的时候也踩到过不少的坑&#xff0c;因为随着骨传导耳机逐渐热门&#xff0c;一些劣质品牌逐渐进入市场中&#xf…

京东云4核16G服务器优惠价格26元1个月、658元1年、三年3098元

京东云4核16G服务器优惠价格26元1个月、80元3个月、658元1年、3098元三年&#xff0c;配置为&#xff1a;轻量云主机4C16G-220G SSD系统盘-5M带宽-500G月流量&#xff0c;京东云优惠活动 atengyun.com/go/jd 可以查看京东云服务器详细配置和精准报价单&#xff0c;活动打开如下…

代码随想录训练营Day37:● 738.单调递增的数字 ● 968.监控二叉树 ● 总结

738.单调递增的数字 题目链接 https://leetcode.cn/problems/monotone-increasing-digits/description/ 题目描述 思路 从后往前遍历数字的每一位&#xff0c;如果前一位大于后一位&#xff0c;则将其减一&#xff0c;后边的一位取 i-9 中最大的 解答的两点疑惑&#xff1a;…

【Java多线程】5——Lock底层原理

5 Lock底层原理 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&…

错误:ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+

错误现象 解决方法&#xff1a; 将urllib3 降级 pip install urllib31.25.11

震惊!AI生成真人视频毫无瑕疵,台词随意变!HeyGen硬核升级数字人

2024年3月21日&#xff0c;HeyGen 5.0 正式发布&#xff01;这款革命性的AIGC产品将AI数字人的魔力融入视频创作&#xff0c;以其简洁易用的特性&#xff0c;让视频制作变得轻而易举。 只需几次点击&#xff0c;即可打造出令人惊叹的高品质视频作品&#xff01; 不仅如此&…

HarmonyOS入门--页面和自定义组件生命周期

文章目录 页面和自定义组件生命周期页面生命周期组件生命周期生命周期的调用时机 页面和自定义组件生命周期 生命周期流程如下图所示&#xff0c;下图展示的是被Entry装饰的组件&#xff08;首页&#xff09;生命周期。 自定义组件和页面的关系&#xff1a; 自定义组件&…

学习【Redis实战篇】这一篇就够了

目录 1. 短信登录1-1. 技术点redis存储token拦截器刷新token有效期 1-2. 业务登录注册 2. 商户查询缓存1-1. 技术点缓存更新策略缓存穿透缓存雪崩缓存击穿 1-2. 业务查询缓存的商铺信息 3. 优惠卷秒杀3-1. 技术点全局唯一ID乐观锁基于Redis实现分布式锁基于Redisson实现分布式锁…

2024年智能版控费系统方案卓健易控

2024年智能版控费系统方案卓健易控 详细可咨询&#xff1a;19138173009 设备智能卓健易控ZJ-V8.0控费方案在科学和技术不断发展的背景下&#xff0c;逐渐实现了更新和迭代。现如今&#xff0c;感应技术、生物识别技术、智能图像识别技术、过程记录技术、监管控制技术等方面的…

halcon例程学习——ball.hdev

dev_update_window (off) dev_close_window () dev_open_window (0, 0, 728, 512, black, WindowID) read_image (Bond, die/die_03) dev_display (Bond) set_display_font (WindowID, 14, mono, true, false) *自带的 提示继续 disp_continue_message (WindowID, black, true)…

多个微信这样高效管理

随着微信成为企业商务沟通的主要平台&#xff0c;一些业务咨询量较大的行业&#xff0c;如教育培训、旅游、美容及医疗等&#xff0c;通过微信开展营销活动和客户服务过程中&#xff0c;经常面临多微信管理难题。 在这种情况下&#xff0c;采用微信线上业务模式&#xff0c;需…

Spring-IoC-属性注入的注解实现

1、创建对象的注解 Component 用于声明Bean对象的注解&#xff0c;在类上添加该注解后&#xff0c;表示将该类创建对象的权限交给Spring容器。可以直接将这些类直接创建&#xff0c;使用的时候可以直接用。 注解的value属性用于指定bean的id值&#xff0c;value可以省略&…

牛客JZ21-调整数组顺序使奇数位于偶数前面

目录 问题描述示例具体思路思路一 代码实现 问题描述 输入一个长度为 n 整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有的奇数位于数组的前面部分&#xff0c;所有的偶数位于数组的后面部分&#xff0c;并保证奇数和奇数&#xff0c;偶数和偶数…

12.Java语言的发展

JAVA语言的诞生是具有一定戏剧性的&#xff0c;可以说是命运多舛&#xff0c;差点凉凉&#xff0c;差点GG&#xff0c;差点嗝屁。 在1990年的时候Sun&#xff08;Stanford University Network&#xff1a;斯坦福大学网络&#xff09;公司成立了一个由 James Gosling 领导的Gree…

【unity】unity安装及路线图

学习路线图 二、有关unity的下载 由于unity公司是在国外&#xff0c;所以.com版&#xff08;https://developer.unity.cn/&#xff09;不一定稳定&#xff0c;学习时推荐从.cn国内版&#xff08;https://developer.unity.cn/&#xff09;前往下载&#xff0c;但是后期仍需回…