C/C++ C/C++ 入门(6)模板初阶

news/2024/5/4 10:13:32

个人主页:仍有未知等待探索-CSDN博客

专题分栏:C++

                                                多多指教!

一、泛型编程

在之前,我们进行编程的时候,总是针对于某一个具体的问题。就比如说,如何实现一个int类型的swap函数呢?大家肯定会写。但是,如果让实现其他类型的swap函数呢?我们就只能是自己一个一个的实现。

但是,这篇文章,会告诉你另一种方式来解决类似的问题。

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

模板可以分为两类:函数模板和类模板。

二、函数模板

1、格式

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

#include <iostream>
#include <cstdio>
using namespace std;template<class T>
void Swap(T& x, T& y)
{T t = x;x = y;y = t;
}
int main()
{int a1 = 5, a2 = 6;printf("a1: %d, a2: %d\n", a1, a2);Swap(a1, a2);printf("a1: %d, a2: %d\n", a1, a2);double a3 = 5.0, a4 = 6.0;printf("a3: %lf, a4: %lf\n", a3, a4);Swap(a3, a4);printf("a3: %lf, a4: %lf\n", a3, a4);return 0;
}

2、函数模板原理

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。

3、函数模板的实例化

用不同类型的参数使用库函数模板时,成为函数模板的实例化

1、隐式实例化

让编译器根据实参进行推演模板参数的实际类型。

#include <iostream>
#include <cstdio>
using namespace std;template<class T>
T Add(const T& left, const T& right)
{return left + right;
}
int main()
{int a1 = 10, a2 = 20;double d1 = 10.0, d2 = 20.0;Add(a1, a2);Add(d1, d2);/*该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T,编译器无法确定此处到底该将T确定为int 或者 double类型而报错注意:在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题,编译器就需要背黑锅Add(a1, d1);*/// 此时有两种处理方式:1. 用户自己来强制转化 2. 使用显式实例化Add(a1, (int)d1);return 0;
}

2、显式实例化

自己定义要实例化的类型。

int main()
{int a = 10;double b = 20.0;// 显式实例化// 如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错Add<int>(a, b);return 0;
}

4、模板参数的匹配原则

1、一个非模板函数可以和一个同名的模板函数同时存在,而且该函数模板还可以被实例化为这个非模板函数。

#include <iostream>
#include <cstdio>
using namespace std;template<class T>
T Add(const T& a,const T& b)
{cout << "T Add(const T& a,const T& b)" << endl;return a + b;
}
int Add(const int& a, const int& b)
{cout << "int Add(const int& a, const int& b)" << endl;return a + b;
}int main()
{int a = 5, b = 6;cout << Add(a , b) << endl;cout << Add<int>(a, b) << endl;
}


2、对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。

3、模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。

三、类模板 

1、格式

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

注意:类模板中函数放在类外进行定义时,需要加模板参数列表

// 动态顺序表
// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具
template<class T>
class Vector
{
public :Vector(size_t capacity = 10): _pData(new T[capacity]), _size(0), _capacity(capacity){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();void PushBack(const T& data);void PopBack();// ...size_t Size() {return _size;}T& operator[](size_t pos){assert(pos < _size);return _pData[pos];}
private:T* _pData;size_t _size;size_t _capacity;
};
// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
Vector<T>::~Vector()
{if(_pData)delete[] _pData;_size = _capacity = 0;
}int main()
{return 0;
}

2、类模板实例化 

类模板必须显式实例化。

类模板名字不是真正的类,而实例化的结果才是真正的类。

谢谢大家! 


http://www.mrgr.cn/p/17200348

相关文章

js自动缩放页面,html自动缩放页面,大屏自动缩放页面,数字看板自动缩放页面,大数据看板自动缩放页面

js自动缩放页面&#xff0c;html自动缩放页面&#xff0c;大屏自动缩放页面&#xff0c;数字看板自动缩放页面&#xff0c;大数据看板自动缩放页面 由纯JS实现 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…

linux3-管道符、重定向、环境变量

1.>输出重定向1 [root@linuxprobe~]# man bash > readme.txt //将bash的使用手册写入readme.txt2 [root@linuxprobe~]# cat readme.txt3 BASH(1) General Commands Manual BASH(1)4 覆盖重定向5 [root@linuxprobe~]# echo "Welcome to LinuxProbe.Com" > re…

RIP小实验配置及缺省路由下发

配置如下&#xff1a; IP配置&#xff1a; IP配置完先查看RIP协议学习到的路由表&#xff0c;没有内容则代表没有开启RIP 启用RIP&#xff1a;这里的rip后跟的ID只具有本地意义&#xff0c;可以在1-65535之间随便取&#xff0c;不同路由器之间都可以取用不同的&#xff0c;为了…

科技云报道:AI大模型疯长,存储扛住了吗?

科技云报道原创。 AI大模型正在倒逼数字基础设施产业加速升级。 过去一年半&#xff0c;AI大模型标志性的应用相继出现&#xff0c;从ChatGPT到Sora一次次刷新人们的认知。震撼的背后&#xff0c;是大模型参数指数级的增长。 这种数据暴涨的压力&#xff0c;快速传导到了大模…

过氧化氢滴定方法可用的PFA器皿有哪些?

滴定液:KMnO4标准溶液 试液:H2O2商品液(3%),H2SO4 (3.0mol/L ) 指示剂:酚酞指示剂 仪器:分析天平,PFA酸式滴定管50mL,PFA 移液管10mL/25mL、PFA 容量瓶250mL、PFA锥形瓶250mL 1、KMnO4标准溶液浓度的标定(见实验:高锰酸钾标准溶液的配制与标定) 2、H2O2含量的测定 用PFA移液…

数据治理2

么是数据治理?数据治理是一种管理和保护数据资源的综合性方法。它涵盖了数据的收集、存储、处理、传输和使用,旨在确保数据的质量、可用性、安全性和合规性。数据治理的要素数据治理包括以下关键要素:数据质量管理: 确保数据准确、完整、一致和可靠。数据安全和隐私: 保护…

Golang面试题四(GMP)

目录 1.Goroutine 定义 2.GMP 指的是什么 3.GMP模型的简介 全局队列&#xff08;Global Queue&#xff09; P的本地队列 P列表 M列表 4.有关P和M的个数问题 P的数量问题 M的数量问题 P和M何时会被创建 5.调度器P的设计策略 复⽤线程 work stealing机制 hand off…

蓝桥杯竞赛类型:Web应用开发 全程详解

既然大家准备报名蓝桥杯&#xff0c;那么对蓝桥杯就应该有一定的了解了。没有了解也没关系&#xff0c;简单来说&#xff0c;蓝桥杯就是一个计算机竞赛&#xff0c;竞赛类型大多是使用各种语言写算法&#xff0c;当然还有本文的主体——Web应用开发。对蓝桥杯有了基本了解之后&…

算法中的变形金刚——单纯形算法学习笔记

单纯形法是解决线性规划问题的一个有效的算法。线性规划就是在一组线性约束条件下,求解目标函数最优解的问题。目录阅读本文你将会知道线性规划简介线性规划的标准形一般型转标准型< 与 ≤线性规划的松弛形标准型转松弛形单纯形算法基本可行解如何判断最优旋转操作如何通过…

道具——玩家近战攻击升级

目的 玩家拾取物的一种 玩家拾取后会增加玩家的近战攻击的伤害和攻击范围思路 和技能拾取物的逻辑一致,但更加简单 通过修改玩家的攻击数值和伤害判定范围以及特效显示范围的参数来达成目的1.新建攻击升级拾取物蓝图 通过接口事件制作2.玩家角色蓝图中实现接口3.在角色动画蓝图…

从零实现诗词GPT大模型:数据集介绍和预处理

专栏规划: https://qibin.blog.csdn.net/article/details/137728228 本章将介绍该系列文章中使用的数据集&#xff0c;并且编写预处理代码&#xff0c;处理成咱们需要的格式。 一、数据集介绍 咱们使用的数据集名称是chinese-poetry&#xff0c;是一个在github上开源的中文诗…

新项目应该选mongodb还是postgresql?

文章目录 MongoDBPostgreSQL大数据处理时的优势对比实际使用经验 选择MongoDB还是PostgreSQL作为新项目的数据库&#xff0c;主要取决于项目的具体需求、数据模型、应用场景以及团队熟悉程度等因素。下面将从几个关键角度对两者进行对比分析。 MongoDB 数据模型&#xff1a;Mo…

团队作业4 第六天

第6天:教师课程模块开发 第六天会议任务分配:前端:设计教师课程管理界面。 实现课程添加、编辑、删除的前端逻辑。后端:实现教师课程管理的数据库模型和业务逻辑。 完成相关API,支持教师对课程的管理。困难:课程信息的准确性和实时性保证。 教师权限控制和课程分配的逻辑…

团队作业4 第七天

第七天会议任务分配:前端和后端:对所完成模块进行测试 修复发现的问题和bug。 还没有全部完成,后面再继续做困难:测试中可能发现较多之前未注意到的问题。 生产环境的配置和部署可能会遇到一些环境差异导致的问题。总结:模块的部分测试完成,问题和bug得到修复。 回顾了开…

算法思想总结:链表

一、链表的常见技巧总结 二、两数相加 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {//利用t来存进位信息int t0;ListNode*newheadnew ListNode(0);//创建一个哨兵节点&#xff0c;方便尾插List…

团队作业4 第五天

第5天:课程学生名单模块开发 第五天会议任务分配:前端:实现课程和学生名单的展示界面。 实现名单的增删改查前端交互。后端:实现课程和学生名单的数据库模型。 完成相关API,支持前端的数据操作。困难:数据库设计中实体关系的确定可能会影响后续开发。 前端展示大量数据时…

人工智能与IP代理池:解析网络数据采集的未来

前言 随着互联网的快速发展&#xff0c;数据成为了当今社会最宝贵的资源之一。然而&#xff0c;要获取大量的网络数据并进行有效的分析&#xff0c;往往需要面对诸多挑战&#xff0c;其中之一就是网络封锁与反爬虫机制。在这个背景下&#xff0c;人工智能&#xff08;AI&#x…

性能测试——性能测试-linux监控工具-Centos7.x安装Prometheus

此处参考小菠萝文档:https://www.cnblogs.com/poloyy/p/12375039.html下载安装PrometheusPROM_PATH=/data/prometheus mkdir -p ${PROM_PATH} mkdir -p ${PROM_PATH}/{data,conf,logs,bin} useradd prometheus cd /usr/local/src wget https://github.com/prometheus/promethe…

C++奇迹之旅:深入理解赋值运算符重载

文章目录 &#x1f4dd;赋值运算符重载&#x1f320; 运算符重载&#x1f309;特性 &#x1f320; 赋值运算符重载&#x1f320;传值返回&#xff1a;&#x1f320;传引用赋值&#xff1a;&#x1f309;两种返回选择&#x1f309;赋值运算符只能重载成类的成员函数不能重载成全…

团队作业4 第四天

第4天:成绩模块开发 第四天会议任务分配:前端:实现成绩录入界面,允许教师输入和修改成绩。 实现成绩展示界面,展示学生成绩。后端:实现成绩数据的存储逻辑。 完成成绩管理的API接口。困难:成绩录入界面的数据验证和错误处理比较复杂。 后端API的响应时间和数据库查询效率…