当前位置: 首页 > news >正文

C++模版

一、C++函数模版的使用

首先我们来了解一下为什么要使用函数模版,在学习C语言的时候,我们会写一个相加的add函数,可是我们所写的函数只能满足一种类型的相加,不能满足其他类型的相加,如果要满足其他类型的相加,就只能再写一个函数,但函数的逻辑其实是一样的。

所以,在C++中引入了模版的概念,只需写一个函数,就能满足多种类型的相加。

模版的写法:

template <typename T>T add(T x, T y)
{
}

下面我们来写一个相加函数模版:

#include<iostream>
using namespace std;template <typename T>T add(T x, T y)
{return x + y;
}int main()
{cout << "add(1,2)=" << add(1, 2) << endl;cout << "add(1.1,2.2)=" << add(1.1, 2.2) << endl;return 0;
}

上面便是通过函数模版来实现不同类型的相加。

结果:

当然我们也可以定义多个类型,就像下面那样。

template <typename T1,typename T2>

 我们来看下面的代码:

#include<iostream>
using namespace std;template <typename T1,typename T2>void Print(T1 x, T2 y)
{cout << "" << x << endl;cout << "" << y << endl;
}int main()
{Print(1, 3.14);Print(3.14, 1);return 0;
}

这就是多种类型模版的使用,编译器会根据你传的类型推导出形参的类型。

结果: 

在第一个Print中,T1的类型是int,T2的类型是double,而第二个Print中,T1的类型是double,T2的类型是int。

 这是编译器自动的类型推导,我们也可以进行显示的类型调用:

#include<iostream>
using namespace std;template <typename T1,typename T2>void Print(T1 x, T2 y)
{cout << "" << x << " " << y << endl;
}int main()
{Print<int,double>(1, 3.14);Print<double,int>(3.14, 1);return 0;
}

在函数前加上<类型,类型>就能够显示的进行类型调用,第一个Print中,T1的类型是int,T2的类型是double,而第二个Print中,T1的类型是double,T2的类型是int。

 这里要注意的是,typename可以使用class进行替代,结果都是一样的。

1.1 函数模版的重载

函数模版是可以重载的,我们来看下面的代码:

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

这便是函数模版的重载。

1.2函数模版和普通函数谁先调用

我们来看下面的代码:

#include<iostream>
using namespace std;template <typename T>T add(T x, T y)
{return x + y;
}int add(int x, int y)
{return (x + y) * 10;
}int main()
{cout << "" << add(1, 2) << endl;return 0;
}

结果:

 

从结果我们可以看出,编译器调用的是普通函数,毕竟有了现成的函数,谁还会去使用模版呢?

总之C++函数模板是一种用于创建通用函数的机制,可以让程序员编写一次函数,然后让它适用于多种类型,在实际编程中非常实用。 

二、C++类模版

C++ 类模板是一种用于创建通用类的机制,它可以让程序员编写一次类,然后让它适用于多种类型,在实际编程中非常实用。

类模板和函数模板的定义和使用类似。有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,类模板用于实现类所需数据的类型参数化。

类模版的定义方式:

template <class T>
class MyStack {
public:// 构造函数、析构函数、入栈、出栈等函数
private:T* data;int top;
};

类模板的实例化方式与函数模板类似,可以通过显式实例化、隐式实例化和模板特化三种方式来实现。其中,显式实例化是指通过在代码中显式地指定模板参数类型来实例化类模板,隐式实例化是指通过创建类实例时传递的实参类型来自动确定模板参数类型,模板特化则是指为特定的模板参数类型提供特定的实现方式。

下面我们来看一段代码:

#include <iostream>
using namespace std;// 类模板
template <class T1, class T2>
class Data {
private:T1 _a;T2 _b;
public:Data(T1 a, T2 b){_a = a;_b = b;cout << "Data的有参构造" << endl;}void Print(){cout << _a << " " << _b << endl;}
};int main()
{Data<int, int> d1(300, 400);d1.Print();Data<int, char> d2(100, 'A');d2.Print();return 0;
}

这便是类模版的使用, 在初始化时初始化不同类型的数据。

结果:

2.1 类模板的成员函数在类外实现

1.在每个成员函数前必须添加template<>。

2.作用域需要添加<>修饰。

我们来看下面的代码:


#include <iostream>
using namespace std;// 类模板
template <class T1, class T2>
class Data {
private:T1 _a;T2 _b;
public:Data(T1 a, T2 b);void Print();
};template <typename T1,typename T2>
Data<T1, T2>::Data(T1 a, T2 b)
{_a = a;_b = b;cout << "Data(T1 a,T2 b)" << endl;
}template <typename T1, typename T2>
void Data<T1,T2>::Print()
{cout << _a << " " << _b << endl;
}int main()
{Data<int, int> d1(300, 400);d1.Print();Data<int, char> d2(100, 'A');d2.Print();return 0;
}

这便是成员函数在类外的实现方法。

结果:

 三、总结

以上就是我对于模版的理解,希望以上所讲能够对你有所帮助,如果有帮助的话,记得一键三连,感谢各位。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 关于SpringBoot项目利用阿里EasyExcel快捷导入Excel文件入库初始化数据的简单实现
  • djiango-开始创建一个应用
  • JavaScript基础入门:构建动态Web世界的基石
  • Kylin Cube构建日志分析:洞察大数据构建过程的窗口
  • SpringBoot 调用外部接口的三种方式
  • C++ 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等
  • opencv - py_calib3d - py_calibration 相机校准
  • git是什么?git和svn的区别。git的一些命令
  • 杰发科技Bootloader(2)—— 基于7840的Keil配置地址
  • Redis的五种数据类型与命令
  • 【教程】Node.js+Apache 部署网页全过程(非常详细!)
  • Knowledge Editing for Large Language Models: A Survey
  • 通信原理-思科实验三:无线局域网实验
  • 【使用 Pytest 记录日志文件并确保测试用例正常执行】
  • python实现盲反卷积算法
  • JavaScript类型识别
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • js正则,这点儿就够用了
  • Linux CTF 逆向入门
  • Promise面试题2实现异步串行执行
  • ReactNativeweexDeviceOne对比
  • STAR法则
  • supervisor 永不挂掉的进程 安装以及使用
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • unity如何实现一个固定宽度的orthagraphic相机
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 基于组件的设计工作流与界面抽象
  • 目录与文件属性:编写ls
  • 我这样减少了26.5M Java内存!
  • 2017年360最后一道编程题
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • # Java NIO(一)FileChannel
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (javascript)再说document.body.scrollTop的使用问题
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (待修改)PyG安装步骤
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (规划)24届春招和25届暑假实习路线准备规划
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (转)setTimeout 和 setInterval 的区别
  • (转)平衡树
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net dataexcel winform控件 更新 日志
  • .NetCore项目nginx发布
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • @RequestMapping用法详解