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.rhkb.cn/news/287057.html

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

相关文章

背包DP模板

01背包 01背包-1 #include <bits/stdc.h> using namespace std;const int N 1e5 10; int n, m, f[N][N], v[N], w[N];int main() {cin >> n >> m;for (int i 1; i < n; i) {cin >> v[i] >> w[i];}for (int i 1; i < n; i) {for (int…

Python提取本体文件的数据

运行结果&#xff1a; 使用replace函数去除前缀。 查找OWL的对象属性&#xff1a; 输出结果&#xff1a; 出现最后这个的原因&#xff1a; 修改程序&#xff1a; 最后的输出结果&#xff1a; 这个解析之后是这个样子的&#xff1a;

C++_回文串

目录 回文子串 最长回文子串 分割回文串 IV 分割回文串 II 最长回文子序列 让字符串成为回文串的最少插入次数 回文子串 647. 回文子串 思路&#xff0c;i j表示改范围内是否为回文串&#xff0c; ②倒着遍历是为了取出dp[i 1][j - 1] ③i j 只有一对&#xff0c;不会重复…

C++ 动态规划

文章目录 一、简介二、举个栗子2.1斐波那契数列2.2最短路径&#xff08;DFS&#xff09; 参考资料 一、简介 感觉动态规划非常的实用&#xff0c;因此这里整理一下相关资料。动态规划&#xff08;Dynamic Programming&#xff09;&#xff1a;简称 DP&#xff0c;是一种优化算法…

淘宝app商品数据API接口|item_get_app-获得淘宝app商品详情原数据

获得淘宝app商品详情原数据 API返回值说明 item_get_app-获得淘宝app商品详情原数据 公共参数​​​​​​ 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地…

优化选址问题 | 基于和声搜索算法求解基站选址问题含Matlab源码

目录 问题代码问题 和声搜索算法(Harmony Search, HS)是一种模拟音乐创作过程中乐师们凭借自己的记忆,通过反复调整各乐器的音调,直至达到最美和声状态为启发,通过反复调整解向量的各分量来寻求全局最优解的智能优化算法。 下面是一个基于和声搜索算法求解基站选址问题的…

全面剖析Java多线程编程,抢红包、抽奖实战案例

黑马Java进阶教程&#xff0c;全面剖析Java多线程编程&#xff0c;含抢红包、抽奖实战案例 1.什么是多线程&#xff1f; 2.并发与并行 CPU有这些&#xff0c;4,8,16,32,64 表示能同时进行的线程 3.多线程的第一种实现方式 package com.itheima.reggie;/*** Author lpc* Date …

现在的市场对 C++ 的需求大吗?

先说结论&#xff1a;需求还是很大&#xff0c;但是没有什么初级程序员能干的岗位。 游戏引擎&#xff0c;存储&#xff0c;推荐引擎&#xff0c;infra&#xff0c;各种各样的性能敏感场景。 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;…

RocketMQ学习笔记:消息存储模型,持久化文件,过期文件删除

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、消息存储结构1.1、CommitLog详解1.1.1、CommitLog存储的优点 1.2、ConsumeQueue详解1.3、Index详解 2、持久化文件3、过期文件删除机制3.1、判断过期文件3.2、删除的时机 1、消息存储结构…

大学宠物医疗试题及答案,分享几个实用搜题和学习工具 #学习方法#笔记#知识分享

大学开学&#xff0c;就意味着又回到了被线性代数、大学物理等测验题折磨的状态了……网站无法手动输入题干公式&#xff0c;初高中用过的搜题软件又都搜不到&#xff0c;想找个答案解析仿佛在大海捞针&#xff01;不过不用怕&#xff0c;今天小林就把从大学攒到毕业工作都在使…

一个单生产-多消费模式下无锁方案(ygluu/卢益贵)

一个单生产-多消费模式下无锁方案 ygluu/卢益贵 关键词&#xff1a;生产者-消费者模型、无锁队列、golang、RWMutex 本文介绍一个“单生产(低频)-多消费”模式下的无锁哈希类方案&#xff0c;这个方案的性能优于golang的RWMutex&#xff0c;因为它永远不会因为“写”而导致与…

网络上常见的环路指的是什么

人类的创造力与破坏力同样强大"。 网路互通&#xff0c;同样也衍生出纷繁复杂的路由协议和各种因特网服务&#xff0c;以及"网络安全"这个庞大的领域。 这也是为什么说当今所有的网络通讯流量中&#xff0c;80%的资源都被浪费&#xff0c;只有20%被用以有效数…

数字功放VS模拟功放,选择适合你的音频解决方案

数字功放和模拟功放是音频系统中常用的两种功放技术&#xff0c;适用于不同的音频应用&#xff0c;都具有各自的优势和特点。本文将为您详细介绍数字功放和模拟功放的差异&#xff0c;并帮助您找到适合自己的音频解决方案。 1、数字功放是一种利用数字信号处理技术的功放。它将…

matplotlib查询当前系统所有字体

电脑里有这个字体但是不代表matplotlib里也有这个字体&#xff0c;所以解决matplotlib中的中文显示问题主要就是要找到它所内置支持的字体&#xff0c;那么我们首先查看一下它的内置字体&#xff0c;运行以下代码查看所支持的字体 # 查询当前系统所有字体 from matplotlib.fon…

Qt笔记 事件处理_鼠标事件

什么是事件&#xff1f; 点击鼠标左键&#xff0c;双击鼠标左键&#xff0c;鼠标来回移动&#xff0c;按下键盘按钮&#xff0c;这些都是事件。 那么事件的响应机制是什么样的呢&#xff1f; 首先main函数中有一个QApplication&#xff0c;其作用是创建一个应用程序对象&…

IPV6协议之DHCPV6

目录 背景&#xff1a; 一、DHCPV6概述 DHCPv6 Client&#xff1a; DHCPv6 Relay&#xff1a; DHCPv6 Server&#xff1a; 二、DHCPV6工作原理 DHCPV6无状态自动分配 三、DHCP基础配置 服务端 四、DHCPV6地址更新时间&#xff08;DHCPV4租期&#xff09; 五、DHCPV6…

Spring设计模式-实战篇之单例模式

实现案例&#xff0c;饿汉式 Double-Check机制 synchronized锁 /*** 以饿汉式为例* 使用Double-Check保证线程安全*/ public class Singleton {// 使用volatile保证多线程同一属性的可见性和指令重排序private static volatile Singleton instance;public static Singleton …

智能楼宇3D可视化解决方案

什么是智能楼宇? 智能楼宇是为提高楼宇的使用合理性与效率,配置合适的建筑环境系统与楼宇自动化系统、办公自动化与管理信息系统以及先进的通信系统,并通过结构化综合布线系统集成为智能化系统的大楼。 面临的问题 信息孤岛,无法统一管理 各个子系统独立工作、独立管理,…

海外媒体软文发稿:谷歌关键词优化细分人群成功案例,突破海外市场!

海外媒体软文发稿&#xff1a;谷歌关键词优化细分人群成功案例&#xff0c;突破海外市场&#xff01; 引言 在全球化的时代&#xff0c;海外市场对于企业的发展至关重要。而在海外市场中&#xff0c;互联网媒体的作用不可忽视。本篇教程将介绍如何通过谷歌关键词优化细分人群…

Python框架篇(7):FastApi-依赖项

有时选择太多也会让人陷入焦虑&#xff0c;比如突然有一段自由时间&#xff0c;却因为想做的事情太多&#xff0c;最后把时间都浪费在了摇摆不定上&#xff0c;静不下心做最重要的事&#xff0c;或者说根本不知道最重要的事情是什么。---------- 《认知觉醒:开启自我改变的原动…