C++ ------ 模板初阶

chatgpt/2023/9/24 1:54:11

文章目录

  • 泛型编程
  • 模板
    • 函数模板
    • 概念
    • 原理
    • 函数模板的实例化
    • 类模板

泛型编程

我们在实现交换函数的时候,只能实现一个数据类型的交换函数,想要在C++中完成对应类型数据的交换一种方法是使用函数重载,就像下面这样

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
void Swap(double& left, double& right)
{double temp = left;left = right;right = temp;
}
void Swap(char& left, char& right)
{char temp = left;left = right;right= temp;
}

这样写就显得我们不太聪明的样子,这样写的缺点是:重载的函数仅仅是类型不同,代码复用率较低,只要有新类型出现时,就需要用户自己增加对应的函数。代码的可维护性比较低,一个出错可能所有的重载出错。
针对这些问题,C++中提供了模板的语法

模板

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。后面我们将会大量运用泛型编程。
模板可以分为函数模板和类模板

函数模板

我们来看一下这个代码:

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

上面的代码运用了函数模板的概念,template是C++中提供函数模板参数的一个关键字,上面就是一个交换函数的函数模板,该函数可以适应很多类型的数据交换。

概念

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,更具实参类型产生函数的特定类型版本。
格式:template <typename T1,typename T2,……typename Tn>
返回值类型 函数名(参数列表) {}
注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)。

原理

函数模板只是一个模板,它本身不是函数,是编译器使用方式产生特定具体类型函数的模具。所以其实模板就是将本来我们做的重复的事情交给了编译器。
在编译阶段,编译器需要根据传入的实参类型来推演生成对应类型的函数。
在这里插入图片描述

函数模板的实例化

template <typename T>T Add(const T& left, const T& right)
{return left + right;
}int  main()
{int a1 = 1, a2 = 1;double d1 = 1.1, d2 = 1.2;Add(a1, a2);Add(d1, d2);//a1和d1不是相同类型的数据,编译器在推演实际的参数是什么类型的时候,//会发生二义性的问题,也就是说函数模板参数只有一个编译器不知道是int还是double//Add(a1, d1);//我们可以这样处理//这时候我们需要强制类型转换。但是这里还有一个问题,强制类型转换会产生临时变量//编译器把这个临时变量传给函数的时候,函数的参数列表必须有const修饰,这是由于//临时变量具有常性,如果不加const就会造成权限放大的问题,这时候加上const就是权限平移//不会出错//1.用户强制转换,2.使用显式实例化(在<>中指定模板参数的实际类型)Add(a1, (int)d1);Add<int>(a2, d2);
}

也可以这样写,模板参数设置为两个

//通用加法函数
//这样写就不会发生两个类型不同,编译器不知道实例化成哪个的问题了
//但是这样会使精确度下降
template <typename T1,typename T2>
T1 Add(T1& left, T2& right)
{return left + right;
}int main()
{int a = 1;double b = 1.1;cout << Add(a, b) << endl;
}

类模板

定义格式:

template<class T1,class T2,……,class Tn>
class 类模板名
{//成员函数
}

实现一个模板栈

template <typename T1>
//模板类
class Stack
{
public:Stack(int capacity = 3){_array = new T1[capacity];_capacity = capacity;_top = 0;}void CheckCapacity(){if (_top == _capacity){T1* temp = (T1*)realloc(_array, sizeof(T1) * _capacity * 2);if(NULL == temp){perror("realloc failed!\n");return;}_array = temp;_capacity *= 2;cout << "扩容成功!" << endl;}}void PushStack(T1 x){CheckCapacity();_array[_top] = x;_top++;}void PopStack(){if (_top > 0){_top--;}else{cout << "退栈失败,栈已为空!" << endl;return;}}bool EmptyStack(){return _top == 0;}T1 StackTop(){return _array[_top - 1];}~Stack(){delete[] _array;_array = NULL;_capacity = _top = 0;}
private:T1* _array;int _capacity;int _top;
};
int main()
{Stack<int> s1;s1.PushStack(1);s1.PushStack(2);s1.PushStack(3);s1.PushStack(4);s1.PushStack(5);s1.PushStack(6);s1.PushStack(7);while (!s1.EmptyStack()){cout << s1.StackTop() << endl;s1.PopStack();}/*Stack<double> s2;Stack<short> s3;*/return 0;
}

需要注意:Stack 为类名,Stack<int> 才是类型
在类外定义函数时应该这么写
Stack<T> :: Stack() //在类外定义构造函数

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

【Git】多人协作-单分支协作

文章目录 多人协作准备工作多人协作场景1-单分支协作总结 多人协作 准备工作 在windosw环境下&#xff0c;再克隆同一个项目仓库&#xff0c;模拟一起协作开发的小伙伴 到此&#xff0c;相当于有了两个⽤⼾&#xff0c;分别在linux和windows上针对于同项⽬进⾏协作开发&#…

opencv rtsp 硬件解码

讨论使用opencv的reader 硬件解码的方案有太多种&#xff0c;如果使用ffmpeg硬件解码是最方便的&#xff0c;不方便的是把解码过后的GPU 拉到 CPU 上&#xff0c;再使用opencv的Mat 从cpu 上上载到gpu上&#xff0c;是不是多了两个过程&#xff0c;应该是直接从GPU mat 直接去…

【深入探索Docker】:开启容器化时代的技术奇迹

深入探索Docker 深入探索Docker&#xff1a;开启容器化时代的技术奇迹前言1. 容器化&#xff1a;实现快速部署和可移植性2. 虚拟化&#xff1a;提高安全性和可靠性3. 映像&#xff1a;打包应用及依赖项的模板4. 网络管理&#xff1a;连接容器和主机5. 持久化数据&#xff1a;保…

汽车分析,随时间变化的燃油效率

简述 今天我们来分析一个汽车数据。 数据集由以下列组成&#xff1a; 名称&#xff1a;每辆汽车的唯一标识符。MPG&#xff1a;燃油效率&#xff0c;以英里/加仑为单位。气缸数&#xff1a;发动机中的气缸数。排量&#xff1a;发动机排量&#xff0c;表示其大小或容量。马力&…

回归预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实…

基于Flink CDC实时同步数据(MySQL到MySQL)

一、环境 jdk8Flink 1.16.1&#xff08;部署在远程服务器&#xff1a;192.168.137.99&#xff09;Flink CDC 2.3.0MySQL 8.0&#xff08;安装在本地&#xff1a;192.168.3.31&#xff09; &#xff08;安装部署过程略&#xff09; 二、准备 准备三个数据库&#xff1a;flink…

线性代数的学习和整理2:线性代数的基础知识(整理ing)

目录 0 写在前面的话 网上推荐的线性代数的课程 1 线性代数和矩阵的各种概念 1.1 各种逻辑图 2 关于线性代数入门的各种灵魂发问 2.1 什么是线性&#xff0c;什么是线性相关 &#xff1f; 为什么叫线性变换&#xff1f; 为什么叫线性代数&#xff1f; 2.2 线性代数是人造…

Java面试题(Tomcat与Nginx)

Tomcat 什么是Tomcat&#xff1f; 简单来说是一个运行Java的网络服务器&#xff0c;也是jsp和serlvet的一个容器 Tomcat的缺省端口是多少&#xff0c;怎么修改? conf文件夹下修改server.xml文件 <Connector connectionTimeout"20000" port"8080" p…
推荐文章