c++之类模板案例
时间:2022-07-23
本文章向大家介绍c++之类模板案例,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
描述:使用一个通用的数组类,要求如下:
1.可以对内置数据类型以及自定义数据类型进行存储;
2.将数组中的数据存储到堆区;
3.构造函数中可以传入数组的容量;
4.提供对应的拷贝函数以及operator=防止浅拷贝问题;
5.提供尾插法和尾删法对数组中的元素进行增加和删除;
6.可通过下标进行访问数组中的元素;
7.可以获得数组中当前元素的个数以及容量;
头文件:MyArray.hpp
#include<iostream>
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() {
cout << "析构函数调用" << endl;
if (this->pAddress != NULL) {
delete[] this->pAddress;
this->pAddress = NULL;
}
}
//拷贝构造
MyArray(const MyArray& arr) {
cout << "拷贝构造函数调用" << endl;
this->m_Capacity = arr.m_Capacity;
this->m_Size = arr.m_Size;
//this->pAddress = arr.pAddress;
//深拷贝
this->pAddress = new T[arr.m_Capacity];
//还要将原有数据拷贝过来
for (int i = 0; i < this->m_Size; i++) {
this->pAddress[i] = arr.pAddress[i];
}
}
//operator=也是为了防止浅拷贝问题
MyArray& operator=(const MyArray& arr) {
cout << "重载=调用" << endl;
//先判断原来的堆区是否有数据,如果有先释放
if (this->pAddress != NULL) {
delete[] this->pAddress;
this->pAddress = NULL;
this->m_Size = 0;
this->m_Capacity = 0;
}
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) {
return;
}
this->pAddress[this->m_Size] = val;
this->m_Size++;
}
//尾删法
void Pop_back() {
if (this->m_Size == 0) {
return;
}
this->m_Size--;
}
//通过数组下标访问数据
T& operator[](int index) {
return this->pAddress[index];
}
//返回数组的容量
int getCapacity() {
return this->m_Capacity;
}
//返回数组的大小
int getSize() {
return this->m_Size;
}
private:
T* pAddress;//指针指向堆区开辟的真实数组
int m_Capacity;//容量
int m_Size;//数组大小
};
源文件:test.cpp
#include "myArray.hpp"
void printArr(MyArray <int>& arr) {
for (int i = 0; i < arr.getSize(); i++) {
cout << arr[i] << " ";
}
cout << endl;
}
void test() {
MyArray <int>arr1(5);
//MyArray <int>arr2(arr1);
//MyArray <int>arr3(10);
//arr3 = arr1;
//插入数据
arr1.Push_Back(1);
arr1.Push_Back(2);
cout << "插入之后的数组:" << endl;
printArr(arr1);
cout << "删除最后一个元素的数组:" << endl;
arr1.Pop_back();
printArr(arr1);
cout << "此时数组的大小:" << arr1.getSize()<<endl;
cout << "此时数组的容量:" << arr1.getCapacity() << endl;
}
int main() {
test();
system("pause");
return 0;
}
运行结果:
- MySQL自增列主从不一致的测试(r12笔记第37天)
- 分享Mac/Linux系统Shell终端利器SecureCRT以及注册破解方法
- MySQL中GTID和自增列的数据测试(r12笔记第38天)
- 分享一个入门级可控多线程shell脚本方案
- PhalGo-介绍
- 实测Nginx服务器开启pagespeed加速效果
- MySQL频繁停库的问题分析(r12笔记第33天)
- 解决Nginx Helper插件一键清理缓存功能导致网站打不开问题
- Oracle 12c DBCA浅析(r12笔记第48天)
- MySQL中的derived table(r12笔记第47天)
- Oracle数据库端口突然无法访问的分析(r12笔记第46天)
- MySQL中的反连接(r12笔记第45天)
- Nginx配置多站点下的Proxy_cache或Fastcgi_cache缓存加速
- MySQL主从不一致的细小问题分析(r12笔记第62天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 小生归一(六)xss特殊绕过
- 最新绕过D盾注入方法分享(学姿势)
- 利用C#编写的绕过360安全卫士添加系统用户
- 小生归一(七)sprintf字符串格式化漏洞
- FastAdmin后台GetShell
- scRNA-seq Clustering
- Dizzy Blog
- LeetCode 392. 判断子序列
- LeetCode 5473. 灯泡开关 IV
- LeetCode 5472. 重新排列字符串
- BootStrap 导航栏实现下滑消失,上滑出现
- 七日Python之路--第六天
- 超性感的React Hooks(六)自定义hooks的思维方式
- 七日Python之路--第五天(之找点乐子)
- 超性感的React Hooks(七)useReducer