iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中类模板的应用你了解多少
  • 770
分享到

C++中类模板的应用你了解多少

2024-04-02 19:04:59 770人浏览 薄情痞子
摘要

目录类模板应用数组类的封装Int的.hpp文件int的测试文件Person类的.hpp文件Person类的测试文件总结类模板应用 数组类的封装 属性: 1,T *pAddress 指

类模板应用

数组类的封装

属性:

1,T *pAddress 指向堆区数组的指针。
2,int m_Capacity 数组容量
3,int m_Size 数组大小

行为:

1,myArray(int capacity) 构造函数
2,myArray(const MyArray&arr) 拷贝构造函数
3,operator= 重载赋值操作符=
4,operator[] 重载中括号[]
5,~myArray()  析构函数
6,getCapacity 获取容量
7,getSize     获取大小
8,pushback   尾插

将头文件与实现文件写到一起,后缀是.hpp

Int的.hpp文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iOStream>
using namespace std;
#include<string>
template<class T>
class MyArray
{
public:
	MyArray() {};//默认构造
	MyArray(int capacity)//有参构造
	{
		this->m_Capacity = capacity;
		this->m_Size = 0;
		this->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 < arr.m_Size; i++)//然后将数组的元素一个个的赋值过来
		{
			this->pAddress[i] = arr.pAddress[i];
		}
	}
	MyArray& operator=(const MyArray &arr)//重载赋值操作符=(返回自身的引用)
	{
		if (this->pAddress)//如果原先有数据了,那么就删除
		{
			delete[] this->pAddress;
			this->pAddress = NULL;
		}
		//然后进行深拷贝
		this->m_Capacity = arr.m_Capacity;
		this->m_Size = arr.m_Size;
		this->pAddress = new T[this->m_Capacity];//这个不能直接拷贝,需要自己重新创建
		for (int i = 0; i < arr.m_Size; i++)//然后将数组的元素一个个的赋值过来
		{
			this->pAddress[i] = arr.pAddress[i];
		}
		return *this;
	}
	T& operator[](int dex)//重载[] 为了访问数组中的值,
	{
		return this->pAddress[dex];
	}

	void pushBack(const T& val)//尾插
	{
		if (this->m_Capacity <= this->m_Size)//如果已经超过范围了
		{
			return;
		}
		this->pAddress[this->m_Size] = val;
		this->m_Size++;
	}
	int getCapacity()//获取数组容量
	{
		return this->m_Capacity;
	}
	int getSize()//获取数组大小
	{
		return this->m_Size;
	}
	~MyArray()//析构
	{
		if (this->pAddress)
		{
			delete[] this->pAddress;
			this->pAddress = NULL;
		}
	}
private:	 
	T* pAddress;//指向堆区真实数组指针
	int m_Capacity;//数组容量
	int m_Size;
};

int的测试文件

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<string>
#include"myArray.hpp"
void myPrint(MyArray<int> &myIntArray)
{
	for (int i = 0; i < myIntArray.getSize(); i++)
	{
		cout << myIntArray[i] << endl;
	}
}
int main()
{
	MyArray<int> myIntArray(100);
	for (int i = 0; i < 10; i++)
	{
		myIntArray.pushBack(i + 100);
	}
	myPrint(myIntArray);
	return 0;
}

输出结果:

100
101
102
103
104
105
106
107
108
109

以上代码证明写的数组类的封装对内置数据类型是适用的,接下来试试自定义类型Person

ps:如果识别出来了是要开辟Person类的数组的空间,需要调用Person的默认构造(有参构造不行),所以必须在Person类中加一个默认构造。

Person类的.hpp文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<string>

template<class T>
class MyArray
{
public:
	MyArray() {};//默认构造
	MyArray(int capacity)//有参构造
	{
		this->m_Capacity = capacity;
		this->m_Size = 0;
		this->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 < arr.m_Size; i++)//然后将数组的元素一个个的赋值过来
		{
			this->pAddress[i] = arr.pAddress[i];
		}
	}
	MyArray& operator=(const MyArray &arr)//重载赋值操作(返回自身的引用)
	{
		if (this->pAddress)//如果原先有数据了,那么就删除
		{
			delete[] this->pAddress;
			this->pAddress = NULL;
		}
		//然后进行深拷贝
		this->m_Capacity = arr.m_Capacity;
		this->m_Size = arr.m_Size;
		this->pAddress = new T[this->m_Capacity];//这个不能直接拷贝,需要自己重新创建
		for (int i = 0; i < arr.m_Size; i++)//然后将数组的元素一个个的赋值过来
		{
			this->pAddress[i] = arr.pAddress[i];
		}
		return *this;
	}
	T& operator[](int dex)//重载[] 为了访问数组中的值,
	{
		return this->pAddress[dex];
	}

	void pushBack(const T& val)//尾插
	{
		if (this->m_Capacity <= this->m_Size)//如果已经超过范围了
		{
			return;
		}
		this->pAddress[this->m_Size] = val;
		this->m_Size++;
	}
	int getCapacity()//获取数组容量
	{
		return this->m_Capacity;
	}
	int getSize()//获取数组大小
	{
		return this->m_Size;
	}
	~MyArray()//析构
	{
		if (this->pAddress)
		{
			delete[] this->pAddress;
			this->pAddress = NULL;
		}
	}
private:	 
	T* pAddress;//指向堆区真实数组指针
	int m_Capacity;//数组容量
	int m_Size;
};

Person类的测试文件

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<string>
#include"myArray.hpp"
class Person
{
public:
	Person() {};
	string m_name;
	int m_age;
	Person(string name, int age)
	{
		this->m_age = age;
		this->m_name = name;
	}
};
void myPrintInt(MyArray<int> &myIntArray)//int的
{
	for (int i = 0; i < myIntArray.getSize(); i++)
	{
		cout << myIntArray[i] << endl;
	}
}
void myPrintPerson(MyArray<Person>& myPersonArray)//Person的
{
	for (int i = 0; i < myPersonArray.getSize(); i++)
	{
		cout << myPersonArray[i].m_name << " " << myPersonArray[i].m_age << endl;
	}
}
int main()
{
	
	MyArray<Person>myPersonArray(100);
	Person p1("小明", 18);
	Person p2("小宏", 18);
	Person p3("小量", 19);
	Person p4("小应", 18);
	myPersonArray.pushBack(p1);
	myPersonArray.pushBack(p2);
	myPersonArray.pushBack(p3);
	myPersonArray.pushBack(p4);
	myPrintPerson(myPersonArray);
	cout << "数组容量:"<<myPersonArray.getCapacity()<< endl;//100
	cout << "数组大小:" << myPersonArray.getSize() << endl;//4
	return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容! 

--结束END--

本文标题: C++中类模板的应用你了解多少

本文链接: https://www.lsjlt.com/news/139921.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++中类模板的应用你了解多少
    目录类模板应用数组类的封装Int的.hpp文件int的测试文件Person类的.hpp文件Person类的测试文件总结类模板应用 数组类的封装 属性: 1,T *pAddress 指...
    99+
    2024-04-02
  • C++ 中模板类和模板函数的应用场景?
    模板类和模板函数在 c++++ 中通过参数化类型提供代码重用性。模板类允许创建通用类,如容器类,适用于各种数据类型。模板函数允许创建处理不同数据类型的函数,如排序算法和数学函数。通过使用...
    99+
    2024-04-24
    模板函数 模板类 c++ 标准库
  • 容器在 Python 中的应用,你了解多少?
    Python 是一门流行的编程语言,它有着丰富的数据结构和容器类型,这些容器类型可以让我们更加方便地处理数据和对象。本文将会介绍 Python 中的几种常见容器类型,以及它们的应用和一些示例代码。 列表(List) 列表是 Pytho...
    99+
    2023-07-02
    容器 http shell
  • node.js-path模块你了解多少
    目录1、什么是path模块2、路径拼接1、 path.join() 的语法格式2、path.join()代码示例3、文件读取路径改写3、获取路径中的文件名1、 path.basena...
    99+
    2024-04-02
  • Java中缓存技术的应用,你了解多少?
    随着互联网的快速发展,越来越多的应用程序需要处理大量的数据,而这些数据的读取速度往往成为瓶颈。这时候,缓存技术就成为了一种重要的解决方案。在Java中,缓存技术也得到了广泛的应用,本文将介绍Java中缓存技术的应用。 一、什么是缓存 缓存...
    99+
    2023-06-30
    缓存 自然语言处理 shell
  • NumPy在ASP编程中的应用,你了解多少?
    NumPy是Python中最常用的科学计算库之一。它提供了高效的多维数组操作和数学函数,是数据科学、机器学习和科学计算等领域中的重要工具。在ASP编程中,NumPy也有着广泛的应用。本文将介绍NumPy在ASP编程中的应用,帮助读者更好地...
    99+
    2023-07-02
    编程算法 索引 numy
  • JavaScript的数据类型你了解多少
    JavaScript的数据类型你了解多少,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 前言作为JavaScript...
    99+
    2024-04-02
  • JavaScript的引用数据类型你了解多少
    目录三种传递1、Object1、创建对象语法2、普通对象在内存中的存储方式2、Array1、创建数组语法2、数组的在内存中的存储方式3、数组常用方法1、 concat:用于拼接为新数...
    99+
    2024-04-02
  • C++的原生数组你了解多少
    目录1.数组1.1 数组的声明格式1.1.1. 格式一1.1.2. 格式二1.2.数组的本质2. 数组遍历2.1. 常规2.2. C++ 11 遍历新语法2.2.1. 格式一2.2....
    99+
    2024-04-02
  • 二维码在Python开发中的应用,你了解多少?
    随着移动互联网的不断发展,二维码作为一种快速传递信息的工具,已经广泛应用于各个领域。在Python开发中,二维码也有着广泛的应用。本文将介绍二维码在Python开发中的应用,并附上一些实用的演示代码。 一、二维码的生成 在Python中,...
    99+
    2023-10-13
    日志 开发技术 二维码
  • Go 存储函数在 Laravel 中的应用,你了解多少?
    在 Laravel 中,我们经常需要对数据库进行操作,而存储函数是一种可以让我们更方便地操作数据库的方法。本文将介绍如何在 Laravel 中使用 Go 存储函数,让我们一起来了解一下吧。 什么是存储函数? 存储函数是一种可以在数据库中创...
    99+
    2023-11-08
    存储 laravel 函数
  • Java框架在Windows系统中的应用,你了解多少?
    Java作为一种跨平台的编程语言,其优势在于可以在不同的操作系统上运行,而且Java框架在Windows系统中的应用也是非常广泛的。本文将介绍Java框架在Windows系统中的应用,让读者了解Java框架在Windows系统中的应用场景...
    99+
    2023-06-25
    框架 windows 关键字
  • GO语言中Windows Shell接口的应用,你了解多少?
    随着计算机应用的日益普及,Windows操作系统已经成为了世界上最流行的操作系统之一。而在Windows系统中,Shell接口是至关重要的一个组件。Shell接口可以让用户与操作系统交互,管理文件和文件夹,运行应用程序等等。而GO语言作为...
    99+
    2023-09-20
    windows shell 接口
  • NumPy技术在Python开发中的应用,你了解多少?
    NumPy是Python中一个重要的数值计算库,它提供了高效的多维数组对象以及相关的计算工具,是Python科学计算的核心库之一。本文将介绍NumPy的基本特性、使用方法以及在Python开发中的应用。 一、NumPy的基本特性 多维...
    99+
    2023-05-26
  • Java在分布式系统中的应用,你了解多少?
    随着互联网技术的不断发展,分布式系统已经成为了现代计算机领域的一个重要研究方向。而在分布式系统中,Java作为一种高性能、跨平台的编程语言,也得到了广泛的应用。本文将介绍Java在分布式系统中的应用,帮助读者更好地理解Java在分布式系统...
    99+
    2023-08-31
    分布式 linux path
  • python数据类型中的字符串你了解多少
    目录一、字符串创建二、字符串的下标str[beg:end]三、字符串的切片:slice(start, stop[, step])四、字符串格式化:# %s——...
    99+
    2024-04-02
  • Java中的异常你了解多少?
    目录 一.认识异常二.异常分类三.异常的分类1.编译时异常2.运行时异常 四.异常的处理1.LYBL:事前防御型2.EAFP:事后认错型 五.异常的抛出Throw==注意事项== 六.异常的捕获1.异常的捕获2.异常声明...
    99+
    2023-12-22
    java python 开发语言
  • C++深入了解模板的使用
    目录一.泛型编程二.函数模板1.函数模板概念2.函数模板格式3.函数模板的原理三.类模板一.泛型编程 泛型编程:不再是针对某种类型,能适应广泛的类型,跟具体的类型无关的代码 如何实现...
    99+
    2024-04-02
  • 缓存技术在 Java 开发中的应用,你了解多少?
    缓存是一种在计算机系统中常见的技术,其可以将数据临时存储在快速访问的地方,以提高数据的访问速度。在 Java 开发中,缓存技术也是一种非常重要的技术,其可以帮助开发者提高应用程序的性能和响应速度。在本文中,我们将深入探讨缓存技术在 Jav...
    99+
    2023-11-05
    学习笔记 开发技术 缓存
  • JavaScript的对象和包装类你了解多少
    目录一、对象1.1 描述对象1.2 属性的增删改查(以下需要在控制台输入)1.3 对象的创建方法1.3.1 字面量1.3.2 构造函数1.3.3 Object.create(原型)方...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作