c++初阶------c++代码模块

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言、C++和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


代码模型

  • **作者前言**
  • 泛型编程
    • 函数模板
      • 函数模板的实例化
      • 隐式实例化
      • 显示实例化
    • 类模板
    • 类的实例化(区别普通类和模板类的类型)
    • 类模板声明和定义分离
  • 普通函数和函数模板

泛型编程

前面我们学习了c++的函数重载,知道一个函数名可以相同,但是形参的类型或者个数不能相同,如果我们要通过操作不同类型的数据可以进行函数重载,但是很不方便。
进行函数重载,效率也很低下,每次出现新的类型,就要重载一次,
泛型编程的出现就是为了解决这些问题而生的

函数模板

函数模板格式:
template<typename T1, typename T2,…,typename Tn>
返回值类型 函数名(参数列表){}
注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)
模板参数和函数的参数很像,函数的参数定义的是形参,模板参数定义的是类型

#include<iostream>
using namespace std;template<typename T1>
void Swa(T1& a, T1& b)
{T1 c = a;a = b;b = c;
}
int main()
{int a = 10, b = 30;double c = 1.0, d = 2.0;Swa(a, b);Swa(c, d);cout << "a=" << a << ",b=" << b << endl;cout << "c=" << c << ",d=" << d << endl;return 0;
}

不同类型调用的函数不是同一个的,
在这里插入图片描述
在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此

函数模板的实例化

不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化显式实例化。

隐式实例化

隐式实例化:让编译器根据实参推演模板参数的实际类型

#include<iostream>
using namespace std;template<typename T1>
void Swa(T1& a, T1& b)
{T1 c = a;a = b;b = c;
}
int main()
{int a = 10, b = 30;double c = 1.0, d = 2.0;Swa(a, b);Swa(c, d);cout << "a=" << a << ",b=" << b << endl;cout << "c=" << c << ",d=" << d << endl;return 0;
}

如果函数模板参数只有一个,例如Swa(a,c),这个编译器就会报错,隐式实例化,也就是编译器看到我们传入但是参数进行推演,进行确定类型

显示实例化

#include<iostream>
using namespace std;
template<typename T>
T Add( T a,  T b)
{return a+b;
}
template<typename T1>
void print(T1& a)
{cout << a <<endl;
}
int main()
{int a = 1.0;double b = 2.0;cout<<Add(a,(int)b)<<endl;//少数用法cout <<Add<int>(3,3.8)<<endl;//显式实例化return 0;
}

格式:
函数名<类型>(参数列表)
这样可以模板参数只有一个,传参可以传不同的类型

模版参数的如果推不出类型就会报错,通常模版参数一般有几种使用场景
作为函数参数

template<typename T1>
void print(T1& a)
{cout << a <<endl;
}

我们只需要进行传参就可以知道T的类型,
使用显示实例化

template<typename T1>
void Sta(int n ){T1*_a = new T1[n];int _top = 0;int _capacity = n;}

如果我们要推出T1的类型就必须进行显示实例化,例如:
Sta(30)

类模板

#include<iostream>
using namespace std;
template<class T1>
class Stack
{
public:Stack(int n = 4){_a = new T1[n];_top = 0;_capacity = n;}Stack(const Stack& a){_top = a._top;_capacity = a._capacity;_a = new T1[_capacity];}~Stack(){delete[] _a;_top = 0;_capacity = 0;}
private:T1* _a;int _top;int _capacity;};
int main()
{//显示实例化Stack<int> str1;Stack<char> str2;return 0;
}

模板格式

template<class T1, class T2, ..., class Tn>
class 类模板名
{// 类内成员定义
};

类的实例化(区别普通类和模板类的类型)

我们知道普通类,一旦定义了就是确定了类型,所以可以理解为普通类的类名就是类型
而类的模板的类名不是类型,我们需要显示实例化才能确定是类,

Stack<int>str1;
Stack<double>str2;

Stack是类型,
Stack 只是类名
在这里插入图片描述
可以看到模板类的类型就是这样的,普通类的类型就是类名

类模板声明和定义分离

#include<iostream>
using namespace std;
template<class T1>
class Stack
{
public:Stack(int n = 4);Stack(const Stack& a){_top = a._top;_capacity = a._capacity;_a = new T1[_capacity];}~Stack(){cout << _capacity << endl;delete[] _a;_a = nullptr;_top = 0;_capacity = 0;}
private:T1* _a;int _top;int _capacity;};
//定义
template<class T1>
Stack<T1>::Stack(int n)
{_a = new T1[n];_top = 0;_capacity = n;
}
int main()
{//显示实例化Stack<int> str1;Stack<char> str2;return 0;
}

注意:类模板声明和定义不支持分开到多个文件,只能在一个文件内

普通函数和函数模板

在模板函数和普通函数重载时,C++编译器对函数的调用规则如下:

当函数模板和普通函数都符合调用时,优先选择普通函数。如果想显示使用函数模板,则使用<>类型列表。
如果函数模板能产生更好的匹配,则使用函数模板。
函数模板不允许自动类型转化,普通函数能够进行自动类型转换(隐式类型转换)。

#include<iostream>
using namespace std;
template<typename T>
T Add(const T& a,const T& b)//这里是引用的是一个临时变量,具有常性,需要用const来接收
{return a + b;
}int Add(int a, int b)
{return a + b;
}
int main()
{cout << Add(1, 2) <<endl;//调用的是普通函数cout<< Add<double>(2.1, 3.1) <<endl;//调用的也是普通函数return 0;
}

在这里插入图片描述

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

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

相关文章

centos7二进制安装openstack train版本双网口五节点

这里写目录标题 材料准备宿主机安装KVM 网络规划硬件规划本案例局限性密码规划虚拟机准备网络准备centos7模板机准备 数据库安装安装rabbitMQ消息队列安装memcached服务安装Etcd安装keystone身份服务创建数据库用户keystone安装keystone组件创建admin并启动keystone监听验证key…

由浅到深认识Java语言(18):权限修饰符包Object类

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

学习网络编程No.15【高级IO之多路转接】

引言&#xff1a; 北京时间&#xff1a;2024/3/19/11:16&#xff0c;若是说记忆有克星的话&#xff0c;那么一定是时间。若是说耐心有克星的话&#xff0c;那么一定是人的心态。连续几天睡眠问题&#xff0c;加上环境影响&#xff0c;上篇博客还有部分知识只能放在该篇博客介绍…

git cherry pick merge部分提交

cherry pick merge 指定某次提交 1. git history 选择要从哪个分支merge 2. 找到提交记录,选择cherry pick 3.这个时候就可以直接push了

【自我提升】计算机领域相关证书

目录 计算机技术与软件专业资格&#xff08;水平&#xff09;考试证书&#xff08;软考&#xff09;Oracle认证Cisco认证微软认证红帽认证AWS认证 计算机技术与软件专业资格&#xff08;水平&#xff09;考试证书&#xff08;软考&#xff09; 计算机技术与软件专业技术资格&a…

【数仓】DataX软件安装及配置,从mysql同步到hdfs

相关文章 【数仓】基本概念、知识普及、核心技术【数仓】数据分层概念以及相关逻辑【数仓】Hadoop软件安装及使用&#xff08;集群配置&#xff09;【数仓】Hadoop集群配置常用参数说明【数仓】zookeeper软件安装及集群配置【数仓】kafka软件安装及集群配置【数仓】flume软件安…

C++中的内存分区

栈&#xff1a;在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中&#xff0c;效率很高&#xff0c;但是分配的内存容量有限 堆&#xff1a;就是那些由 new分配的内…

Prometheus(六):Blackbox监控安装配置

目录 1 Blackbox Exporter安装配置1.1 Blackbox Exporter简介1.2 安装1、安装-使用源码包安装下载安装blackbox.yml文件配置快速启动文件 2、安装-使用docker 1.3 Prometheus配置1、http监控2、ping探测-ip3、https probe-DNS解析4、metrics配置5、TCP监控-探测端口 总结 1 Bla…

2022全球AI生物智药大赛赛道二参赛攻略@paipai

大家好&#xff0c;我是来自paipai队的徐一帆&#xff0c;Github ID IvanaXu [01]&#xff0c;相关研究工作都会开源在上面&#xff0c;欢迎大家关注&#xff01; 以下是关于本次“云上进化”2022全球AI生物智药大赛 [02]&#xff1a;赛道二“抗原抗体结合Epitope和Paratope精…

8.2024

我们知道第一个质数是2&#xff0c;第二个质数是3&#xff0c;第三个质数是5.... 请你计算第2023个质数? 代码&#xff1a; import java.util.ArrayList;public class 第八题 {public static void main(String[] args) {ArrayList<Object> list new ArrayList<>…

鸿蒙OS实战:【module的使用】

在开发HarmonyOS应用时&#xff0c;默认创建的工程会有一个entry module&#xff0c;实际应用场景为了代码或者功能解耦&#xff0c;我们需要用到module来进行隔离。根据鸿蒙3.0/3.1/4.0官方指导&#xff0c;我们可以了解到关于module的类型&#xff0c;以及依赖关系&#xff0…

代码随想录学习Day 18

530.二叉搜索树的最小绝对差 题目链接 讲解链接 思路&#xff1a;利用二叉搜索树的性质&#xff0c;其中序遍历序列是一个有序数组。所以先对二叉搜索树进行中序遍历&#xff0c;得到一个递增的数组后&#xff0c;再遍历整个数组&#xff0c;依次求相邻值的差&#xff0c;最…

漏洞扫描-让安全弱点无所遁形

随着信息技术的迅猛发展和互联网的广泛普及&#xff0c;网络安全问题日益凸显。在这个数字化的世界里&#xff0c;无论是企业还是个人&#xff0c;都面临着前所未有的安全威胁。安全漏洞&#xff0c;作为这些威胁的源头&#xff0c;常常被忽视或无法及时发现。 而漏洞扫描&…

静态住宅IP优缺点,究竟要怎么选?

在进行海外 IP 代理时&#xff0c;了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和&#xff0c;并提供选择建议&#xff0c;帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

经验篇04-为什么学了很多知识/读了很多书却没用

前言 以下内容是参加古典老师的写作训练营&#xff0c;古典老师分享的视频课程&#xff0c;对于喜欢阅读或者学习的人来说&#xff0c;可以揭开【学了很多东西却没用】这个问题的神秘面纱&#xff0c;我个人收获非常大&#xff0c;结合了一些自己的理解&#xff0c;形成此文&am…

java常用IO流功能——字符流和缓冲流概述

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup! 之前说了下了IO流的概念&#xff0c;并整理了字节流&#xff0c;有需要的可以看这篇 java常用应用程序编程接口&#xff08;API&#xff09;——IO流概述及字节流的使用 字符流 FileReader(文件字…

代码随想录算法训练营Day35|LC860 柠檬水找零LC406 根据身高重建队列LC452 用最少数量的箭引爆气球

一句话总结&#xff1a;身高队列看起来不简单&#xff0c;实际上也很难。 原题链接&#xff1a;860 柠檬水找零 简单贪心思想即可。5元时加入cnt5&#xff0c;10元时cnt10&#xff0c;cnt5--&#xff0c; 20元时则优先找零10元再找零5元&#xff0c;这样最后判断是否在一次找零…

超全整理,软件测试-性能测试流程汇总,看这一篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试&#xf…

2024年蓝牙耳机怎么选?五大爆火真无线蓝牙耳机推荐大公开!

​随着科技的进步&#xff0c;越来越多的用户倾向选择无线蓝牙耳机&#xff0c;摆脱有线耳机的束缚&#xff0c;享受更加自由的音乐体验。为了帮助大家选购到适合自己的蓝牙耳机&#xff0c;我整理了一些目前市面上我个人认为性能优异的款式&#xff0c;与大家分享。 一、蓝牙耳…

通科技新品亮相:4K60编解一体,USB透传无忧

在信息化快速发展的今天&#xff0c;音视频技术的需求与应用场景日益丰富&#xff0c;特别是在对视频画质和实时性要求极高的领域中&#xff0c;如军警、公安、金融等&#xff0c;对音视频处理设备的性能要求更为严格。为满足这些高端应用场景的需求&#xff0c;视通科技紧跟时…