C++ 入门12:模板(Template)

往期回顾:

C++ 入门09:友元函数和友元类-CSDN博客

C++ 入门10:继承和派生类-CSDN博客

C++ 入门11:虚函数和多态-CSDN博客


 C++ 入门12:模板(Template)

一、前言

在前面文章的学习中,我们掌握了类和对象的基础知识、构造函数、拷贝构造函数、静态成员、常量成员、运算符重载、友元函数、友元类、继承和派生类,以及虚函数和多态。今天,我们将学习 C++ 中的模板。模板是 C++ 中的一种强大的功能,它使得我们可以编写通用的代码。

二、模板(Template)

2.1、 什么是模板?

模板是C++中引入的一个非常强大的特性,它提供了一种机制来创建泛型编程的框架。通过使用模板,程序员可以编写与类型无关的代码,这意味着相同的代码结构可以用于多种不同的数据类型,而无需为每种数据类型重写代码。模板极大地提高了代码的重用性、灵活性和可维护性。模板主要分为两大类:函数模板和类模板。

2.2、 函数模板

(1)什么是函数模板?

函数模板是一种能够编写一个函数定义,该函数可以与多种数据类型一起工作的技术。在定义函数模板时,程序员可以定义一个或多个模板参数来表示数据类型,这些参数在函数被实例化时会被具体的类型所替换。通过这种方式,函数模板可以处理不同类型的数据,而无需为每种数据类型编写单独的函数。

(2)声明和定义函数模板

函数模板的声明和定义与普通函数的声明和定义类似,但需要在函数声明前加上template<typename T>(或template<class T>,两者在大多数情况下可以互换使用)来引入模板参数。这里的T是一个占位符,代表将要被替换的数据类型。

语法:

template <typename T>
返回类型 函数名(参数列表) {// 函数体
}

其中,typename T 是模板参数,表示数据类型。 

示例:

我们定义一个函数模板 maxValue,用于返回两个值中的较大者。

#include <iostream>
using namespace std;template <typename T>
T maxValue(T a, T b) {return (a > b) ? a : b;
}int main() {cout << "Max of 3 and 7: " << maxValue(3, 7) << endl;cout << "Max of 3.5 and 7.2: " << maxValue(3.5, 7.2) << endl;cout << "Max of 'a' and 'z': " << maxValue('a', 'z') << endl;return 0;
}

在这个示例中,我们定义了一个函数模板 maxValue,它可以处理任意类型的数据。在 main 函数中,我们分别调用了 maxValue 函数,传入整数、浮点数和字符类型的数据。

2.3、 类模板

(1)什么是类模板?

类模板与函数模板类似,但它允许程序员定义一种可以处理多种数据类型的类。在定义类模板时,可以使用模板参数来表示类成员变量和成员函数所使用的数据类型。这使得类模板能够创建出具有相同操作但操作不同类型数据的对象。

(2)声明和定义类模板

类模板的声明和定义方式与普通类相似,但同样需要在类声明前加上template<typename T>(或template<class T>)来引入模板参数。

语法:

template <typename T>
class 类名 {
public:// 成员变量// 成员函数
};

示例:

我们定义一个类模板 Box,用于存储一个值,并提供获取和设置该值的函数。

#include <iostream>
using namespace std;template <typename T>
class Box {
private:T value;public:Box(T v) : value(v) {}void setValue(T v) {value = v;}T getValue() {return value;}
};int main() {Box<int> intBox(123);Box<double> doubleBox(45.67);cout << "Integer Box: " << intBox.getValue() << endl;cout << "Double Box: " << doubleBox.getValue() << endl;intBox.setValue(456);doubleBox.setValue(89.01);cout << "Updated Integer Box: " << intBox.getValue() << endl;cout << "Updated Double Box: " << doubleBox.getValue() << endl;return 0;
}

在这个示例中,我们定义了一个类模板 Box,它可以存储任意类型的数据。在 main 函数中,我们分别创建了存储整数和浮点数的 Box 对象,并调用了 getValuesetValue 函数。

2.4、 模板特化

(1)什么是模板特化?

模板特化是一种为模板参数提供特定类型实现的机制。在某些情况下,我们可能希望对某些特定类型的数据进行特殊处理,而不是使用模板的通用实现。这时,我们就可以通过模板特化来为这些特定类型提供定制化的实现。

模板特化可以是完全特化,也可以是偏特化。完全特化是指为模板的所有模板参数指定具体类型;而偏特化则是指为模板的部分模板参数指定具体类型,同时保留其他模板参数的通用性。

示例:

我们定义一个类模板 Printer,用于打印不同类型的数据。对于 char* 类型,我们希望打印字符串而不是字符指针,因此我们使用模板特化进行处理。

#include <iostream>
using namespace std;template <typename T>
class Printer {
public:void print(T value) {cout << "Value: " << value << endl;}
};// 对 char* 类型进行特化
template <>
class Printer<char*> {
public:void print(char* value) {cout << "String: " << value << endl;}
};int main() {Printer<int> intPrinter;Printer<double> doublePrinter;Printer<char*> stringPrinter;intPrinter.print(123);doublePrinter.print(45.67);stringPrinter.print("Hello, World!");return 0;
}

在这个示例中,我们定义了一个类模板 Printer,用于打印不同类型的数据。对于 char* 类型,我们使用模板特化进行处理,以打印字符串。


以上就是 C++ 程序的模板的基础知识点了。包括函数模板、类模板和模板特化。模板是 C++ 中的一种强大的功能,它使得我们可以编写通用的代码。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

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

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

相关文章

Centos---命令详解 vi 系统服务 网络

目录 一、CentOS vi命令详解 二、CentOS系统服务命令 三、CentOS权限管理命令&#xff1a; 四、CentOS网络管理命令介绍&#xff1a; 一、CentOS vi命令详解 Vi是一款强大的文本编辑器&#xff0c;在CentOS中广泛使用。以下是Vi编辑器的一些常用命令&#xff1a; 1. 打开…

北京交通大学《深度学习》专业课,实验2-前馈神经网络

1. 源代码 见资源“北京交通大学《深度学习》专业课&#xff0c;实验2-前馈神经网络” 2. 实验内容 &#xff08;1&#xff09;手动实现前馈神经网络解决上述回归、二分类、多分类任务 分析实验结果并绘制训练集和测试集的loss曲线 &#xff08;2&#xff09;利用to…

08-8.3.1 冒泡排序

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

keepalive:

keepalive&#xff1a; 调度器的高可用 vip地址在主备之间的切换&#xff0c;主在工作时&#xff0c;vip地址只在主上&#xff0c;主停止工作&#xff0c;vip漂移到备服务器。 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;vip会飘回到主服务器。 1、配优…

企业网络运维-给华为交换机配置sftp,浏览交换机文件并下载上传

文章目录 需求实验开户stelnet权限已完成stelnet账号下的sftp配置使用xshell-sftp访问 需求 浏览交换机文件并下载上传 实验 开户stelnet权限 参考https://blog.csdn.net/xzzteach/article/details/140419150 已完成stelnet账号下的sftp配置 服务类型all包括stelnet和sf…

过滤器(Filter)和拦截器(Interceptor)的区别

过滤器&#xff08;Filter&#xff09;和拦截器&#xff08;Interceptor&#xff09;都是用于在请求处理过程中执行额外逻辑的机制&#xff0c;但它们在实现和使用上有一些重要的区别&#xff1a; 过滤器&#xff08;Filter&#xff09; 定义和用途&#xff1a; 过滤器主要用于…

强化学习编程实战-5 基于时间差分的方法

第4章中&#xff0c;当模型未知时&#xff0c;由于状态转移概率P未知&#xff0c;动态规划中值函数的评估方法不再适用&#xff0c;用蒙特卡洛的方法聘雇值函数。 在蒙特卡洛方法评估值函数时&#xff0c;需要采样一整条轨迹&#xff0c;即需要从初始状态s0到终止状态的整个序列…

[C++ 入门基础 - 函数重载]

在C编程中&#xff0c;函数重载&#xff08;Function Overloading&#xff09;是一种强大的特性&#xff0c;它允许我们定义多个同名函数&#xff0c;但这些函数具有不同的参数列表。通过函数重载&#xff0c;我们可以根据不同的参数类型或数量来实现类似但功能不同的函数&…

探索“搭旅万物皆可搭”小程序——构建旅行搭伴平台的创新实践

摘要 随着旅游市场的不断发展和个性化需求的日益增长&#xff0c;旅行搭伴平台逐渐成为连接志同道合旅者的桥梁。本文旨在介绍“搭旅万物皆可搭”小程序的设计理念、核心功能及其背后的技术实现&#xff0c;探讨如何通过算法优化、安全保障、社交互动等手段&#xff0c;打造一…

GUI界面开发之tkinter(一)

Tkinter是一个内置的Python库&#xff0c;用于创建图形用户界面&#xff08;GUI&#xff09;。它提供了一组工具和小部件&#xff0c;用于创建窗口、对话框、按钮、菜单和其他GUI元素。 在本篇文章中&#xff0c;主要介绍了窗口等知识点。 大家好&#xff01;我是码银&#x1…

《昇思25天学习打卡营第22天|onereal》

文本解码原理--以MindNLP为例 回顾&#xff1a;自回归语言模型 根据前文预测下一个单词 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积 &#x1d44a;_0:初始上下文单词序列&#x1d447;: 时间步当生成EOS标签时&#xff0c;停止生成。 MindNLP/huggi…

人工智能时代的伦理挑战与隐私保护

随着人工智能技术的迅猛发展&#xff0c;我们不得不正视其带来的伦理挑战和隐私保护问题。人工智能的应用已经深入到社会的方方面面&#xff0c;从医疗健康到金融服务&#xff0c;从教育到娱乐&#xff0c;无所不在。然而&#xff0c;与其广泛应用相伴随的是数据隐私泄露、算法…

MySQL 时区问题:设置了 my.ini 并重启了服务,依旧是 0 时区

1、问题再现 在撰写 飞书 API 2-5 时&#xff0c;需要新建一些数据表&#xff0c;以便实施从数据库到多维表的数据同步。我建了2个测试数据表&#xff0c;连表查询之后&#xff0c;将时间戳转为时间格式返回&#xff0c;结果发现少了 8 小时。 具体逻辑抽象为以下&#xff0c…

【Vue3组件】封装全局路由切换loading效果

把大象装进冰箱需要几步 1.写一个全局loading的样式组件&#xff0c;我这里使用了LottieAnimation 实现更优雅的切换动画&#xff0c;详情可以参考主页上一篇文章 <template><div v-if"isLoading" class"loading-overlay"><LottieAnimatio…

S7-1200PLC 2轴直线插补(详细方案对比)

1、V90速度轴应用 速度轴V90PN总线伺服梯形加减速速度控制(标准报文1应用)_v90伺服加减速时间怎么调整-CSDN博客文章浏览阅读288次。SMART PLC斜坡函数SMART PLC斜坡函数功能块(梯形图代码)_RXXW_Dor的博客-CSDN博客斜坡函数Ramp的具体应用可以参看下面的文章链接:PID优化系…

【Linux/Vim】Vim使用教程及速查手册

目录 一.Vim介绍 1.Vim是什么 2.Vim的安装 (1)Vim默认安装的系统 (2)Vim的安装方法 (3)检查Vim是否安装成功 3.Vim,Vi,gvim的区别 4./.vimrc配置文件介绍及使用方法 (1).vimrc 的介绍 (2).vimrc 的使用方法 二.Vim使用方法 1.Vim的模式 (1)Vim一般命令模式常用操作…

【技术】JS的ES6有哪些知识点

1.let-const块级作用域的补充 const names["abc","cba","nba"];for(let i0;i<names.length;i){ //* 这个数组的元素有三个&#xff0c;所以会形成3个块级作用域console.log(names[i]); }以上for遍历内部的实现是以下这样的&#xff1a; 因…

数据库-MySQL 实战项目——书店图书进销存管理系统数据库设计与实现(附源码)

一、前言 该项目非常适合MySQL入门学习的小伙伴&#xff0c;博主提供了源码、数据和一些查询语句&#xff0c;供大家学习和参考&#xff0c;代码和表设计有什么不恰当还请各位大佬多多指点。 所需环境 MySQL可视化工具&#xff1a;navicat&#xff1b; 数据库&#xff1a;MySq…

数据结构之线性表的实现

顺序存储实现&#xff08;数组&#xff09; 顺序存储的线性表通常使用数组来实现。在数组中&#xff0c;元素在内存中是连续存放的&#xff0c;通过数组下标可以访问任意位置的元素。 链式存储实现&#xff08;链表&#xff09; 链式存储的线性表使用链表来实现。链表中的元…

C++ --> 类和对象(三)

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言 前面已经对类和对象有一定的了解&#xff0c;接下来再次深入的了解一下。 一、深入理解构造函数 构造函数体赋值&#xff1a; 虽然上述构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是不能…