C++类模板案例-实现一个通用的数组类

案例中用到的方法

  1. 可以对内置数据类型以及自定义数据类型的数据进行存储
  2. 将数组中的数据类型存储到堆区
  3. 构造函数中可以传入数组的容量
  4. 提供对应的拷贝构造函数以及operator=防止浅拷贝问题
  5. 提供尾插法和尾删法对数组中的数据进行增加和删除
  6. 可以通过下标的方式访问数组中的元素
  7. 可以获取数组中当前元素个数和数组的容量

·myarray.hpp头文件

#define _CRT_SECURE_NO_DEPRECATE
#pragma once
#include<iostream>using namespace std;template<class T>
class Myarray
{
public://构造函数Myarray(int capacity){this->m_capacity = capacity;this->m_size = 0;paddress = new T[this->m_capacity];}//拷贝构造Myarray(const Myarray& arr){this->m_capacity = arr.m_capacity;this->m_size = arr.m_size;this->paddress = new T[this->m_capacity];for (int i = 0; i < this->m_size; i++){//如果T为对象,而且还包括指针,必须需要重载 = 操作符 ,因为这个等号不是 构造 而是赋值//普通类型可以 = 但是指针类型需要深拷贝this->paddress[i] = arr.paddress[i];}}//重载 = 操作符  防止浅拷贝问题Myarray& operator=(const Myarray& myarray){if (this->paddress != NULL){delete[] this->paddress;this->m_capacity = 0;this->m_size = 0;}this->m_capacity = myarray.m_capacity;this->m_size = myarray.m_size;this->paddress = new T[this->m_capacity];for (int i = 0; i < this->m_size; i++){this->paddress[i] = myarray[i];}return *this;}//重载 [] 操作符  arr[0]T& operator [](int index){return this->paddress[index];  //不考虑跨界,用户自己去处理}//尾插法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){return;}this->m_size--;}//获取数组容量int getCapacity(){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;  //指向一个堆空间,这个空间存储真正的数据int m_capacity;  //容量int m_size;  //大小
};

·主函数

#include<iostream>
using namespace std;
#include<string>
#include "myarray.hpp"void printintarray(Myarray<int>& arr)  //参数是拷贝构造函数
{for (int i = 0; i < arr.getSize(); i++) {cout << arr[i] << " ";}cout << endl;
}//测试内置数据类型
void test01()
{Myarray<int> array1(10);for (int i = 0; i < 10; i++){array1.Push_back(i);}cout << "array1打印输出:" << endl;printintarray(array1);cout << "array1的大小: " << array1.getSize() << endl;cout << "array1的容量: " << array1.getCapacity() << endl;}//测试自定义数据类型
class Person {
public://Person() {};必须添加默认的构造函数,可能因为在创建数组的时候还需要传参//Person() {};Person(string name, int age){this->mname = name;this->mage = age;}
public:string mname;int mage;
};void printpersonintarray(Myarray<Person>& arrperson) //参数是拷贝构造函数
{for (int i = 0; i < arrperson.getSize(); i++) {cout <<"姓名:" << arrperson[i].mname << "年龄 :"<<arrperson[i].mage;}cout << endl;
}void test02()
{//如果在定义构造函数时候没有写默认构造函数Person() {}// 则在编译类模板成员函数 Myarray<Person>::Myarray(int)时//创建数组Myarray<Person> parray(10);  //Person p1("hg", 20);Person p2("hg", 20);Person p3("hg", 20);Person p4("hg", 20);parray.Push_back(p1);parray.Push_back(p2);parray.Push_back(p3);parray.Push_back(p4);printpersonintarray(parray);cout << "parray的大小" << parray.getSize() << endl;cout << "parray的容量" << parray.getCapacity() << endl;}int main()
{test01();test02();return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法导论复习(二)

算法导论第二次复习以 分治法 为专题 文章目录 分治算法是什么归并排序Strassen矩阵乘法最近点对 求解递推表达式 分治算法是什么 归并排序 代码如下&#xff1a; #include <iostream> #include <vector>using namespace std;// 归并函数&#xff0c;将两个有序数…

代码随想Day36 | 435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间 这道题和前一天的射箭题目思想类似&#xff0c;用总区间个数-不重叠的区间个数等于需要去除的区间个数。首先对左边界排序&#xff0c;如果当前的左边界大于等于上一区间的右边界&#xff0c;则说明是一个不重叠的区间&#xff0c;否则&#xff0c;更新上一重…

Redis生产实战-热key、大key解决方案、数据库与缓存最终一致性解决方案

生产环境中热 key 处理 热 key 问题就是某一瞬间可能某条内容特别火爆&#xff0c;大量的请求去访问这个数据&#xff0c;那么这样的 key 就是热 key&#xff0c;往往这样的 key 也是存储在了一个 redis 节点中&#xff0c;对该节点压力很大 那么对于热 key 的处理就是通过热…

nginx 优化和安装防盗链以及实验举例

目录 nginx编译安装常用模块 生产中建议设置 nginx 内核限制文件优化 先将 nginx编译安装直至 systemctl命令使用 nginx服务 安全优化 隐藏 nginx版本号 查看版本号 隐藏版本信息 修改用户与组 限制单个 IP的访问频率和连接数 防盗链相关设置 在源主机里配置防盗链 …

【C++11】右值引用与移动语义

一.左值与右值 左值&#xff1a;可以取地址的表示数据的表达式&#xff0c;左值可以出现在赋值符号左边 右值&#xff1a;不能取地址的表示数据的表达式&#xff0c;右值不能出现在赋值符号左边 int fun() {return 0; } int main() {int a 0;//a->左值const int b 1;//b-&…

【lesson14】MySQL表的基本查询(1)

文章目录 表的基本操作介绍retrieveselect列建表基本测试 where子句建表基本测试 表的基本操作介绍 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; retrieve select列 建表 基本测试 插入数据 全列查询 …

利用断路器状态统计sentinel熔断次数

最近项目需要sentinel熔断时记录熔断的次数&#xff0c;在经过一阵搜索后决定利用断路器的状态变化来实现此功能 然而&#xff0c;遇到了这样的一个情况&#xff0c;断路器的状态在第一次熔断时正常从close–>open&#xff0c;但在后续&#xff08;熔断时间内blocked或者熔断…

RocketMQ的延迟消息是如何实现的❓

RocketMQ 作为一款强大的分布式消息中间件&#xff0c;提供了丰富的功能&#xff0c;其中之一就是延迟消息。在本篇博客中&#xff0c;我们将深入探讨 RocketMQ 延迟消息的实现机制&#xff0c;了解消息的定时投递和消费流程。 1. 定时消息的发送 RocketMQ 实现延迟消息的第一…

linux应用软件下载站收集

一、这是一个别人问题帖&#xff0c;里面有很多下载站点。 谁知道可以自由下载Linux软件的论坛或者平台&#xff1f;类似52破解论坛。国内国外都可以&#xff0c;我在搜索引擎找不到&#xff1f; - 知乎

2023年度影响力出海品牌传音移动互联:开放合作 赋能更多中国企业高效出海

伴随着全球化的脚步&#xff0c;出海成为许多中国企业的“必选项”&#xff0c;与之配套的出海服务相关业务也得到了极大的发展。近日&#xff0c;第五届鲸鸣奖颁奖典礼上&#xff0c;传音移动互联凭借为企业提供高效优质的出海解决方案&#xff0c;荣获鲸鸣奖“2023年度影响力…

SpringBoot 引入nacos 【最新 | 可运行】

SpringBoot 引入nacos 首先要了解在 Springboot 中只支持那些 Springboot 的版本&#xff08;我真的被这个搞死了&#xff09;,可以如下图参考&#xff1a; 下面我们就开始吧 下载 Nacos nacos 下载地址&#xff0c;这里可以选择你要下载的版本&#xff0c;我选择下载了2.2.…

<JavaEE> 文件IO -- 数据流和文件内容操作(Reader 和 Writer 、InputStream 和 OutputStream)

目录 一、数据流概述 二、流的关闭 2.1 使用 close() 方法 2.2 使用 try-finally 2.3 使用 try-with-resources 三、字符流的读写 3.1 Reader 类 3.2 Writer 类 四、字节流的读写 4.1 InputStream 类 4.2 OutputStream 类 一、数据流概述 1&#xff09;在 Java 中&…

[c]零钱兑换

题目比较简单&#xff0c;看答案就能看懂什么意思 #include<stdio.h> int main() {int count 0;int n;scanf("%d", &n);for (int i 0; i < n; i){for (int k 0; k <n/2; k){for (int j 0; j < n/5 ; j){if (i 2 * k 5 * j n){count;}}}}p…

【Python基础】迭代器

文章目录 [toc]什么是迭代可迭代对象判断数据类型是否是可迭代类型 迭代器对可迭代对象进行迭代的本质获取可迭代对象的迭代器通过迭代器获取数据StopIteration异常 自定义迭代器__iter__()方法__next__()方法判断数据类型是否是可迭代类型自定义迭代器案例分离模式整合模式 fo…

这套软件测试技巧|软测经典面试题真的有用,今天面试大部分都遇到了!!!

祝同学们都能够顺利找到心仪的工作拿高薪&#xff0c;废话不多说&#xff0c;下面上题了~ 46、您以往是否曾经从事过性能测试工作&#xff1f;如果有&#xff0c;请尽可能的详细描述您以往的性能测试工作的完整过程。 &#xff08;以自己最熟悉的性能测试项目为例&#xff09; …

【ARM Trace32(劳特巴赫) 高级篇 20 -- SNOOPer 使用介绍】

请阅读【Trace32 ARM 专栏导读】 文章目录 Trace32 SNOOPer 介绍SNOOPer 主要功能:SNOOPer 使用场景SNOOPer.ERRORSTOPSNOOPer.ModeSNOOPer.PCSNOOPer.RateSNOOPer.SELectSNOOPer.SIZESNOOPer.TDelaySNOOPer.TOutSNOOPer.TValueSNOOPer PC 采样Trace32 SNOOPer 介绍 在 Laut…

什么是面向切片编程?

面向切片&#xff08;Aspect-oriented Programming&#xff0c;AOP&#xff09;是一种软件开发的方法论&#xff0c;它旨在通过将横切关注点从主要业务逻辑中分离出来&#xff0c;提供更高层次的模块化和可维护性。它通过将跨越多个对象、类或组件的共同功能&#xff08;称为横…

可惜+悲伤+唉=emmo...

拟合曲线&#xff1a; 参考论文&#xff1a;黄河清.NURBS曲面逆向造型关键算法的研究与应用 [D].西北工业大学,2004 三次NURBS曲线控制点的计算 首先给出拟合曲线的具体步骤&#xff1a; 1、节点矢量的求解方法为&#xff1a; 采用积累弦长参数化法&#xff0c;即&#xff1…

应用ICP-MS实验PFA烧杯耐腐蚀带刻度反应杯的特点分析

聚四氟&#xff08;PFA&#xff09;烧杯可用于痕量分析、同位素分析等实验&#xff0c;ICP-MS实验室适用。半导体、多晶硅、光伏电子 锂电池行业均适用。杯体刻度清晰&#xff0c;方便观察&#xff0c;尖嘴方便倾倒溶液。 可溶性聚四氟乙烯烧杯特性&#xff1a; 1、透明&…

如何定制专属app:定制app教程

《如何定制专属app&#xff1a;探索app定制的秘密》 什么是app定制 在当今数字化时代&#xff0c;应用程序&#xff08;app&#xff09;已经渗透到我们生活的方方面面&#xff0c;从社交娱乐到工作学习&#xff0c;app无处不在&#xff0c;尽管市场上有着众多的app供我们选择…