c++之旅第九弹——模版

大家好啊,这里是c++之旅第九弹,跟随我的步伐来开始这一篇的学习吧!

如果有知识性错误,欢迎各位指正!!一起加油!!

创作不易,希望大家多多支持哦!

一.模版的概念:

1.泛型编程:

编写逻辑代码,适用于多种数据类型。

2.模版:

通过将类型定义为参数,实现了代码的重用性,即实现泛型编程。

二.函数模版:

1.函数模版不是实体函数,编译器不会对一个函数模板生成可执行代码;这只是一个函数功能的框架描述,只有在调用时有了具体的类型,生成了模版函数时才会生成可执行代码。

template:模板的关键字

<> :类型的参数列表

typename:用来声明类型参数,也可以用 class

2.函数模版使用:

int a=1,b=2;
char c='x';
​
template<typename T>//单类型
void fun(T &a,T &b)//&不是必须的格式
{
cout<<a<<endl<<b<<endl;
}
​
template <typename T1,typename T2>//双类型定义方式
void fun(T1 &a, T2 &b)

(1)、隐式推导类型:调用fun(a,b);正确 调用fun(a,c);错误,因为函数模板不会有隐式转换

(2)、显示指定类型:调用fun<int>(a,b);正确 调用fun<int>(a,c);也是正确的,因为显式指定类型后就生成了对应类型的实体函数,和普通函数一样,普通函数在编译器下可以进行可转换参数的转换,故此时也是正确的。//双类型的显式指定类型:fun<char, int>('a', 97);

(3)、函数模版类型参数列表中写普通形参就只能显式推导写法调用,eg:fun<int, 10>(12);不过一般这种写法不用于函数模版,因为可以将普通形参直接写在函数参数列表中,一般使用于类模板中。

3.函数模版和普通函数的区别:

(1)、函数模板和普通函数一样都是可以重载的,函数模板与普通函数也能构成重载

(2)、如果出现了函数模板与普通函数之间的重载,两者均满足时优先调用普通函数

(3)、如果函数模板可以产生一个更好的匹配,那么选择调用模板函数

(4) 、想要强制使用模板,那么就可以使用显式指定类型调用

4.函数模版的局限性:

eg:

template<typename T>
void fun(T &a,T &b)
{
cout<<a<<endl<<b<<endl;
}

若想使用该模版函数,但是传入的类型为自定义类类型,这样这个函数就无法执行了。

解决方式:

重载一个具体类型的函数来解决这个问题,Person 为自定义类型,其中有一个可以访问到的 x 成员

template<>void fun<Person>(Person&a,Person&b)
{
cout<<a.x<<endl<<b.x<<endl;
}

三.类模版:

1.类模板与函数模板类似,也不是一个实体的类,理解为一个类型的框架,所以类模板也需要生成具体的模板类,才能定义对象。

(1)写法1(只有类型参数):

template<typename T1 ,typename T2>

class 类模板名

{

成员函数和变量 ;

}

T1,T2 看作为类型的参数,在类中使用

(2)写法2(在类型参数列表中有形参):(eg:栈的实现)

template <class T,int maxSize>
class CMyStack  //自定义顺序栈
{
    T buff[maxSize];
    int top;
public:
    CMyStack()
    {
        top = 0;
    }
    void push(T const& elem)
    {
        buff[top++] = elem;
    }
    void pop()
    {
        top--;
    }
    T getTop() const
    {
        return buff[top - 1];
    }
    bool empty() const
    {
        return top == 0;
    }
};
CMyStack<int, 10> ms;//生成模板类后定义对象

2.类模板作为函数参数

(1)、做为函数的传入实参

void doWork(Person<string,int>& p){}

(2)、参数模板化

template<class T1,class T2>

void doWork(Person<T1,T2> &p){}

(3)、整体模板化

template<class T>

void doWork(T& p){}

3.类模板一般用于写数据结构类型,如数组,栈等。

4.类模板注意事项:

(1)类模板中成员函数要写在和类同一个头文件中类外的部分,不写到.cpp文件中

原因:因为.cpp文件是会参与编译的,而类模板在写的时候没有已知类型,故写在.cpp文件中的类中函数定义无法参与编译,也就相当于没有函数定义了;就算定义了一个模板类确定了类型,调用时写在.cpp文件中的函数体也不作数,使用时依然会报错(尝试得出),所以只有两种写法:直接定义在类中或者写在和类同一个头文件中的类外部分。

(2)template的类型参数T可以直接表示指针类型,但这样使用时会增加使用数据的不便,因为每次使用数据时都必须解引用进行操作,相对于普通类型(如int)的直接使用方式更加繁琐,所以一般也不会这样进行类型参数的使用。

(3)类模板继承情况:

①普通类的派生类为类模板情况:

class CA
{
};
template <class T>
class CB : public CA
{
};

②类模板的派生类新定义普通数据,但该派生类仍为类模板:

template <class T>
class CD
{   
T d;
};
template <class T>
class CE : public CD<T>
{   
int e;
};

③两者均包含的是模版:

template <class T1,class T2>
class CF : public CD<T1>
{
    T2 f;
};

(4)函数模版有显式和隐式推导,类模版只有显式推导;

模版函数和模版类在生成相对应实体或进行使用之前是不会报出函数模版和类模版的书写错误的(即实体化后才会保错),因为不参与编译。

5.类模板使用场景:

(1)泛型编程,是一种编写通用代码逻辑的方法,使其能够适用于多种数据类型。通过使用模板,我们可以定义通用的数据结构(如数组、链表、栈、队列等)和算法(如排序、查找、遍历等),从而处理不同类型的数据。

(2)C++标准库中的容器类库(如vector、list、map等)也是使用模板实现的。这些容器类模板允许存储和操作各种类型的数据,提供了方便、高效且类型安全的数据结构。 (3)另外,C++标准库中的迭代器也是通过模板实现的。迭代器模板允许对容器中的数据进行遍历和访问,而无需关心具体的容器类型。使用迭代器模板可以提供一种通用的访问方式,使得不同类型的容器可以以统一的方式进行操作。

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

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

相关文章

改进的注意力机制的yolov8和UCMCTrackerDeepSort的多目标跟踪系统

基于yolov8和UCMCTracker/DeepSort的注意力机制多目标跟踪系统 本项目是一个强大的多目标跟踪系统&#xff0c;基于[yolov8]链接和[UCMCTracker/DeepSot]/链接构建。 &#x1f3af; 功能 多目标跟踪&#xff1a;可以实现对视频中的多目标进行跟踪。目标检测&#xff1a;可以实…

2023年上半年信息系统项目管理师综合知识真题与答案解释(2)

2023年上半年信息系统项目管理师综合知识真题与答案解释(2) And Her Name Is? 她的名字是&#xff1f; During my second month of college, our professor gave us a pop quiz. 在我上大学的第二个月&#xff0c;我们的教授给了我们一个流行测验。 I was a conscientio…

自然语言控制机械臂:ChatGPT与机器人技术的融合创新(上)

引言&#xff1a; 自OpenAI发布ChatGPT以来&#xff0c;世界正迅速朝着更广泛地将AI技术融合到机器人设备中的趋势发展。机械手臂&#xff0c;作为自动化与智能化技术的重要组成部分&#xff0c;在制造业、医疗、服务业等领域的应用日益广泛。随着AI技术的进步&#xff0c;机械…

开源大数据集群部署(二十)Trino部署

作者&#xff1a;櫰木 1 解压trino的包到opt目录 cd /root/bigdata tar -xzvf trino-server-389.tar.gz -C /opt/ ln -s /opt/trino-server-389 /opt/trino2 创建trino用户&#xff0c;并配置专属jdk11 useradd trino su – trino chown -R trino:hadoop /opt/trino-server-…

async+await——用法——基础积累

对于asyncawait&#xff0c;我一直都不太会用。。。。 今天记录一下asyncawait的实际用法&#xff1a; 下面是一个实际的使用场景&#xff1a; 上面的代码如下&#xff1a; async fnConfirmCR(){let type this.crType;let crId this.crId;if(typeof crId object){let ne…

一起学习python——基础篇(13)

前言&#xff0c;python编程语言对于我个人来说学习的目的是为了测试。我主要做的是移动端的开发工作&#xff0c;常见的测试主要分为两块&#xff0c;一块为移动端独立的页面功能&#xff0c;另外一块就是和其他人对接工作。 对接内容主要有硬件通信协议、软件接口文档。而涉…

andorid 矢量图fillColor设置无效

问题&#xff1a;andorid 矢量图fillColor设置无效 解决&#xff1a;去掉如下 android:tint一行

股票手续费怎么降下来?这些技巧帮你省钱!

在股票交易中&#xff0c;手续费是每个投资者都必须面对的成本。降低手续费可以有效地增加投资回报。以下是一些降低股票手续费的方法&#xff1a; 1. 选择低佣金的券商&#xff1a;不同的证券公司提供的佣金费率不同&#xff0c;选择佣金较低的券商可以直接减少交易成本 2. 增…

antd+vue——datepicker日期控件——禁用日期功能

需求&#xff1a;今天之前的日期禁用 <a-date-pickerv-model.trim"formNE.deliveryTime":disabled-date"disabledDate"valueFormat"YYYY-MM-DD"allowClearstyle"width: 100%" />禁用日期的范围&#xff1a; //时间范围 disab…

【C语言】C语言题库【附源码+持续更新】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 目录 1、练习2-1 Programming in C is fun! 2、练习2-3 输出倒三角图案 3、练习2-4 温度转换 4、练习2-6 计算物体自由下落的距离 5、练习2-8 计算摄氏温度 6、练习2-9 整数四则运算 7、练习2-10 计算分段函数[1…

3D目标检测跟踪 | 基于kitti+waymo数据集的自动驾驶场景的3D目标检测+跟踪渲染可视化

项目应用场景 面向自动驾驶场景的 3D 目标检测目标跟踪&#xff0c;基于kittiwaymo数据集的自动驾驶场景的3D目标检测跟踪渲染可视化查看。 项目效果 项目细节 > 具体参见项目 README.md (1) Kitti detection 数据集结构 # For Kitti Detection Dataset └── k…

力扣347. 前 K 个高频元素

思路&#xff1a;记录元素出现的次数用map&#xff1b; 要维护前k个元素&#xff0c;不至于把所有元素都排序再取前k个&#xff0c;而是新建一个堆&#xff0c;用小根堆存放前k个最大的数。 为什么是小根堆&#xff1f;因为堆每次出数据时只出堆顶&#xff0c;每次把当前最小的…

Excel 函数与公式应用大全

Excel 函数与公式应用大全 常用Excel函数实际应用示例本期图书推荐Excel 函数与公式应用大全内容简介获取方式 AI爆款文案&#xff1a;巧用AI大模型让文案变现插上翅膀 文案变现一本通内容简介获取方式 Excel 是一款功能强大的电子表格软件&#xff0c;广泛应用于商业、财务、教…

代码随想录算法训练营三刷day51 | 动态规划 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

三刷day51 309.最佳买卖股票时机含冷冻期1.确定dp数组以及下标的含义2. 确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 714.买卖股票的最佳时机含手续费 309.最佳买卖股票时机含冷冻期 题目链接 解题思路&#xff1a; 相对于动态规划&#xff1a;122.买卖股票…

【JavaEE初阶系列】——文件操作 IO 之 文件系统操作

目录 &#x1f4dd;认识文件 &#x1f6a9;树型结构组织 和 目录 &#x1f388;绝对路径和相对路径 &#x1f6a9;文件类型 &#x1f4dd;文件系统操作 &#x1f388;File 概述 &#x1f388;File类的使用 1. 绝对路径 vs 相对路径 2. 路径分隔符 3. 静态成员变量 4…

SCT2A23STER 电源降压转换芯片 1.2A 4.5V-100V

SCT2A23是一种1.2A降压型直流变换器&#xff0c;输入电压范围从4.5V至100V&#xff0c;集成了530mΩ高压侧MOSFET和220mΩ低压侧MOSFET。SCT2A23选用恒导通时刻&#xff08;COT&#xff09;形式控制&#xff0c;支撑PFM形式&#xff0c;具有典型的160uA低静态电流&#xff0c;有…

【C++题解】1329. 求梯形的面积

问题&#xff1a;1329. 求梯形的面积 类型&#xff1a;基本运算、小数运算 题目描述&#xff1a; 梯形面积的求解公式为S(ab)h/2 。从键盘读入一个梯形的上底 a、下底 b 和高 h &#xff0c;请计算表梯形的面积。&#xff08;结果保留1位小数&#xff09;。&#xff08;5.1.1…

Linux内核中常用的C语言技巧

Linux内核采用的是GCC编译器&#xff0c;GCC编译器除了支持ANSI C&#xff0c;还支持GNU C。在Linux内核中&#xff0c;许多地方都使用了GNU C语言的扩展特性&#xff0c;如typeof、__attribute__、__aligned、__builtin_等&#xff0c;这些都是GNU C语言的特性。 typeof 下面…

C++ vector内存分配及正确释放

C vector内存分配及正确释放_vector 释放-CSDN博客 内存分配 #include <iostream> #include <vector> using namespace std;int main(){ vector<int> vec(10); cout << "vec.size: "<< vec.size() <<endl; cout << &quo…

SpringCloudAlibaba-概述(一)

目录地址&#xff1a; SpringCloudAlibaba整合-CSDN博客 记录SpringCloudAlibaba的整合过程 一、简单概述一下项目情况 项目主要有4个模块和4个微服务&#xff1b; 项目结构如下&#xff1a; mall&#xff1a;父工程 -- common&#xff1a;公共组件&#xff0c;存放公用的实…