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;上篇博客还有部分知识只能放在该篇博客介绍…

scFEA安装

scFEA: A graph neural network model to estimate cell-wise metabolic using single cell RNA-seq data github链接GitHub - changwn/scFEA: single cell Flux Estimation Analysis (scFEA) Try the below web server! Package Tutorial seurat对象使用scFEAscFEA/scFEA_t…

第 K 小/大 题目总结(持续更新...)

2386.找出数组的第 K 大和 此题为找数组任意子序列第k小和模板 1508. 子数组和排序后的区间和 此题为找数组连续子序列第k小和模板

git cherry pick merge部分提交

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

vba单元格

Sub 修改单元格() Dim r1 As Range 定义一个range类型的变量 Set r1 Range(Cells(1, 2), Cells(1, 5)) 1行2列到1行5列 x cells(3,1) 得到指定行列的值 Dim r As Range 定义一个range类型的变量 Set r Range("a1:a4") a1单元格到a4单元格 r.Interior.Color …

tesseract OCR引擎怎样安装?

要安装Tesseract OCR引擎&#xff0c;可以按照以下步骤进行操作&#xff1a; 在计算机上安装Tesseract OCR的依赖项。这些依赖项包括Tesseract库、Leptonica图像处理库和语言数据文件。可以使用包管理器&#xff08;如apt-get、brew或choco&#xff09;来安装这些依赖项。 下载…

代码随想录Day20:二叉树Part6

Leetcode 654. 最大二叉树 讲解前&#xff1a; 这道题其实思路并不难&#xff0c;无非就是找到当前数组的最大值作为root节点&#xff0c;然后对数组进行切割之后再对左右两个数组进行递归重复操作 class Solution:def constructMaximumBinaryTree(self, nums: List[int]) -…

C语言获取输出相关函数scanf、gets、fgets等

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 二、 2.1 fgets 2024年3月26日19:31:46 今天写了个牛客的题目&#xff0c;坐标移动 坐标移动代码链接 里面我用gets&#xff0c;但是提示warni…

【统计】什么事 R 方

将线性模型拟合到时间序列时&#xff0c;通常使用最小二乘法在模型 y ^ ( t ) a b t \hat{y}(t) a bt y^​(t)abt中找到系数 a a a和 b b b&#xff0c;其中 y ^ ( t ) \hat{y}(t) y^​(t)是时间 t t t的预测值&#xff0c;而的观测值是 y ( t ) y(t) y(t)。 残差平方和又…

LeetCode第二天(628. 三个数的最大乘积)

给你一个整型数组 nums &#xff0c;在数组中找出由三个数组成的最大乘积&#xff0c;并输出这个乘积。 我的答案&#xff1a;&#xff08;只通过了63个用例&#xff0c;没考虑到两个负数相乘得正的情况&#xff09; class Solution {public int maximumProduct(int[] nums) …

ResultMap 映射

过在 MyBatis 的映射文件中使用 <result> 标签进行映射后&#xff0c;SQL 查询语句就可以使用 Java 实体类中的属性名来编写。当你在 ResultMap 中使用 <result> 标签将数据库表的字段名和 Java 实体类的属性名进行映射后&#xff0c;MyBatis 在执行 SQL 查询时会自…

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

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

掌握Yarn:一步步安装、配置及应用全解析!

深入理解Yarn&#xff1a;安装、配置与实战应用 引言一、 Yarn简介二、 Yarn的安装三、 Yarn的基本使用四、 Yarn的高级功能五、 Yarn与持续集成/持续部署&#xff08;CI/CD&#xff09;六、 Yarn的定制化与扩展七、 社区和生态系统 引言 大家好&#xff0c;这里是程序猿代码之…

【数仓】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<>…