[C++]——学习模板

了解模板——初阶

  • 前言:
  • 一、模板
    • 1.1 什么是模板
    • 1.2 模板的概念
    • 1.3 模板可以做什么
    • 1.4 泛型模板
  • 二、函数模板
    • 2.1 函数模板概念和格式
    • 2.2 函数模板原理
    • 2.3 函数模板实例化
      • 2.3.1 隐式实例化
      • 2.3.2 显式实例化
    • 2.4 模板参数的匹配原则
    • 2.5 函数模板声明定义分离
  • 三、类模板
    • 3.1 类模板的定义格式
    • 3.2 类模板实例化
    • 3.3 类模板声明和定义分离
  • 四、总结

前言:

什么是模板?模板可以做什么?带着好奇的心态去学习模板一定会有很大的收获。

一、模板

1.1 什么是模板

模板是 C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。

1.2 模板的概念

模板(Template)指 C++ 程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++的标准库提供许多有用的函数大多结合了模板的观念,如 STL 以及 iostream。

模板是一种对类型进行参数化的工具。
通常有两种形式:函数模板和类模板:

  • 函数模板:针对仅参数类型不同的函数;
  • 类模板:针对仅成员变量和成员函数类型不同的类。

在模版中,编译器一般不会进行类型转换操作,因为一但转化出问题,编译器就要背黑锅。

1.3 模板可以做什么

使用模板的目的就是能够让程序员编写与类型无关的代码.

1.4 泛型模板

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

二、函数模板

函数模板编译(两次):
1:没有实例化之前,检查代码本身是否有语法错误。
2: 实例化期间,检查对模板代码的调用是否合法。

2.1 函数模板概念和格式

概念:

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

格式:

template<typename T1, typename T2,…,typename Tn>
返回值类型 函数名 ( 参数列表 ){}

案例如下:

template<typename T>
void Swap(T& a, T& b)
{
    T temp = a;
    a = b;
    b = temp;
}

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

2.2 函数模板原理

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

网图:
在这里插入图片描述

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

2.3 函数模板实例化

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

2.3.1 隐式实例化

隐式实例化:也叫推演实例化,函数参数传递,推出模板参数的类型,生成对应的函数。(让编译器根据实参推演模板参数的实际类型)

2.3.2 显式实例化

显式实例化:在函数名后的 <> 中指定模板参数的实际类型

2.4 模板参数的匹配原则

1.一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数
2.对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而 不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数,那么将选择模板。(简单来说就是有现成的就用现成得,有更合适得就用更合适得,没有就将就用模板)
3.模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

2.5 函数模板声明定义分离

可以声明定义分离
不同的是模板参数声明定义都要给

//声明
template<typename T>
void Swap(T& left, T& right);
//定义
template<typename T>
void Swap(T& left, T& right)
{
    T temp = left;
    left = right;
    right = temp;
}

三、类模板

3.1 类模板的定义格式

//可以声明多个模板参数
template<class T1, class T2, ..., class Tn>
class 类模板名
{
    // 类内成员定义
};

3.2 类模板实例化

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

  • 对于普通类,类名就是类型
  • 对于类模板,类名不是类型,类名<类型>才是整个类的类型

3.3 类模板声明和定义分离

// 类模板
// 注意:Stack不是具体的类,是编译器根据被实例化的类型生成具体类的模具
template<class T>
class Stack
{
private:
	T* _a;
	size_t _top;
	size_t _capacity;

public:
	// ...
	Stack(size_t capacity = 10)
		:_a(new T[capacity])
		,_top(0)
		,_capacity(capacity)
	{}

	~Stack(); // 析构函数,在类中声明,类外定义
};

// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template<class T>
Stack<T>::~Stack()
{
	if (_a)
	{
		delete[] _a;
		_a = nullptr;
	}
	_top = _capacity = 0;
}

int main()
{
	// 类模板的使用都是显式实例化
    // Stack是类名,Stack<int>才是类型
	Stack<int*> st1;
	Stack<int> st2;

	return 0;
}

注意: 模板不支持把声明写到 .h 头文件,定义写到 .cpp 源文件的这种声明与定义分离在不同文件中的方式,会出现链接错误。

四、总结

注意: 一个模板,如果没有实例化,编译器是不会去检查它内部的语法的。

优点:

  1. 模板复用了代码,节省资源,更快的迭代开发, C++ 的标准模板库 (STL) 因此而产生
  2. 增强了代码的灵活性

缺点:

  1. 模板会导致代码膨胀问题,也会导致编译时间变长
  2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8改进 | 2023Neck篇 | 轻量级跨尺度特征融合模块CCFM(附yaml文件+添加教程)

一、本文介绍 本文给大家带来的改进机制是轻量级跨尺度特征融合模块CCFM&#xff08;Cross-Scale Feature Fusion Module&#xff09;其主要原理是&#xff1a;将不同尺度的特征通过融合操作整合起来&#xff0c;以增强模型对于尺度变化的适应性和对小尺度对象的检测能力。我将…

电子学会C/C++编程等级考试2021年03月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:生日相同 2.0 在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。 时间限制:1000 内存限制:65536输入 第一行为整数n,表示有n个学生,n ≤ 180。此后每…

Linux中的fork()函数

目录 1.现象 2.如何实现的&#xff1f; 1.现象 1.fork()函数是用来创建一个字进程的&#xff1a; 如果这个进程是子进程&#xff0c;那么返回值返回0&#xff0c;如果是父进程的话&#xff0c;那么返回子进程的pid&#xff0c;以便父进程找到子进程&#xff0c;因为子进程的p…

理解数字化转型:3个阶段、2个分类和3类价值

导读&#xff1a;数字化转型是基于IT技术提供业务所需要的支持&#xff0c;让业务和技术真正产生交互而诞生的。我们可以从概念及内涵、分类、价值等多个维度来理解企业数字化转型。 01 数字化转型的概念及内涵 数字化转型运用5G、人工智能、大数据、云计算等新一代数字技术&a…

【信息学奥赛】拼在起跑线上,想入道就别落下自己!

编程无难事&#xff0c;只怕有心人&#xff0c;学就是了&#xff01; 文章目录 1 信息学奥赛简介2 信息学竞赛的经验回顾3 优秀参考图书推荐《信息学奥赛一本通关》4 高质量技术圈开放 1 信息学奥赛简介 信息学奥赛&#xff0c;作为全国中学生学科奥林匹克“五大学科竞赛”之一…

狗dog目标检测数据集VOC+YOLO格式1W+张

狗&#xff0c;是食肉目犬科 [11]犬属 [13]哺乳动物 [12]&#xff0c;别称犬&#xff0c;与马、牛、羊、猪、鸡并称“六畜” [13]。狗的体型大小、毛色因品种不同而不同&#xff0c;体格匀称&#xff1b;鼻吻部较长&#xff1b;眼呈卵圆形&#xff1b;两耳或竖或垂&#xff1b;…

你好!赫夫曼树【JAVA】

目录 1.简单介绍 2.术语 3.构建思路 4.创建节点类 5.创建赫夫曼树 6.前序遍历 7.小玩一把 1.简单介绍 赫夫曼树&#xff08;Huffman Tree&#xff09;又称最优二叉树&#xff0c;是一种带权路径长度最短的二叉树。它的构建主要用于数据压缩算法中&#xff0c;根据字…

k8s容器部署mysql5.7全流程分享

文章目录 一、前言二、打开dockerhub 看到mysql的版本为 5.7三、K8S 容器编排3.1、编写POD的相关信息3.2、编写mysql的data存储位置3.3、编写mysql的my.cnf的挂载文件3.4、编写mysql的service端口 四、启动并禁用root账户4.1 登录&#xff0c;默认密码1234564.2 配置账户权限 五…

CSS基础面试题

介绍一下标准css盒子模型与低版本IE的盒子模型&#xff1f; 标准盒子模型&#xff1a;宽度内容的宽度&#xff08;content&#xff09; border padding margin 低版本IE盒子模型&#xff1a;宽度内容宽度&#xff08;contentborderpadding&#xff09; margin box-sizing 属性…

GroupMixFormer:基于Group-Mix注意力的视觉Transformer

文章目录 摘要1、简介2、相关工作2.1、视觉转换器2.2、全面的自注意力建模 3、组混合注意力和GroupMixFormer3.1. 动机&#xff1a;从个体到群体3.2. GMA: 混合组以获得更好的注意力3.3. 架构配置 4、实验4.1、实现细节4.2. 与最先进模型的比较4.3. 消融实验 5、结论 摘要 htt…

Temu重启诉讼和Shein战火重燃?出海知识产权保护成焦点

撰稿 | 故里 来源 | 亿恩 12月14日&#xff0c;Temu在美重诉Shein称别无选择&#xff0c;并表示Shein反竞争行为愈演愈烈。 对此&#xff0c;一位接近Shein人士称&#xff0c;Temu不但一直大规模抄袭SHEIN自有品牌产品、持续进行不正当竞争&#xff0c;还颠倒黑白、贼喊捉贼&…

LVS负载均衡群集,熟悉LVS的工作模式,了解LVS的调度策略以及ipvsadm工具的命令格式

目录 一、什么是群集 群集的作用&#xff1a; 群集的目的是什么 根据群集所针对的目标差异&#xff0c;可分为三种类型 负载均衡群集&#xff08;LBC&#xff09;load balance cluster 高可用群集&#xff08;HAC&#xff09;high availability cluster 高性能运算群集&a…

模拟真实内网渗透过程

环境搭建 kali为cs服务器 win11为攻击者主机 DMZ模拟目标web服务器&#xff0c;配置两块网卡&#xff0c;一个连外网&#xff0c;一个连内网域控 最终要求在win11上使用cs对目标域控进行提权 实施过程 一、域控主机搭建域环境&#xff0c;DMZ主机加入域内 搭建域控 w…

SE考研真题总结(二)

接上条&#xff0c;今天继续更新~ SE考研真题总结&#xff08;一&#xff09;-CSDN博客文章浏览阅读340次&#xff0c;点赞6次&#xff0c;收藏11次。本帖开始分享考研真题中设计【软件工程】的部分&#xff0c;预计会出5期左右&#xff0c;敬请期待~https://blog.csdn.net/js…

ububtu16.04下安装MQTT服务器

1、mqtt服务器安装 直接上root用户&#xff0c;顺序执行以下命令完成服务器安装&#xff1a; sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa sudo apt-get update sudo apt-get install mosquitto …

P21 类神经网络训练不起来怎么办- 自动调整学习率 Adapative learning rate

梯度大&#xff0c;学习率减小梯度小&#xff0c;学习率变大adam随时间变化 &#xff0c; decay / warm up 调整学习率方法一 adagrad 学习率除以 梯度的方差 方法二 RMSProp 目前最常用的&#xff1a; Adam: RMSProp Moment Learning rate schedule : decay/ warm up l…

什么是数据可视化?数据可视化的优势、方法及示例

前言 在当今的数字时代&#xff0c;数据是企业和组织的命脉&#xff0c;生成的数据量呈指数级增长。这种被称为大数据的海量数据在洞察力和决策方面具有巨大的潜力。然而&#xff0c;如果没有一种有效的方法来分析和理解这些数据&#xff0c;它就会变得毫无意义和难以管理。这就…

基于物理的AlGaN/GaN HEMT器件2DEG电荷密度分析模型(文献阅读)

标题&#xff1a;A Physics-Based Analytical Model for 2DEG Charge Density in AlGaN/GaN HEMT Devices (IEEE TRANSACTIONS ON ELECTRON DEVICES) 重要公式 2DEG电荷密度建模的困难源于量子阱中Ef随ns的复杂变化。此关系由给出 n s D V t h [ l n ( l e E f − E 0 V t …

12.15_黑马数据结构与算法笔记Java

目录 144 avl树 balance 145 avl树 put 146 avl树 remove 147 红黑树 概述 148 红黑树 put case1-3 149 红黑树 put case4 150 红黑树 remove case0-1 151 红黑树 remove case2 152 红黑树 remove case3 153 红黑树 remove case4 154 红黑树 remove case5 155 红黑树…

问卷推广策略:如何让问卷被更多人看到

企业想要了解最新客户需求痛点、产品上新、活动营销的时候&#xff0c;往往会采取市场调研的方式。而做市场调研大家通常会采取问卷调查的形式&#xff0c;在这个网络高度发达的时代&#xff0c;大家每天都会被海量的信息淹没&#xff0c;想让自己的问卷让更多的人看到并不容易…