C++ //模板案例-数组封装类
1 //模板案例-数组封装类
2 //描述
3 //实现一个通用的数组类
4 //1.可以对内置数据类型以及自定义数据类型的数据进行储存
5 //2.将数组很脏的数据储存到堆区
6 //3.构造函数中可以传入数组的容量
7 //4.提供对应的拷贝构造函数以及operator=防止浅拷贝问题
8 //5,提供尾插法和尾删法对数组中的数据进行增加和删除
9 //6.可以通过下标的方式访问数组的元素
10 //7.可以获取数组在当前元素个数和数组的容量
11
12 #include <iostream>
13 #include <string>
14 #include<fstream>
15 #include"MyArray.hpp"
16 using namespace std;
17
18 void printfIntArray(MyArray <int>&arr)
19 {
20 for (int i = 0; i < arr.getSize(); i++)
21 {
22 cout << arr[i] << endl;
23 }
24 }
25
26
27 void test01()
28 {
29 MyArray <int>arr1(5);
30
31 for (int i = 0; i < 5; i++)
32 {
33 //利用尾插法向数组中插入数据
34 arr1.Push_Back(i);
35 }
36 cout << "arry1的打印输出为: " << endl;
37 printfIntArray(arr1);
38
39 cout << "arr1的容量为: " << arr1.getCapacity() << endl;
40 cout << "arr1的大小为: " << arr1.getSize() << endl;
41
42
43 cout << "arry2的打印输出为: " << endl;
44 MyArray<int>arr2(arr1);
45 printfIntArray(arr2);
46
47 //尾删
48 arr2.Pop_Back();
49 cout << "arr2尾删后: " << endl;
50
51 cout << "arr2的容量为: " << arr2.getCapacity() << endl;
52 cout << "arr2的大小为: " << arr2.getSize() << endl;
53 //MyArray<int>arr3(100);
54 //arr3 = arr1;
55 }
56
57 //测试自定义数据类型
58 class Person
59 {
60 public:
61
62 Person()
63 {
64
65 }
66 Person(string name, int age)
67 {
68 this->m_Name = name;
69 this->m_Age = age;
70 }
71
72
73 string m_Name;
74 int m_Age;
75 };
76 void printPersonArray(MyArray<Person>& arr)
77 {
78 for (int i = 0; i < arr.getSize(); i++)
79 {
80 cout << "姓名: " << arr[i].m_Name << " 年龄:" << arr[i].m_Age << endl;
81
82
83 }
84 }
85 void test02()
86 {
87 MyArray<Person>arr(10);
88
89 Person p1("张三", 200);
90 Person p2("李四",20);
91 Person p3("王五", 30);
92 Person p4("赵六",99);
93 Person p5("孙七", 48);
94
95 //将数据插入到数组中
96 arr.Push_Back(p1);
97 arr.Push_Back(p2);
98 arr.Push_Back(p3);
99 arr.Push_Back(p4);
100 arr.Push_Back(p5);
101
102 //打印数组
103 printPersonArray(arr);
104
105 //打印容量
106 cout << "arr容量为:" << arr.getCapacity() << endl;
107
108 //打印大小
109 cout << "arr容量为:" << arr.getSize() << endl;
110
111 }
112 int main()
113 {
114
115 test01();
116 test02();
117
118 system("pause");
119
120 return 0;
121
122 }
1 MyArray.hpp
2
3 #pragma once
4 //自己的通用数组类
5 #include<iostream>
6 using namespace std;
7
8 template<class T>
9 class MyArray
10 {
11 public:
12
13 //有参构造 参数 容量
14 MyArray(int capacity)
15 {
16 //cout << "Myarray有参构造调用"<<endl;
17 this->m_Capacity = capacity;
18 this->m_Size = 0;
19 this->pAddress = new T[this->m_Capacity];
20 }
21 //拷贝构造
22 MyArray(const MyArray& arr)
23 {
24 //cout << "Myarray有拷贝造调用" << endl;
25 this->m_Capacity = arr.m_Capacity;
26 this->m_Size = arr.m_Size;
27 //this->pAddress = arr.pAddress;
28
29
30 //深拷贝
31 this->pAddress = new T[arr.m_Capacity];
32
33 //将arr中的数据都拷贝过来
34 for (int i = 0; i < this->m_Size; i++)
35 {
36 this->pAddress[i] = arr.pAddress[i];
37 }
38
39
40 }
41 //operator =防止浅拷贝的问题 a = b =c
42 MyArray& operator = (const MyArray& arr)
43 {
44 //cout << "Myarray的 operator= 调用" << endl;
45 //先判断原来堆区是否有数据 如果有先释放
46 if (this->pAddress != NULL)
47 {
48 delete[]this->pAddress;
49 this->pAddress = NULL;
50 this->m_Capacity = 0;
51 this->m_Size = 0;
52 }
53
54 //深拷贝
55 this->m_Capacity = arr.m_Capacity;
56 this->m_Size = arr.m_Size;
57 this->pAddress = new T[arr.m_Capacity];
58 for (int i = 0; i < this->m_Size; i++)
59 {
60 this->pAddress[i] = arr.pAddress[i];
61 }
62 return *this;
63 }
64
65 //尾插法
66 void Push_Back(const T &val)
67 {
68 //判断容量是否等于大小
69 if (this->m_Capacity == this->m_Size)
70 {
71 return;
72 }
73 //在数组末尾插入数据
74 this->pAddress[this->m_Size] = val;
75 this->m_Size++; //更新数组大小
76 }
77 //尾删法
78 void Pop_Back()
79 {
80 //让用户访问不到最后一个元素,即为尾删,逻辑删除
81 if (this->m_Size == 0)
82 {
83 return;
84 }
85 this->m_Size--;
86 }
87
88 //通过下标的方式访问数组中的元素
89 T& operator[](int index)
90 {
91 return this->pAddress[index];
92 }
93
94 //返回数组的容量
95 int getCapacity()
96 {
97 return this->m_Capacity;
98 }
99 //返回数组大小
100 int getSize()
101 {
102 return this->m_Size;
103 }
104
105
106
107
108
109 //析构函数
110 ~MyArray()
111 {
112 if (this->pAddress != NULL)
113 {
114 //cout << "Myarray析构函数调用" << endl;
115 delete[] this->pAddress;
116 this->pAddress = NULL;
117 }
118 }
119 private:
120
121 T* pAddress; //指针指向堆区开辟的真时数组
122
123 int m_Capacity; //数组容量
124
125 int m_Size; //数组大小
126 };
C++ //模板案例-数组封装类的更多相关文章
- YTU 2642: 填空题:类模板---求数组的最大值
2642: 填空题:类模板---求数组的最大值 时间限制: 1 Sec 内存限制: 128 MB 提交: 646 解决: 446 题目描述 类模板---求数组的最大值 找出一个数组中的元 ...
- 075 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 07 综合案例-数组移位-主方法功能4的实现
075 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 07 综合案例-数组移位-主方法功能4的实现 本文知识点:综合案例-数组移位-主方法功能4的实现 说明:因为 ...
- 074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现
074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现 本文知识点:综合案例-数组移位-主方法功能3的实现 说明:因为 ...
- 073 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 05 综合案例-数组移位-主方法功能1和2的实现
073 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 05 综合案例-数组移位-主方法功能1和2的实现 本文知识点:综合案例-数组移位-主方法功能1和2的实现 说 ...
- 072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法
072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法 本文知识点:综合案例-数组移位-在指定位置处插入数据方法 ...
- 071 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 03 综合案例-数组移位-显示数组当中所有元素的的方法
071 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 03 综合案例-数组移位-显示数组当中所有元素的的方法 本文知识点:综合案例-数组移位-显示数组当中所有元素 ...
- 070 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 02 综合案例-数组移位-从键盘接收数据
070 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 02 综合案例-数组移位-从键盘接收数据 本文知识点:综合案例-数组移位-从键盘接收数据 说明:因为时间紧张 ...
- 069 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 01 综合案例-数组移位-案例需求
069 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 01 综合案例-数组移位-案例需求 本文知识点:综合案例-数组移位-案例需求 说明:因为时间紧张,本人写博客 ...
- C++基础 (9) 第九天 编译器对模板类的二次编译 类模板 自定义数组类
1 昨日回顾 2 编译器对于模板的二次编译 写一个模板函数 然后进行调用 g++ template.cpp -o template // 汇编 g++ -S template.cpp –o templ ...
- C++——模板、数组类
1.函数模板:可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. 声明方法:template<typename 标识符> 函数声明 求绝对值的模板 #in ...
随机推荐
- vim 从嫌弃到依赖(19)——替换
之前讨论了关于在vim中使用正则表达式的相关知识能方便的进行搜索,现在在之前的基础之上继续来讨论如何进行替换操作. substitute 简介 substitute 允许我们先查找一段文本并用新的文本 ...
- 4.9 x64dbg 内存处理与差异对比
LyScript 插件中针对内存读写函数的封装功能并不多,只提供了最基本的内存读取和内存写入系列函数的封装,本章将继续对API接口进行封装,实现一些在软件逆向分析中非常实用的功能,例如ShellCod ...
- python-ssh链接linux查询日志,并按日志等级在控制台分颜色输出日志
import paramiko # unicode_utils.py def to_str(bytes_or_str): """ 把byte类型转换为str :param ...
- strobe
总是喜欢一个人出神,置身的场景经常是小时有趣的明晃晃的下午.也不知道为什么印象中有趣的下午的阳光总是让人睁不开眼,我也曾试图给大脑传递过"能不能将那晃眼的阳光删去",但再次置身仍是 ...
- delphi IDE 代码 恢复
- DBGRIDEH 底部多列 发现
1.设置底部行数 2.点击footers 单独对每一行进行设置 3.单独对这两行 进行设置 5.看下辅助 所以用的时候可以这样用:WeiTopTradeShow.FieldColumns['top_x ...
- IIS的基本安装和配置
实验介绍:IIS的作用 IIS是web服务器中常见的一种.当客户端想访问某个域名时,向web服务器发出请求.web服务器返回网页的代码做出回应.客户端解析代码生成网页. 一:安装IIS 1.打开一台w ...
- 《ASP.ENT Core 与 RESTful API 开发实战》(第3章)-- 读书笔记(上)
第 3 章 ASP.NET Core 核心特性 3.1 启动与宿主 ASP.NET Core 应用程序启动时,它首先会配置并运行其宿主,宿主主要用来启动.初始化应用程序,并管理其生命周期 ASP.NE ...
- Kafka-基本介绍和常见问题
1.kafka 1.1.kafka介绍 kafka是最初由linkedin公司开发的,使用scala语言编写,kafka是一个分布式,分区的,多副本的,多订阅者的消息队列系统. 1.2.kafka ...
- sensitive-word v0.13 特性版本发布 支持英文单词全词匹配
拓展阅读 sensitive-word-admin v1.3.0 发布 如何支持分布式部署? sensitive-word-admin 敏感词控台 v1.2.0 版本开源 sensitive-word ...