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

news2024/9/20 14:42:47

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者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.coloradmin.cn/o/1546599.html

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

相关文章

MATLAB 公共区域的点云合并(46)

MATLAB 公共区域的点云合并(46) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 点云配准后,或者公共区域存在多片点云对场景进行冗余过量表达时,我们需要将点云进行合并,Matlab点云工具中提供了这样的合并函数,通过指定网格步长,对初始点云进行过滤。 函数主要实…

[STL]priority_queue类及反向迭代器的模拟实现

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今日主菜&#xff1a; priority_queue类及反向迭代器 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 向着c&…

特征融合篇 | YOLOv8改进之将主干网络SPPF更换为SimSPPF / SPP-CSPC / SPPF-CSPC

前言:Hello大家好,我是小哥谈。SimSPPF是YOLOv6中提出的一种改进的空间金字塔池化方法,它是SPPF的升级版。SimSPPF通过在不同尺度上使用不同大小的池化核来提取特征,从而提高了检测器的性能。与SPPF相比,SimSPPF可以在不增加计算成本的情况下提高检测器的性能。本节课就教…

【软件设计师】原码反码补码移码

数值1数值-1原码0000000110000001反码0000000111111110补码0000000111111111移码1000000101111111 正数 00000001 负数 10000001 正数&#xff1a;原码、反码、补码一样 负数&#xff1a;反码是原码符号位不变&#xff0c;其他取反&#xff1b;补码是反码1 移码是补码首位取…

八、C#计数排序算法

简介 计数排序是一种非比较性的排序算法&#xff0c;适用于排序一定范围内的整数。它的基本思想是通过统计每个元素的出现次数&#xff0c;然后根据元素的大小依次输出排序结果。 实现原理 首先找出待排序数组中的最大值max和最小值min。 创建一个长度为max-min1的数组count…

Ambari——编译——解决替换yarn 版本后 系mvn 打包找不到yarn 文件问题

您的支持是我继续创作与分享的动力源泉!!! 您的支持是我继续创作与分享的动力源泉!!! 您的支持是我继续创作与分享的动力源泉!!! 报错原因&#xff1a; [ERROR] Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.4:yarn (yarn install) on project amb…

入驻抖音小店后这些设置必须打开! 非常重要!否则小店无法运行!

哈喽~我是电商月月 大家入驻完抖音小店后是不是就不管了&#xff0c;直接去选品&#xff1f; 我现在告诉你&#xff0c;直接选品后你会发现你的抖音小店根本运行不了&#xff01; 为什么&#xff1f;那是因为这些设置你没打开&#xff1a; 一抖音号绑定店铺官方账号 抖音小…

Covalent Network(CQT)的以太坊时光机:在 Rollup 时代确保长期数据可用性

以太坊正在经历一场向 “Rollup 时代” 的转型之旅&#xff0c;这一转型由以太坊改进提案 EIP-4844 推动。这标志着区块链技术的一个关键转折&#xff0c;采用了一种被称为“数据块&#xff08;blobs&#xff09;”的新型数据结构。为了与以太坊的扩容努力保持一致&#xff0c;…

面试笔记——Java集合篇

Java集合框架体系 重点&#xff1a;单列集合——ArrayList、LinkedList&#xff1b;双列集合——HashMap、ConcurrentHashMap。 List相关 数组&#xff08;Array&#xff09; 是一种用连续的内存空间存储相同数据类型数据的线性数据结构。 数组获取其他元素&#xff1a; 为什…

【微服务】接口幂等性常用解决方案

一、前言 在微服务开发中&#xff0c;接口幂等性问题是一个常见却容易被忽视的问题&#xff0c;同时对于微服务架构设计来讲&#xff0c;好的幂等性设计方案可以让程序更好的应对一些高并发场景下的数据一致性问题。 二、幂等性介绍 2.1 什么是幂等性 通常我们说的幂等性&…

leetcode 714

leetcode 714 题目 例子 思路1 使用dp[n][2] 存储最佳利润值&#xff0c;动态规划的思路&#xff0c;重要的是转移方程。 代码1 class Solution { public: int maxProfit(vector& prices, int fee) { int n prices.size(); //dp[i][0] 前i天手里没有股票的最大利润 //…

Share-ChatGPT官网UI/文件上传/联网搜索/GPTS 一并同步

地址&#xff1a;Share-ChatGPT 文章目录 界面UI&#xff0c;GPTS&#xff0c;读论文&#xff0c;数据分析&#xff0c;写论文视频演示仓库地址 界面 支持多账号同时管理&#xff0c;合理利用资源&#xff1a; UI&#xff0c;GPTS&#xff0c;读论文&#xff0c;数据分析&a…

老家稳定月薪3000工作和互联网企业3万怎么选?

这是发生在身上的真事。其实刚回老家心里落差非常的大&#xff0c;老家也不需要信息安全非常专业的人才&#xff0c;最终因为各种综合原因选择了回老家&#xff0c;有父母的因素&#xff0c;有4年2次被优化的因素&#xff0c;有互联网行业35岁的因素等等。 我回老家发展很多人…

C语言(结构体,联合体,枚举的讲解)

这期我们来讲解结构体&#xff0c;联合体&#xff0c;以及枚举的讲解&#xff0c;首先我们从概念开始一步一步的了解。 1&#xff0c;结构体 1.1概念 C 语言中的结构体是一种用户自定义的数据类型&#xff0c;它允许你将不同类型的变量组合在一起&#xff0c;从而形成一个新…

集合(下)Map集合的使用

文章目录 前言一、Map接口二、Map接口的实现类 1.HashMap类2.TreeMap类总结 前言 Map集合没有继承Collection接口&#xff0c;不能像List集合和Set集合那样直接使用Collection接口的方法。Map集合其自身通过以key到value的映射关系实现的集合&#xff0c;也有相应的许多方法。类…

零基础机器学习(3)之机器学习的一般过程

文章目录 一、机器学习一般过程1.数据获取2.特征提取3.数据预处理①去除唯一属性②缺失值处理A. 均值插补法B. 同类均值插补法 ③重复值处理④异常值⑤数据定量化 4.数据标准化①min-max标准化&#xff08;归一化&#xff09;②z-score标准化&#xff08;规范化&#xff09; 5.…

[蓝桥杯 2023 省 A] 颜色平衡树:从零开始理解树上莫队 一颗颜色平衡树引发的惨案

十四是一名生物工程的学生&#xff0c;他已经7年没碰过信息学竞赛了&#xff0c;有一天他走在蓝桥上看见了一颗漂亮的颜色平衡树&#xff1a; [蓝桥杯 2023 省 A] 填空问题 - 洛谷 十四想用暴力解决问题&#xff0c;他想枚举每个节点&#xff0c;每个节点代表一棵树&#xff0…

风险评估在网络安全领域的应用与实践

一、引言 在数字化浪潮席卷全球的今天&#xff0c;网络安全已成为企业运营和发展的核心问题。随着信息技术的快速发展&#xff0c;企业面临着日益复杂的网络安全威胁&#xff0c;如黑客攻击、数据泄露、恶意软件等。这些威胁不仅可能导致企业重要信息的丢失或泄露&#xff0c;…

C++模版(基础)

目录 C泛型编程思想 C模版 模版介绍 模版使用 函数模版 函数模版基础语法 函数模版原理 函数模版实例化 模版参数匹配规则 类模版 类模版基础语法 C泛型编程思想 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。 模板是泛型编程…

Retelling|Facebook2

录音 Facebook 2 Retelling|Facebook2 复述转写 Hi, Im Helen Campbell, from DJ interpretation, European Commission, Im going to talk about Facebook. You Im sure that you are more familiar with Facebook, a lot, a lot more familiar than I than me. But Ive read…