C++回顾(十五)—— 类模板

news2024/11/15 19:38:39

15.1 为什么要有类模板

  • 类模板用于实现类所需数据的类型参数化
  • 类模板在表示如数组、表、图等数据结构显得特别重要,这些数据结构的表示和算法不受所包含的元素类型的影响

15.2 单个类模板语法

在这里插入图片描述
在这里插入图片描述
注意:类模板的创建对象一定要显示调用(指明类型)
在这里插入图片描述
完整示例代码:

#include <iostream>

using namespace std;

template <typename T, typename U>
class Test
{
private:
	T a;
	U b;
public:
	Test(T a, U b)
	{
		this->a = a;
		this->b = b;
	}
	void show()
	{
		cout << a << " " << b << endl;
	}
};

int main()
{
	Test<int, char> t(1, 'a');   //类模板创建对象一定要显式调用
	t.show();

	return 0;
}

运行结果:
在这里插入图片描述

15.3 继承中的类模板语法

父类:
在这里插入图片描述

15.3.1 派生出普通类

模板类派生普通类 继承的同时对基类实例化
在这里插入图片描述

15.3.2 派生出模板类

模板类派生模板类 继承的同时不需要对Parent实例化,但是要声明虚拟类型
在这里插入图片描述
完整示例代码:

#include <iostream>

using namespace std;

template <typename T>
class Parent
{
protected:
	T a;
public:
	Parent(T a)
	{
		this->a = a;
	}
	void show()
	{
		cout << a << endl;
	}
};

class Child : public Parent<int>   //模板类派生普通类  继承的同时对基类实例化
{
public:
	Child(int a) : Parent(a)
	{
		
	}
	void show()
	{
		cout << a << endl;
	}
};

template <typename T, typename U>
class Child2 : public Parent<T>   //模板类派生模板类  继承的同时不需要对Parent实例化
{
private:
	U b;
public:
	Child2(T a, U b) : Parent<T>(a)
	{
		this->b = b;
	}
	void show()
	{
		cout << this->a << " " << b << endl;
	}
};

int main()
{
	Child c1(1);
	c1.show();

	Child2<int, double> c2(1, 1.11);
	c2.show();

	return 0;
}

运行结果:
在这里插入图片描述

15.4 类模板相关说明

15.4.1 所有的类模板函数写在类的内部

这种方式最为省事,简单

15.4.2 所有的类模板函数写在类的外部,在同一个cpp中

类内只做了函数声明:
在这里插入图片描述
具体的实现实在类的外部:
在这里插入图片描述
完整示例代码:

#include <iostream>

using namespace std;

template <typename T>
class Test
{
private:
	T a;
public:
	Test(T a);
	void show();
	~Test();
};

template <typename T>
Test<T>::Test(T a)     //Test<T>表示Test是模板类,不是普通类
{
	this->a = a;
}

template <typename T>
void Test<T>::show()
{
	cout << a << endl;
}

template <typename T>
Test<T>::~Test()
{
	
}

int main()
{
	Test<int> t(1);
	t.show();

	return 0;
}

运行结果:
在这里插入图片描述

15.4.3 所有的类模板函数写在类的外部,在不同的.h和.cpp中

这里实现了一个数组的模板类:

array.h
在这里插入图片描述
arrary.hpp文件(注意:这里是.hpp文件)
在这里插入图片描述
main.cpp文件
在这里插入图片描述

15.5 类模板中的static关键字

  • 从类模板实例化的每个模板类有自己的类模板数据成员,该模板类的所有对象共享一个static数据成员
  • 和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定义和初始化
  • 每个模板类有自己的类模板的static数据成员副本

注意:静态成员变量要在类的外部进行初始化
在这里插入图片描述
完整示例代码:

#include <iostream>

using namespace std;

template <typename T>
class Test
{
private:
	T a;
public:
	static int count;
public:
	Test(T a)
	{
		this->a = a;
		count++;
	}
};

template <typename T>
int Test<T>::count = 0; // 在类的外部进行初始化

int main()
{
	Test<int> t1(1);
	Test<int> t2(1);
	Test<int> t3(1);
	Test<int> t4(1);
	Test<int> t5(1);

	Test<char> t6('a');
	Test<char> t7('a');
	Test<char> t8('a');

	cout << Test<int>::count << endl; // 5
	cout << Test<char>::count << endl; // 3

	return 0;
}

在这里插入图片描述

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

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

相关文章

虹科分享 | 网络安全评级 | 突破能够让您变得更加强大

有两种CISO&#xff1a;入侵前和入侵后。入侵前的CISOs过于关注工具&#xff0c;并考虑投资于预防技术。在这样做的时候&#xff0c;他们几乎没有考虑一旦发生了不好的事情&#xff0c;恢复和及时恢复服务的问题。不好的事情会发生&#xff1b;这不是是否的问题&#xff0c;而是…

手把手教你如何做数据报表

数据报表是一种数据可视化形式&#xff0c;它将复杂的数据信息通过图形、表格等形式进行展示和解释&#xff0c;让人们更加直观地理解和分析数据。数据报表已成为现代企业决策的必备工具之一。对企业来说&#xff0c;数据报表有很多用处。首先&#xff0c;数据报表可以帮助企业…

基于BiLSTM+CRF医学病例命名实体识别项目

研究背景 为通过项目实战增加对命名实体识别的认识&#xff0c;本文找到中科院软件所刘焕勇老师在github上的开源项目&#xff0c;中文电子病例命名实体识别项目MedicalNamedEntityRecognition。对其进行详细解读。 原项目地址&#xff1a;https://github.com/liuhuanyong/Med…

一小时轻松掌握Git,看这一篇就足够

文章目录序言&#xff1a;版本控制分类一、Git环境配置下载卸载安装二、常用linux命令三、基本配置四、Git基本操作0.原理图1.项目创建及克隆方式一&#xff1a;本地仓库搭建方式二&#xff1a;克隆远程仓库2.文件操作3.配置ssh公钥4.分支5.push代码参考序言&#xff1a;版本控…

ORB_SLAM2+kinect稠密建图

下载代码&#xff1a;https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map 运行代码&#xff1a; 解压代码后&#xff0c;删掉作者自己编译的build文件夹&#xff08;下面三个都删除&#xff09;&#xff1a; ~/ORB_SLAM2_modified/build, ~/ORB_SLAM2_modified/T…

【上传项目代码到Git详细步骤】

1.下载安装Git到电脑上&#xff08;这里我之前已经安装好了&#xff0c;就不细说了&#xff09;2.进入控制台安装好后右键点击桌面空白部分会多出两个菜单选项&#xff0c;点击第二个Git Bash Here&#xff08;点击第一个你会爆炸&#xff09;会弹出一个git控制台&#xff0c;如…

华为OD机试用Python实现 -【分解质因数】 2023Q1A

华为OD机试题 本篇题目:分解质因数题目示例 1输入输出示例 2输入输出Code代码编写思路最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南

从0-1搭建交付型项目管理体系流程(上)【宝芝林2】

很多项目经理在这个阶段&#xff0c;由于经验不足及整个项目管理体系涉及的环节和内容比较庞杂&#xff0c;往往无法有效思考&#xff0c;无从下手。笔者有幸在最近几年的工作实践中&#xff0c;实际搭建并迭代了2-3次项目管理体系流程框架&#xff0c;期间也经历过很多迷茫&am…

C++基础了解-21-C++ 继承

C 继承 一、C 继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类&#xff0c;这使得创建和维护一个应用程序变得更容易。这样做&#xff0c;也达到了重用代码功能和提高执行效率的效果。 当创建一个类时&#xff0c;不需要重新编写新的…

mes系统如何管理企业生产

随着市场竞争的日趋激烈&#xff0c;很多企业都开始意识到生产管理的重要性。mes系统如何管理企业生产&#xff1f;下面&#xff0c;我们通过一个实例来说明。 案例简介&#xff1a; 一、客户需求快速增长 随着市场竞争的加剧&#xff0c;越来越多的客户提出了个性化需求。同…

人体存在传感器成品方案,精准感知静止存在,实时智能化感控技术

随着现今智能时代的发展&#xff0c;酒店也越来越趋于智能化&#xff0c;也在不断地推行智慧酒店&#xff0c;这也给人们入住酒店提供了良好的体验。 人体存在感知是智能酒店中极其重要的一项应用技术&#xff0c;只有智能设备通过精准地感知人体存在&#xff0c;才能更好地做…

2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

目录前言C左值和右值二、右值引用二、右值引用前言 对于C的左值和右值相信很多人都没有一个很透彻的了解,之前我也是不懂的时候查阅了好多文章,但是讲完我还是一头雾水,直到我遇到一篇宝藏文章,讲的左值右值的关系以及Move函数的用法是相当的清楚,文章链接在这,话不多说讲解一…

C++ ,JNI, Java 数据传递全解(一)

在讲正题之前&#xff0c;先说一下C&#xff0c;JNI和Java 对应的数据类型对比吧&#xff0c;废话不多说&#xff0c;直接上图上面为C&#xff0c;Java&#xff0c;JNI 三者只见对应的数据类型好了&#xff0c;现在我们有了上面的数据类型比对&#xff0c;下面就讲讲从C如何将数…

MySQL的下载及安装详细教程

提示&#xff1a;本文仅为MySQL初学者的安装MySQL过程提供参考&#xff0c;创作不易&#xff0c;请多点赞支持&#xff01; MySQL的下载及安装前言一、MySQL的下载及安装1.MySQL的下载2.MySQL的安装3.配置环境变量4.连接MySQL4.1 方式一4.2 方式二前言 本文内容主要是帮助初学…

OpenWrt 制作软件包05

文章目录 OpenWrt 制作软件包05软件包目录结构分析软件包顶层Makefile分析OpenWrt一些常用的变量一些默认的变量Package宏定义Build宏定义构建自己的软件系统软件包工程目录文件内容分析编译安装卸载OpenWrt 制作软件包05 软件包目录结构分析 如下图所示 :

4N65-ASEMI高压MOS管4N65

编辑-Z 4N65在TO-220封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为2.5Ω&#xff0c;是一款N沟道高压MOS管。4N65的最大脉冲正向电流ISM为16A&#xff0c;零栅极电压漏极电流(IDSS)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。4N65功耗&#xff08…

[工控自动化]信捷PLC与威纶通HMI以太网通讯的连接设置

在工业自动化领域,PLC和触摸屏是经常使用的元器件,其中PLC是处理逻辑与数据的核心,而触摸屏HMI则是显示与操作的必备。 工控领域虽然是外国品牌的天下,但近些年来,国产PLC和HMI品牌也在成长,例如汇川、信捷、威纶通等。 本文以实际使用经验,介绍一下信捷PLC与威纶通HMI的…

java实用小技巧:判断list是否有重复项

在项目中经常会遇到这样的场景&#xff0c;就是一个list&#xff0c;根据某种规则&#xff0c;我要去判断里面是不是有重复的项。 难度不高&#xff0c;但有点烦&#xff0c;所以专门开一篇文章来记录一下&#xff0c;争取弄一个相对简洁的写法。 先看一个简单的例子&#xf…

DSF深度搜索时到底是如何回溯的(小tip)

这一段让我迷了两次&#xff0c;为什么回溯的时候&#xff0c;恢复了最后一位&#xff0c;往上递归一层之后&#xff0c;把最后一位填在它前一位&#xff0c;但是原本的前一位没有恢复&#xff0c;最后一位要怎么办&#xff1f;其实这还是递归没明白 也就是这一步是如何实现的 …

Kafka 压缩算法

压缩 (compression) : 用时间换空间的思想 用较小的 CPU 开销获得磁盘少占用或网络 I/O 少传输 Kafka 消息分两层&#xff1a; 消息日志组成 : n 个消息集合消息集合 (message set) 组成 : n 条日志项 (record item)日志项封装了消息 (message)Kafka 在消息集合层上进行写入…