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 ...
随机推荐
- TortoiseGit 合并分支方法
1.首先当前分支 "提交" 并 "推送" 到服务器上,比如开发分支 dev 合并到 master 上 2.右键 > "切换分支" 到要 ...
- Gin 路由注册与请求参数获取
目录 一.Web应用开发的两种模式 1.前后端不分离模式 2.前后端分离模式 二.RESTful介绍 三.API接口 3.1 RESTful API设计指南 3.2 API与用户的通信协议 3.3 R ...
- 【4】jupyter notebook快速入门、以及常用快捷键使用
相关文章: [1]Anaconda安装超简洁教程,瞬间学会! [2]Anaconda下:ipython文件的打开方式,Jupyter Notebook中运行.py文件,快速打开ipython文件的方法 ...
- C++ CryptoPP使用RSA加解密
Crypto++ (CryptoPP) 是一个用于密码学和加密的 C++ 库.它是一个开源项目,提供了大量的密码学算法和功能,包括对称加密.非对称加密.哈希函数.消息认证码 (MAC).数字签名等.C ...
- Webpack基础学习(一) (未完结)
一.Webpack介绍与基本使用 1.1.Webpack是什么? Webpack 是一个静态资源打包工具. 它会以一个或多个文件作为打包的入口,将我们整个项目所有文件编译组合成一个或多个文件输出出去. ...
- mysql删除表中重复记录
1.创建测试表,并插入数据 create table test( id int(11) primary key auto_increment comment '用户编号', username varc ...
- 戴尔R7920工作站利用PVE开启vGPU,实现工作站虚拟化(ShareStation)
介绍 本文介绍了使用Proxmox VE(PVE) + DoraCloud,将一台Dell R7920图形工作站(配置有NVIDIA RTX A6000显卡)实现工作站虚拟化.可以满足多个设计用户同时 ...
- 2.列表--《Python编程:从入门到实践》
2.1 列表 列表由一系列按特定顺序排列的元素组成.在Python中,用方括号([])来表示列表,并用逗号来分隔其中的元素. bicycles = ['trek', 'cannondale', ' ...
- Java注解支持的类型
我们经常会自定义注解,自定义注解时,可能会需要定义各种数据类型,但是自定义注解可以包含哪些数据类型,是存在限制的. 主要有如下几种: A primitive type : 基本类型(java的八种基本 ...
- Delphi Vista,Win7,Win8 的 Uac,管理员身份运行
要用就用下面我自己总结的官方的做法: 1.首先搜到delphi 自带的manifest,然后在其基础上改一个单词 2.将里面的asInvoker改为requireAdministrator 3.修改为 ...