C++详解->函数模板+类模版

news/2024/11/15 0:23:23/

在这里插入图片描述

文章目录

  • 前言
    • 1、反泛型编程
    • 2、函数模板
      • (1)、函数模板概念
      • (2)、函数模板定义格式
      • (3)、函数模板实例化
      • (4)函数模板参数匹配原则
    • 3、类模版
      • (1)类模板实例化
      • (2)类模板实现Stack(压/出栈函数)

前言

此篇主要描述函数模板的概念、格式以及实例化等;

1、反泛型编程

有学Java语言的同学,会听过里面的泛型。简单说就是给一个函数框架,可以实现调用不同类型的函数。是代码复用的手段。然而模版就是泛型编程的基础。
接下来看一下函数模板:

2、函数模板

此处先用一个例子引入:
在这里插入图片描述
改写后:
在这里插入图片描述
从上面可以看出模板的便利之处,可以减少代码量,提高效率,接下来看一看模板的概念和格式定义🚗🚗🚗🚗

(1)、函数模板概念

①概念:函数模板是一种允许程序员编写一个可以处理多种数据类型的函数的方法。‌它通过使用虚拟类型参数来代替具体的类型,‌使得函数可以处理不同类型的数据,‌从而实现了代码的复用和灵活性。

(2)、函数模板定义格式

template<typename T1, typename T2,…,typename Tn>这是模板的关键字。
注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替
class)

template<class T>
//template<typename T>
void Swap(T& x, T& y)
{T tmp = x;x = y;y = tmp;
}

(3)、函数模板实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。
模板参数实例化分为:

隐式实例化和显式实例化。

  1. 隐式实例化:
template<class T>
T Add(const T& a,const T& b)
{return a + b;
}
int main()
{int a1 = 10, a2 = 20;double b1 = 2.1, b2 = 3.0;cout << Add(a1, a2) << "\n";cout << Add(b1, b2) << "\n";//出现两种类型的时候,时有两种处理方式:1. 用户自己来强制转化 2. 使用显式实例化cout << Add(a1, (int)b1) << "\n";return 0;
}
  1. 显示实例化:在调用函数名后的<>中指定模板参数的实际类型
	//显示实例化cout << Add<int>(a1, a2) << "\n";

(4)函数模板参数匹配原则

①非模板函数可以和一个同名的模板函数同时存在,并且模板函数可以被实例化为非模板函数。
②模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。
③非模板函数和模板函数同名的时候,在其他参数以及返回值都相同的时候,会优先调用非模板函数,不会通过模板函数生成一个实例。但是模板函数中有更匹配的函数,那么会选择模板函数。

int Add(int a, int b)
{return a + b;
}template<class T>
T Add(const T& a,const T& b)
{return a + b;
}
int main()
{int a1 = 10, a2 = 20;double b1 = 2.1, b2 = 3.0;//cout << Add(a1, a2) << "\n";//cout << Add(b1, b2) << "\n";//cout << Add(a1, (int)b1) << "\n";显示实例化//cout << Add<int>(a1, a2) << "\n";cout<<Add(1, 2)<<"\n"; // 与非函数模板类型完全匹配,不需要函数模板实例化cout << Add(1, 2.0) << endl;//非模板函数,会自动类型转换return 0;
}

3、类模版

函数模板是在函数前面加template<class T,……>,因此类模版格式类似的。

template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};

(1)类模板实例化

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

// Stack是类名,Stack<int>才是类型
Stack<int> st1; // int
Stack<double> st2; // double

(2)类模板实现Stack(压/出栈函数)

#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;template<typename T>
class Stack
{
public:Stack(size_t capacity = 4){_array = new T[capacity];_capacity = capacity;_size = 0;}void Push(const T& data);T GetTop();void Pop();~Stack(){delete[] _array;_array = nullptr;_size = _capacity = 0;}private:T* _array;size_t _capacity;size_t _size;
};template<typename T>
void Stack<T>::Push(const T& data)
{if (_size == _capacity){//开新空间T* tmp = new T[_capacity * 2];//拷贝新空间memcpy(tmp, _array, sizeof(T) * _size);//释放原空间delete[] _array;//指向新空间_array = tmp;_capacity *= 2;}_array[_size++] = data;
}template<typename T>
T Stack<T>::GetTop()
{if (_size == 0){return -1;}return  _array[_size-1];
}template<typename T>
void Stack<T>::Pop()
{if (_size == 0){return;}_size--;
}int main()
{Stack<int> st1;st1.Push(1);st1.Push(2);st1.Push(3);st1.Push(4);st1.Push(5);cout << st1.GetTop() << "\n";st1.Pop();cout << st1.GetTop() << "\n";return 0;
}

http://www.ppmy.cn/news/1505619.html

相关文章

PhPMyadmin漏洞复现

首先我们打开环境&#xff0c;这个环境需要在小皮面板里安装&#xff0c;然后php版本需要在5.5以上的版本才可以运行 然后打开sql面板&#xff0c;将面板中的语句执行 保证日志保存状态开启 修改日志的存放位置 将语句执行 然后在工具上进行连接测试 写入一个webshell 然后打开…

算法力扣刷题记录 六十七【40.组合总和II】

前言 回溯章节第五篇。 记录 六十七【40.组合总和II】。 一、题目阅读 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1…

获取后端返回的文件流 前端进行文件下载

获取后端返回的文件流 前端进行文件下载 1. 在 utils 文件夹下创建 downloadFile.ts import axios from "axios";interface Params {url: string;method: string;data: any; }export const downLoadFileBlob (params: Params) > {return axios({url: params.ur…

Django中事务的基本使用

1. Django事务处理 事务(Transaction): 是一种将多个数据库操作组合成一个单一工作单元的机制. 如果事务中的所有操作都成功完成, 则这些更改将永久保存到数据库中. 如果事务中的某个操作失败, 则整个事务将回滚到事务开始前的状态, 所有的更改都不会被保存到数据库中. 这对于…

【Material-UI】按钮组:按钮变体详解

文章目录 一、按钮变体概述1. 组件介绍2. 基本用法 二、按钮变体详细说明1. 轮廓按钮&#xff08;Outlined&#xff09;2. 文本按钮&#xff08;Text&#xff09;3. 填充按钮&#xff08;Contained&#xff09; 三、按钮变体的实际应用场景1. 界面设计2. 界面一致性3. 视觉层次…

5 倍网络性能提升!DigitalOcean上线全新高级内存优化型和高级存储优化型 Droplet 云主机

支持用户从想法到实现&#xff0c;再到业务不断发展过程中提供持续可靠的支持&#xff0c;这是 DigitalOcean 的核心使命。所以 DigitalOcean 也在不断推出更多专业的解决方案。 DigitalOcean Droplet 是基于虚拟化硬件上运行的虚拟机&#xff08;VM&#xff09;。用户创建的每…

WEB渗透Web突破篇-PHP文件包含下载读取

php任意文件读取/下载 readfile()、file_get_contents()、fopen()等读文件的函数不严谨&#xff0c;读取文件路径可控&#xff0c;输出内容。 下载配置文件 Redis、Weblogic、ftp、mysql、web配置文件、history文件、数据库配置文件 下载log文件 下载web文件 /1.php?f../../e…

环境搭建:如何在 Windows 上安装和配置 Apache Maven 3.9.8

环境搭建&#xff1a;如何在 Windows 上安装和配置 Apache Maven 3.9.8 在 Windows 系统上安装和配置 Apache Maven 是开发 Java 应用程序的关键步骤。本文详细介绍了如何下载合适的 Maven 二进制文件&#xff0c;并正确配置环境变量&#xff0c;使其在命令行中可用。特别适合…