C++核心编程和桌面应用开发 第十天(模版 类模板)

news2025/1/15 8:32:47

目录

1.1函数模板语法

1.2函数模板的使用方式

1.2.1自动类型推导

1.2.2显示指定类型

1.3普通函数与模板函数

1.3.1区别

1.3.2调用规则

1.4模板的局限性

1.4.1模板的具体化

1.5类模板

1.5.1基本语法

1.5.2类模板对象做函数参数

1.5.3类模板与继承

1.5.4类模板成员函数类外实现

1.5.5类模板分文件编写

1.5.6类模板与友元

1.5.6.1类内实现

1.5.6.2类外实现

 1.5.7举例:通过类模板创建数组类MyArray


1.1函数模板语法

建立通用的模具,大大提高复用性,模板只是一个框架,不可以直接使用

//T代表数据类型
template<typename T>

void mySwap(T& a, T& b)
{
	T temp = a;
	a = b;
	b = temp;
}

1.2函数模板的使用方式

1.2.1自动类型推导

int a = 10;
int b = 20;

mySwap(a, b);

编译器会自动推导出T的类型为int

1.2.2显示指定类型

int a = 10;
int b = 20;

mySwap<int>(a, b);

明确指定T的类型为int 

注意事项:

①自动类型推导,必须正确推出T的类型,否则无法成功调用函数

 ②模版必须指定或推导出T的类型,否则不可单独使用

1.3普通函数与模板函数

1.3.1区别

  • 普通函数调用时,可以发生自动类型转换(隐式类型转换);
  • 函数模板调用时,若利用自动类型推导,不会发生隐式类型转换;若利用显示指定类型,可以发生隐式类型转换。

1.3.2调用规则

  • 函数模板和普通函数都可以实现时,优先使用普通函数
  • 可以通过空模板参数列表强制调用函数模板
  • 函数模板可以重载
  • 若函数模板可以产生更好的匹配,优先调用函数模板

注意:通过函数模板产生的函数,称为模板函数

myPrint(c1,c2)会调用函数模板,因为若调用普通函数,会进行类型转换,而调用函数模板,直接就能获取到数据类型,代价更小,因此调用函数模板

1.4模板的局限性

解决办法:

  • 运算符重载。重载运算符>
  • 为特定的类型(Person)提供具体化的模板

1.4.1模板的具体化

普通模板:

template<class T>
bool myCompare(T& a, T& b)
{
	if (....)
	...
}

具体化语法:以template<>开头,通过名称指出类型(提供对比功能的函数模板)

template<>bool myCompare(Person& a, Person& b)
{
	if (....)
	...
}

注意:若参数类型符合模板具体化的参数类型时,模板的具体化调用优先于普通模板的调用

1.5类模板

1.5.1基本语法

//typename也可以用class替换
template<typename T>
class ...
{
    ...
};

建立一个通用类,类中成员的数据类型不固定

注意事项:

1.模板参数列表可以有默认参数;

2.类模板没有自动推导;

3.类模板中的成员函数在被调用的时候才被创建

1.5.2类模板对象做函数参数

类模板如下:

 1. 指定传入类型。即形参的模板参数列表明确数据类型

void doWork1(Person<string,int>& p);

2.参数模板化。即形参的模板参数列表也变为通用类型

注意:typeid(T).name() 查看T的数据类型

3.整个类模板化。即形参中对象的类型变为模板

1.5.3类模板与继承

①父类为类模板时,子类在继承时必须指定父类中T的类型,否在无法给子类分配内存

②父子类均为类模板时,在子类继承时,将模板参数列表改为T

1.5.4类模板成员函数类外实现

语法:

template<class T>
返回值类型 类名<T>::成员函数名(形参列表)

1.5.5类模板分文件编写

分文件编写会产生错误,因为类模板成员函数是在被调用时才创建的,分文件编写后,只能访问头文件,访问不到源文件的内容

解决办法:

  • 将源文件包含进来。此做法不安全
  • 将源文件和头文件结合到一个文件中,即hpp中

1.5.6类模板与友元

1.5.6.1类内实现

1.5.6.2类外实现

在类中声明友元时,需将printPerson作为函数模板声明,语法如下:

friend void printPerson<>(Person<T1,T2>& p);

注意:

  • 若函数实现写在类之前,需要提前声明类之后使用
  • 若函数实现写在类之后,需要提前声明函数和类之后使用

 1.5.7举例:通过类模板创建数组类MyArray

template<class T>
class MyArray
{
public:
	//有参构造
	MyArray(int capacity)
	{
		m_Capacity = capacity;
		m_Size = 0;
		pAddress = new T[m_Capacity];
	}

	//拷贝构造
	MyArray(const MyArray& arr)
	{
		m_Capacity = arr.m_Capacity;
		m_Size = arr.m_Size;
		if (nullptr != arr.pAddress)
		{
			pAddress = new T[m_Capacity];
			strcpy(arr.pAddress, pAddress, m_Size);
		}
	}

	//析构函数
	~MyArray()
	{
		if (nullptr != pAddress)
		{
			delete[] pAddress;
			pAddress = nullptr;
		}
	}

	//operator=
	MyArray& operator=(const MyArray& arr)
	{
		if (nullptr != pAddress)
		{
			delete[] pAddress;
			pAddress = nullptr;
		}
		m_Capacity = arr.m_Capacity;
		m_Size = arr.m_Size;
		pAddress = new T[m_Capacity];
		strcpy(arr.pAddress, pAddress, m_Size);

		return *this;
	}

	//operator[]
	T& operator[](int pos)
	{
		return pAddress->[pos];
	}

	//尾插
	void pushBack(T val)
	{
		if (m_Capacity == m_Size)
		{
			return;
		}
		pAddress[m_Size] = val;
		m_Size++;
	}

	//删掉末尾元素
	void popBack()
	{
		if (m_Size == 0 || m_Capacity == 0)
		{
			return;
		}
		m_Size--;
	}

	//获取容量
	int getCapacity()
	{
		return m_Capacity;
	}

	//获取当前大小
	int getSize()
	{
		return m_Size;
	}
private:
	int m_Capacity;

	int m_Size;

	T* pAddress;
};

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

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

相关文章

STM32-----I2C

1.基本原理&#xff1a; 上图是I2C的总线图和通讯协议图&#xff08;就是I2C是怎么实现设备之间读写数据的&#xff09; 下面主要介绍通讯协议的每一步&#xff1a; 1.发出开始信号: 一开始都为高电平为空闲状态。当SCL为高电平时&#xff0c;主机将SDA拉低即为发出开始信号&…

hadoop集群搭建-安装虚拟机

2.1 安装虚拟机 在本地搭建集群就需要这么几个事 装虚拟机 安装环境 配置集群 启动 这篇博客主要就是讲的装虚拟机这一个环节的 装虚拟机就是和组装一台现实中的电脑一样&#xff0c;首先来说就是要有硬件&#xff0c;就是组装硬件&#xff0c;然后就是装系统&#xff…

SpringCloud学习记录|day5

学习材料 2024最新SpringCloud微服务开发与实战&#xff0c;java黑马商城项目微服务实战开发&#xff08;涵盖MybatisPlus、Docker、MQ、ES、Redis高级等&#xff09; 目前讲过的 可惜&#xff0c;自己基本没理解。 雪崩问题 1.服务保护&#xff1a; 请求限流&#xff0c;线…

量化择时技术指标详解及实战应用(一)

🌟作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~🍊个人主页:小高要坚强的博客🍓当前专栏:《Python之量化交易》🍎本文内容:量化择时技术指标详解及实战应用(一)🌸作者“三要”格言:

从零开始使用最新版Paddle【PaddleOCR系列】——文本检测和识别模型的环境安装与基础使用

目录 一、环境安装配置 1.基本环境配置&#xff1a;torch与paddlepaddle安装 2.专精任务配置&#xff1a;PaddleX与PaddleOCR插件安装 3.测试数据配置&#xff1a;测试数据集下载与验证 二、模型基础使用 1.使用OCR模型预测 ​ 2.使用Detect检测模型 ​ 3.使用…

【论文笔记】Fine-tuned CLIP Models are Efficient Video Learners

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Fine-tuned CLIP Models a…

QT实现改变窗口大小其子控件也自动调节大小

创建一个顶层布局即可&#xff0c;一定要在MainWindows或者Widget的下面&#xff01; 观察图标变化 带有禁止的意思是分拆布局&#xff08;当前无布局&#xff09; 现在是添加布局后了 注意&#xff1a;一定是在MainWindows或Widget才可以添加顶层布局&#xff0c;才可以实现…

antDesign Form.List下的Form.Item如何通过setFieldsValue设置值

翻了一下antDesign官网只看见了Form可以使用setFieldsValue设置值&#xff0c;却没找到Form.List使用setFieldsValue设置值。 于是研究了一下&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 我的解决方案是&#xff1a; 先设置为空数组, 再设置成…

241014-绿联UGOSPro-通过虚拟机访问主机的用户目录及文件夹

如图所示&#xff0c;两种方式&#xff1b; 方式1: 通过Files中的Other Locations 添加主机ip&#xff0c;随后输入主机的用户名及密码即可系统及文件加载可能需要一段时间&#xff0c;有点卡&#xff0c;加载完应该就可以点击访问了 方式2: 通过命令行直接ssh/sftp userna…

解锁C++继承的奥秘:从基础到精妙实践(下)

文章目录 前言&#x1f950;五、多继承&#xff0c;菱形继承和菱形虚拟继承&#x1f9c0;5.1 多继承&#x1f9c0;5.2 菱形继承&#x1f9c0;5.3 虚拟继承&#xff08;解决菱形继承问题&#xff09;5.3.1 虚拟继承的语法&#xff1a;5.3.2 虚拟继承示例&#xff1a; &#x1f9…

C语言 | Leetcode C语言题解之第479题最大回文数乘积

题目&#xff1a; 题解&#xff1a; int largestPalindrome(int n){if (n 1) {return 9;}int upper pow(10, n) - 1;for (int left upper;; --left) { // 枚举回文数的左半部分long p left;for (int x left; x > 0; x / 10) {p p * 10 x % 10; // 翻转左半部分到其自…

相机畸变模型

文章目录 概述相机畸变类型径向畸变切向畸变 畸变数学模型径向畸变模型切向畸变模型畸变数学模型总结 去畸变数学过程去畸变步骤 畸变测试结论参考 概述 相机畸变是图像处理和计算机视觉中的常见问题。由于透镜的物理特性&#xff0c;图像边缘的物体往往会呈现扭曲&#xff0c…

(34)FFT与信号频谱(双边谱)

文章目录 前言一、仿真代码二、仿真结果画图 前言 本文首先使用MATLAB生成一段余弦信号&#xff0c;然后对其进行FFT变换&#xff0c;给出了信号的双边幅度谱。 一、仿真代码 代码如下&#xff08;示例&#xff09;&#xff1a; %% 生成余弦波 % 指定信号的参数&#xff0c;…

k8s中的微服务

一、什么是微服务 用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f;需要通过微服务暴漏出去后才能被访问 Service是一组提供相同服务的Pod对外开放的接口。 借助Service&#xff0c;应用可以实现服务发现和负载均衡。 service默认只支持4层负载均…

Java 输入与输出(I\O)详解

一、Java 输入与输出&#xff08;I\O)系统概述 Java 输入/输出流&#xff08;Input/Output&#xff0c;简称I/O&#xff09;是Java语言用于读写数据的API&#xff0c;它提供了一系列类和接口&#xff0c;用于读取和写入各种类型的数据信息。 输入/输出&#xff08;I/O&#xff…

SpringBoot项目热部署-devtools

DevTools 会使用两个类加载器&#xff08;一个用于加载不变的类&#xff0c;一个用于加载可能会变化的类&#xff09;&#xff0c;每次重启只重新加载管理变化的类的加载器&#xff0c;因此会快很多 1.导入依赖 <dependency> <groupId>org.springframework.boot&l…

动态设置placeholder-class.默认搜索图标在中间获取焦点之后再左边

默认状态:placeholder和图标在中间位置 获取焦点&#xff1a;placeholder和图标在左边光标前面位置 动态设置placeholder-class <view class"search"><input type"search" class"select-input" input-align"center" v-model.…

算法题---动态规划

题目展示&#xff1a; 动态规划的题目我们一半分为5个步骤去分析&#xff0c;第一&#xff0c;状态表示&#xff1b;第二&#xff0c;动态转移方程&#xff1b;第三&#xff0c;初始化&#xff1b;第四&#xff0c;填表顺序&#xff1b;第五&#xff0c;返回值。 状态表示 这…

[权威出版|稳定检索]2024年大数据经济与公共管理国际会议(BDEPM 2024)

2024年大数据经济与公共管理国际会议 2024 International Conference on Big Data Economy and Public Management 【1】大会信息 会议名称&#xff1a;2024年大数据经济与公共管理国际会议 会议简称&#xff1a;BDEPM 2024 大会时间&#xff1a;请查看官网 大会地点&#xf…

网络协议原理

文章目录 TCP通信原理TCP与UDP的对比应用层应用层协议 --- tcp协议定制直接传递对象自定义协议现在要解决的问题业务处理 json的使用使用json进行序列化和反序列化操作 总结 TCP通信原理 tcp是面向字节流的 同时他也是面向连接的 所以TCP的服务器编写代码如图所示: 客户端的编…