C++(17): C++:模板函数与模板类

1. 简述

泛型编程是一种编程风格,可以开发一套代码适应不同的数据类型。

C++中,泛型编程是通过模板来实现的。模板是C++支持参数化多态的工具,使用模板可以使用户为类属类型(如数组的元素类型和容器的数据类型)编写通用的代码,然后再编写特定的类型来创建类属类型的特定实例。

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

2. 模板函数

模板函数允许以类型作为参数来定义函数,从而实现对不同类型数据的相同操作。下面是一个简单的模板函数例子,该函数接受两个同类型参数,并返回它们的和。

模板函数的定义:

template <typename T>  T add(T a, T b){return a + b;  }

在这个例子中,template <typename T>是模板声明,它告诉编译器我们将要使用一个类型参数T。在函数体中,我们可以用T作为类型来声明变量,或者用它来调用T类型的成员函数。这样,我们就可以用这个模板函数来操作多种数据类型。

模板函数的使用:

int main(int argc, char* argv[]){int a = 1, b = 2;  float c = 1.1, d = 2.2;  std::cout << add<int>(a, b) << std::endl;  ///< 输出3  std::cout << add<float>(c, d) << std::endl; ///< 输出3.3  return 0;  }

3. 模板类

当我们需要编写一个类,可以支持多种不同的数据类型时,我们可定义一个模板类。

模板类的定义举例如下,在如下代码中,我们定义了一个动态数组类,这个类可以支持多种不同的类型构成数组,并操作他们。

template <class T>  class DynamicArray{private:  T* array;  int size;  public:  DynamicArray(T arr[], int s);  void print();  ~DynamicArray();  };  template <class T>  DynamicArray<T>::DynamicArray(T arr[], int s){size = s;  array = new T[s];  for (int i = 0; i < size; i++) {  array[i] = arr[i];  }  }  template <class T>  void DynamicArray<T>::print(){for (int i = 0; i < size; i++) {  std::cout << array[i] << " ";  }  std::cout << std::endl;  }  template <class T>  DynamicArray<T>::~DynamicArray(){delete[] array;  }

在上述例子中,我们定义了一个名为DynamicArray的模板类,该类有一个私有成员变量array(一个动态分配的数组)和一个公有成员变量size(表示数组的大小)。这个类有一个构造函数,用于初始化数组和大小,有一个print函数用于打印数组,和一个析构函数用于释放内存。这样我们就可以用这个模板类来创建不同类型的动态数组,例如:

int main(int argc, char* argv[]){int arr[5] = {1, 2, 3, 4, 5};  DynamicArray<int> intArray(arr, 5);  intArray.print();  ///< 输出1 2 3 4 5  double darr[3] = {1.1, 2.2, 3.3};  DynamicArray<double> doubleArray(darr, 3);  doubleArray.print();  ///< 输出1.1 2.2 3.3  return 0;  }

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

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

相关文章

什么是Spring MVC?它与Java Spring框架有什么关系?

Spring MVC是Spring框架中的一个模块&#xff0c;主要用于构建Web应用程序。它是一个基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把Model&#xff0c;View和Controller分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂的web应用分成逻辑清…

最优控制理论笔记 - 03无约束条件下的泛函极值问题

一、始端时刻t0和终端时刻tf时刻都给定的泛函极值问题 其中式子2.8为欧拉方程&#xff0c;式子2.9为横截条件。 上述推导的重要作用在于将求泛函的极值问题转化为求解欧拉方程在满足边界条件和横截条件下的定解问题。 1. 固定始端和终端 2. 自由始端和自由终端 3. 自由始端和…

一文读懂链游!探索链游的前世今生,区块链与游戏结合的新兴趋势

区块链技术的崛起给游戏行业带来了前所未有的变革&#xff0c;而链游&#xff08;Blockchain Games&#xff09;正是这一变革的产物。本文将带您一览链游的前世今生&#xff0c;探索区块链与游戏结合的新兴趋势。 1. 链游的起源 链游&#xff0c;顾名思义&#xff0c;是指利用…

代码随想录打卡—day29—【回溯】— 回溯基础练习 4.19+4.20

1 491. 非递减子序列 一开始的思路是根据上一篇的3 90. 子集 II&#xff0c;加上set开始魔改。 即不要nums[i]和相邻元素val相等且在同一层就continue&#xff0c;但是本题不能sort所以没有相邻元素val&#xff0c;所以我加了set设置为本层之前遍历过的元素。代码如下&#x…

恶心透了的小日子,害人终害己,国货呼吁关注抵制日本核废水排放

​|日本排放核废水 日本政府决定将福岛第一核电站的核污染水经过处理后排放入海&#xff0c;这一决定引发了多方面的担忧和反对&#xff0c;特别是在周边国家&#xff0c;包括中国和韩国。关于日本排放核污染水这一新闻事件&#xff0c;我们必须首先认识到&#xff0c;核能利用…

【MySQL 数据宝典】【磁盘结构】- 002 数据字典

一、数据字典 ( Data Dictionary ) 1.1 背景介绍 我们平时使用 INSERT 语句向表中插入的那些记录称之为用户数据&#xff0c;MySQL只是作为一个软件来为我们来保管这 些数据&#xff0c;提供方便的增删改查接口而已。但是每当我们向一个表中插入一条记录的时候&#xff0c;MyS…

C# 语言类型(二)—预定义类型之字符串及字符类型简述

总目录 C# 语法总目录 参考链接&#xff1a; C#语法系列:C# 语言类型(一)—预定义类型值之数值类型 C#语法系列:C# 语言类型(二)—预定义类型之字符串及字符类型简述 C#语法系列:C# 语言类型(三)—数组/枚举类型/结构体 C#语法系列:C# 语言类型(四)—传递参数及其修饰符 C#语法…

《SQLite系列》SQLite数据库常用命令大全

SQLite是一个轻量级的数据库系统&#xff0c;广泛应用于嵌入式系统和移动应用中。由于其简洁、快速和高效的特点&#xff0c;SQLite成为了许多开发者的首选数据库。本文将详细介绍SQLite数据库的常用命令&#xff0c;帮助读者更好地掌握和使用SQLite。 一、SQLite命令行工具 …

MySQL-知识点详解

本文简要介绍了MySQL数据库的关键内容&#xff0c;包括数据类型、SQL语句、索引类型以及数据库优化等方面。详细讨论了各种数据类型&#xff0c;比较了DATETIME和TIMESTAMP类型&#xff0c;解释了SQL语句的执行顺序和数据库连接方式&#xff0c;介绍了MySQL索引的概念和优缺点&…

RTT-线程通信:邮箱

RTT-线程通信&#xff1a;邮箱 裸机编程常用全局变量做通信,但在RTT上会有以下缺点&#xff1a; 多线程使用时&#xff0c;需要采用互斥措施 当项目全局变量需要很时候&#xff0c;代码的可读性和全局变量会很差 全局变量会导致分层不合理&#xff0c;与模块化相违背 项目大时&…

前端学习之DOM编程案例:点名案例和秒表案例

点名 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>点名案例</title><style>*{margin: 0;padding: 0;}</style> </head> <body><div id"container">…

H5 台球猜位置小游戏

刷到抖音有人这样玩&#xff0c;就写了一个这样的小游戏练习一下H5的知识点。 小游戏预览 w(&#xff9f;Д&#xff9f;)w 不开挂越急越完成不了&#xff0c;&#x1f47f;确认15次也没全对… 知识点 获取坐标位置的DOM元素&#xff0c;感觉应该是新的吧&#xff0c;以前的…

使用Python进行容器编排Docker Compose与Kubernetes的比较

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 随着容器化技术的普及&#xff0c;容器编排成为了管理和部署容器化应用程序的重要环节。在容…

[C++][算法基础]求约数(试除法)

给定 n 个正整数 &#xff0c;对于每个整数 &#xff0c;请你按照从小到大的顺序输出它的所有约数。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一个整数 。 输出格式 输出共 n 行&#xff0c;其中第 i 行输出第 i 个整数 的所有约数。 数据范围 1≤…

18 - Debian如何配置vsftpd(3)虚拟用户验证

作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何配置vsftpd(3)虚拟用户验证 《傅老师Debian小知识库系列之18》——原创 ==前言== 傅老师Debian小知识库特点: 1、最小化拆解Debian实用技能; 2、所有操作在VM虚拟机实测完成; 3、致力…

【c++20】学习笔记:priority_queue

基于c++20 编译,参考:pair vs tuple大神的文章:基本就两种比较方式 < less than ,降序排列,大顶堆greater than, 升序排列,小顶堆 例子代码 #include <functional> #include <iostream>

类似nohup在windows通过cmd后台运行进程方法

Linux后台运行进程时&#xff0c;通常使用如下方法&#xff1a; nohup "运行的内容" &windows相应功能的命令行如下(此方法进程有页面&#xff0c;可能会在桌面展示&#xff0c;关闭窗口后进程消失。 call start /min "n" "运行的内容"cmd…

上传文件到HDFS

1.创建文件夹 hdfs -dfs -mkdir -p /opt/mydoc 2.查看创建的文件夹 hdfs -dfs -ls /opt 注意改文件夹是创建在hdfs中的&#xff0c;不是本地&#xff0c;查看本地/opt&#xff0c;并没有该文件夹。 3.上传文件 hdfs dfs -put -f file:///usr/local/testspark.txt hdfs://m…

插值与重采样在AI去衣技术中的关键作用

在人工智能&#xff08;AI&#xff09;的众多应用中&#xff0c;去衣技术作为一种新兴的图像处理技术&#xff0c;逐渐引起了广泛关注。这项技术不仅涉及复杂的计算机视觉和深度学习算法&#xff0c;还需要对图像处理中的插值与重采样技术有深入的理解。本文将详细探讨插值与重…

【智能算法】寄生捕食算法(PPA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年&#xff0c;AAA Mohamed等人受到自然界乌鸦-布谷鸟-猫寄生系统启发&#xff0c;提出了寄生捕食算法&#xff08;Parasitism – Predation Algorithm, PPA&#xff09;。 2.算法原理 2.1算法…