C++初阶 | 模板

C++初阶 | 模板

0.引言

今天,咱们来唠唠C++中一个超级好用的工具------"模板"(●'◡'●)

1.函数模板

🔅形式:

  • ☆单个模板:template <typename/class T>
    😄这里的typename和class写一个就行了哈
  • ☆多个模板:template <typename/class T, typename/class K>

例:

template < typename T >

void Swap( T& left ,T& right)

{

T temp =left;

left=right;

right=temp;

}

★:Swap不是只有一个函数,他是一组函数(它的功能是交换两个同类型的数据)

2.类模板

template < typename T >

class Stack

{

public:

Stack(size_t capacity =4 )

{ _array = new Tcapacity;

_capacity = capacity;

_size = 0;

}

void Push (const T& data);

private:

T* _array;

size_t _capacity;

size_t _size;

};

⭐类模板中的成员函数全是模板函数

⭐ 在类模板中进行声明和定义分离

⭐类模板是在编译时检查检查数据类型,而是不是在运行时检查(运行时检查的一般都是多态性的性质)

3.模板的实例化

隐式实例化(实参类型推演模板参数)

复制代码
int a1=10, a2=20;
double d1=10.1,d2=10.2;
cout<<Swap(a1,a2)<<endl;
cout<<Swap(d1,d2)<<endl;   //同种类型的数据交换

cout<<Swap(a1,(int)d2)<<endl;
cout<<Swap(double)a1,d2)<<endl;  //不同类型的数据交换,先转换成同种数据类型的数据,再交换

显示实例化 (显示指定模板参数)

复制代码
cout<<Swap<int>(a1,a2)<<endl;
cout<<Swap<double>(a1,a2)<<endl;

🚩函数参数定义的是对象,模板参数定义的是类型

🚩函数模板和普通函数可以同时存在,但是,普通函数优先。(成品优先)但是,在显示实例化时,可以先调模板

cout<< Swap< int > ( a1 , a2 )<< endl ; //此处如果有两个Swap,其中一个数函数模板,而另一个是普通函数,会先调用函数模板。

4.模板类

🚩定义:用一个或多个类型参数(如 T )作为占位符,编写通用类,可在实例化时指定具体类型。

🚩作用:避免重复编写相似逻辑的代码,提高代码复用性,如C++的 vector 、 list

🚩类模板vs模板类👇👇👇

  • 不同:

    ※概念本质 :
    类模板是一种模板定义,是创建类的蓝图或模式,它本身不是一个具体的类,而是描述了一系列类的共同结构和行为。模板类则是类模板经过实例化后得到的具体类,是可以用来创建对象的实体

    ※语法形式 :

    类模板的定义使用 template 关键字声明模板参数,如 template 。而模板类是在类模板实例化 时产生的,使用类模板名并指定具体类型参数来表示,如 vector 是 vector 类模板针对 int 类型实例化后的模板类

    ※使用阶段 :

    类模板在编译时进行解析和处理,编译器根据类模板的定义和实例化的参数生成相应的代码。模板类在运行时被使用,用于创建对象并调用其成员函数和访问成员变量

  • 相同点

    ※目的相同 :

    都是为了实现代码的复用,通过参数化类型来创建具有不同数据类型的类或对象,以适应多种数据类型的处理需求。

    ※基于泛型编程思想 :

    都利用了泛型编程的理念,将数据类型作为参数进行传递,使得代码可以在不针对具体类型进行修改的情况下,适用于多种不同类型的数据。

5.总结

希望大家可以和小邓儿一起学习和进步哈O(∩_∩)O

都看这么久了呢,别忘了一键三连哦😘😘😘

相关推荐
蹊黎8 小时前
C++中vector类的部分简单实现
开发语言·c++·visual studio
花间相见15 小时前
【计算基础|网络14】网络层:IP、ICMP 与 ping
网络·网络协议·tcp/ip
xier_ran15 小时前
【infra之路】AI 编译器学习笔记(六):重拾 C++——lambda 与 MLIR 中的回调
c++·笔记·学习
jimy116 小时前
c++的 Type Traits (一)
开发语言·c++
半杯咖啡半行码17 小时前
Linux 驱动开发入门:内核模块编程基础
linux·服务器·网络
智能直播17 小时前
RK3528 V4L2 框架 UVC 接口自动获取 H.264 / MJPEG / YUYV 格式:从内核采集到硬解分发
java·网络·实时音视频·视频编解码·h.264
别动我齐刘海17 小时前
Linux 系统调试学习2
linux·运维·c++·人工智能·学习·机器学习·机器人
睿智の男孩17 小时前
MIG IP核对DDR3的输出时序分析记录
网络·网络协议·tcp/ip
艾芯微科技18 小时前
高充放电流锂电充放 SoC:ETA9885E10,便携储能、小移动电源 BOM 选型笔记
网络·单片机·嵌入式硬件·集成测试·51单片机