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

个人主页:仍有未知等待探索-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.mzph.cn/news/820173.shtml

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

相关文章

Unity HDRP 2022 Release-Notes

&#x1f308;Unity HDRP 2022 Release-Notes 本文信息收集来自自动搜集工具&#x1f448; 版本更新内容2022.3.17HDRP: Fixed a culling result sharing issue between custom passes and the camera rendering them.(UUM-53945)2022.3.17HDRP: Fixed Blackman-Harris filter…

2811: 【算法思想】【双指针】反转元音字符

题目描述 编写一个函数&#xff0c;该函数以字符串作为输入&#xff0c;并只反转字符串的元音,即将第一个元音字母与最后一个元音字母调换位置&#xff0c; 第二个元音字母与倒数第二个元音字母调换位置....... &#xff08;注意&#xff1a;元音字母包括a e i o u &#xf…

【计算机网络】常用编码方式+例题(曼彻斯特编码、差分曼彻斯特编码...)

常用编码方式例题 常用编码方式练习画出四种编码20221题342015题342013题34 常用编码方式 练习 画出四种编码 20221题34 这个题目的考察是差分曼彻斯特编码。 差分曼彻斯特编码在每个码元的中间时刻电平都会发生跳变。与曼彻斯特编码不同的是&#xff1a;电平的跳变仅代表时钟…

【随笔】Git 基础篇 -- 拉取数据 git pull(二十八)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

2024全网最全的Postman接口自动化测试!

| 背景 该篇文章针对已经掌握 Postman 基本用法的读者&#xff0c;即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求的操作。 当前环境&#xff1a; Window 7 - 64 Postman 版本&#xff08;免费版&#xff09;&#xff1a;Chrome App v5.5.3 不同版本页面 U…

java中整数的取反~

从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态&#xff0c;计算机对二进制数据进行的运算(、-、*、/)都是叫位运算&#xff0c;即将符号位共同参与运算的运算。 按位取反运算符~&#xff1a; 运算符的功能是对其操作数进行按位取反。0变1&#xff0c;1…

哪个品牌短袖穿着舒服?夏季舒适透气的五款短袖分享

近期很多地区的天气都开始变得热了&#xff0c;尤其是华南地区已经开始穿上短袖了。很多朋友都想选一些夏天穿的短袖&#xff0c;但是市面上的短袖品牌实在太多&#xff0c;看得大家眼花缭乱难以选择&#xff0c;而且还有不少质量差的短袖混杂在其中。 基于我对多个品牌的测评以…

python-pytorch实现lstm模型预测中文文本输出0.1.02

python-pytorch实现lstm模型预测中文文本输出0.1.02 数据参考效果分词到数组获取word2index和word2index查看频次获取vacab生成训练数据训练测试连续预测 记录 2024年4月14日15:36:28----0.1.02 有问题还需要完善&#xff0c;会重复生成一句话 数据 一篇新闻&#xff1a;http…

[数据结构]—二叉树基本概念

1.树概念及结构 1.树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff…

20240412-算法复习打卡day52||● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

300.最长递增子序列 从前往后遍历即可 class Solution { public:int lengthOfLIS(vector<int>& nums) {if (nums.size() < 1) return nums.size();vector<int> dp(nums.size(), 1);int result 0;for (int i 1; i < nums.size(); i) {for (int j 0; …

VS 2022部署HoloLens2 error: DEP0600: Deployment failed

一、报错信息 VS 2022 HoloLens 2 Deploy error: DEP0600: Deployment failed. Failed to deploy through new deployment pipeline 二、其它情况说明 1、设备和电脑处于同一网关&#xff0c;且已经联网 2、电脑从web可以访问HoloLens2设备 三、治病方法 在holoLens2上&am…

优秀文章收藏

&#xff08;一&#xff09;DirectUI 作者 Bjarke Viksoe 个人网站&#xff1a; DirectUI 作者 Bjarke Viksoe 个人网站&#xff1a;viksoe.dk - viksoe.dk 比较著名的文章&#xff0c;DirectUI思想做的一个程序&#xff1a;viksoe.dk - UI: Become windowless 还有一个自己…

Flutter问题:本地第三方库与pubspec.lock中的版本不同

问题前景&#xff1a; 不知道为什么flutter项目中的某几个包突然出现问题&#xff0c;提示出错&#xff0c;而本地第三方库与 pubspec.lock和pubspec.yaml 中的版本不同 搜索了一下&#xff0c;是因为我在添加这几个包时都在前面添加了 ^ 符 date_format: ^2.0.4 pubspec.lo…

适合 Python 入门的 8 款强大工具

Python是一种开源的编程语言&#xff0c;可用于Web编程、数据科学、人工智能以及许多科学应用。学习Python可以让程序员专注于解决问题&#xff0c;而不是语法。由于Python相对较小&#xff0c;且拥有各式各样的工具&#xff0c;因此比Java和C等语言更具优势&#xff0c;同时丰…

Fiddler工具的操作和功能时-----定位到步骤图(助力抓包)

前言&#xff1a; 继续上一篇&#xff0c;已经对fiddler的安装、配置和代理的问题进行了讲解&#xff1a; Fiddle配置代理&#xff0c;保手机模拟器访问外部网络-CSDN博客 本章&#xff0c;讲对一些fiddler的操作进行一系列讲解&#xff01;Fiddler作为一款网络调试工具&…

urllib爬虫案例(实战)

#urllib的爬虫案例&#xff0d;通过最原始的爬虫方式 爬虫之前如果抓包工具Fiddler证书安装失败&#xff0c;采用以下方法 1、打开cmd 2、进入fillder的目录 如下&#xff1a; 里面的路径改成你自己的安装路径 cd /d "D:\Program Files (x86)\Fiddler2" 然后再执行下…

16CFR1512测试标准儿童车电动车要求

16 CFR 1512的测试项目内容 欢迎咨询 逸散而雾散四物五一就把 Mechnical requiements 机械性能要求 (a) Assembly 装配 (b) Sharp edges 锐边 (c) Integrity 强度 (d) Attachment hardware 紧固件 (e)-(f) Reserved 保留 (g) Excluded Area 排除区域 (h) Reserved 保留 (i) Con…

知道做到 一篇总结学习方法的笔记

元数据 [!abstract] 知道做到&#xff1a;跃迁式学习 书名&#xff1a; 知道做到&#xff1a;跃迁式学习作者&#xff1a; 彼得•霍林斯简介&#xff1a; 学习是改善你的生活环境、成为你想成为的人的关键。科学的方法能加速学习进程&#xff0c;让你事半功倍。技能、信息和能力…

C 代码实现链栈

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h>#define MAXSIZE 100//链栈结点结构 typedef struct LinkStack {int val;struct LinkStack* next; }LinkStack;//打印所有栈中元素 void Print(LinkStack* s) {while…

Java后端HR面

文章目录 自我介绍项目介绍未来职业规划说一下所了解的数据结构和算法为什么选择javajava学习过程中印象最深的事情过去发生的最有挑战性的事、说说对你自己影响最大的事情介绍一下你的关系好的朋友们的性格社团学习生活&#xff0c;如何规划情景&#xff1a;leader给了陌生任务…