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

news/2024/5/17 1:25:17

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者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.mrgr.cn/p/02134535

相关文章

Python中Keras微调Google Gemma:定制化指令增强大型语言模型LLM

全文链接:https://tecdat.cn/?p=35476 原文出处:拓端数据部落公众号 像谷歌、Meta和Twitter这样的大公司正大力推动其大型语言模型(LLM)的开源。最近,谷歌DeepMind团队推出了Gemma——一个由与创建谷歌Gemini模型相同的研究和技术构建的轻量级、开源LLM系列。 本文,我们…

【python】服务端和客户端 RESTful 接口上传 E

哈喽,大家好,我是木头左,物联网搬砖工一名,致力于为大家淘出更多好用的AI工具! 服务端代码 1. 安装 Flask 和 Flask-RESTful 需要安装 Flask 和 Flask-RESTful 这两个库。Flask 是一个轻量级的 Web 框架,而 Flask-RESTful 则是一个为 Flask 添加了 RESTful API 支持的扩展…

「杂文」蒙特卡洛树搜索算法实现黑白棋AI

妈的下棋下不过爆搜,感觉大脑被雷普了目录写在前面实验内容实验要求实验环境实验原理蒙特卡洛方法(Monte Carlo method)蒙特卡洛树搜索(Monte Carlo tree search)代码结构Infomation.pyBoard.pyNode.pyAI.pyWidget.py代码写在最后 写在前面 人工智能实验报告。 妈的我真的…

综合练习

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 许多初学者都可能遇到这样的问题&#xff0c;就是往 DATE 类型的列插入日期数据时&#xff0c;经常被提示错误。比如下面的 ABC 表结构 SQL> CREATE TABLE test1( 2 id …

下载包时将其下载在正确位置

接上篇 如何将包下载到python的Lib/site-packages目录下使用这个语句—— 解释器位置 -m pip install 包名字 解释器位置查看方式—— File-》Settings… Project:名称-》Python Interpreter 不过需要注意的是,在python中下载文件时最好就不要再同时运行其他的东西了(我就是…

PHP常用的无参函数绕过

PHP常用的无参函数绕过 getallheaders() 这个函数的内容就是获取http所有的头部信息。接着我们可以用var_dump函数来把函数的执行结果都打印出来。这个函数有一个缺陷,它只能在apache中间件环境下使用。我们来在本地测试一下无参函数的具体效果。 测试代码: <?php highli…

视频素材app有哪些?视频素材网址推荐

在这个视觉传达愈发重要的时代&#xff0c;拥有一款好的无水印短视频素材网站就如同握有一把打开创意之门的钥匙&#xff0c;选择合适的短视频素材平台至关重要&#xff0c;这会让你的视频制作更加轻松而高效。 1&#xff0c;蛙学府 以其广泛的优质视频素材库而闻名&#xff0…

手把手教你做阅读理解题-初中中考阅读理解解题技巧002

PDF格式公众号回复关键字:ZKYD002阅读理解技巧,在帮助读者有效获取和理解文本信息方面发挥着重要作用,熟练掌握如下6个技巧,可快速突破阅读理解 1 预览文章结构 在开始深入阅读之前,快速浏览文章的标题、段落开头和结尾,可以迅速把握文章的主题、大致内容和结构 标题通常能…

2. Ubuntu Linux 操作系统安装

2.1 下载Ubuntu iso文件(可以选择镜像源),版本 24.04.4。 2.2 设置虚拟光盘文件。 2.3 安装Ubuntu. 启动虚拟机。 选择语言中文简体,安装Ubuntu键盘布局选择English(US)点击继续,清理整个磁盘并安装Ubuntun,时间选择pei-ching设置计算机账户密码。 安装Ubuntu,安装完成启…

信号的概念和机制

1.信号的概念和机制理解信号可以参考生活中,烽火、狼烟等 信号的特点:1.简单;2.不能携带大量信息;3.满足某个特设条件才发送1.1.信号的机制 信号时软件层面的“中断”,信号VS中断VS异常,三个概念可以一起学习 每个进程收到的所有信号,都是由内核负责发送、内核处理的 简…

Go --- Go语言垃圾处理

概念 垃圾回收&#xff08;GC-Garbage Collection&#xff09;暂停程序业务逻辑SWT&#xff08;stop the world&#xff09;程序根节点&#xff1a;程序中被直接或间接引用的对象集合&#xff0c;能通过他们找出所有可以被访问到的对象&#xff0c;所以Go程序的根节点通常包括…

Devvortex Hack the box

nmap -A -oN initial_scan 10.10.11.242发现打开了80和22 用dirsearch和fuff扫子域名和子目录 直接发现目录/administrator 进去发现是Joomla页面发现版本是4,那么就和漏洞Joomla(CVE-2023-23752)一样 可以看https://xz.aliyun.com/t/12175?time__1311=mqmhD5DK7IejhDBdPx2DU…

Python接口自动化(什么是接口、接口优势、类型)

简介 经常听别人说接口测试&#xff0c;接口测试自动化&#xff0c;但是你对接口&#xff0c;有多少了解和认识&#xff0c;知道什么是接口吗&#xff1f;它是用来做什么的&#xff0c;测试时候要注意什么&#xff1f;坦白的说&#xff0c;笔者之前也不是很清楚。接下来先看一…

uniapp自定义导航栏左中右内容和图标,以及点击事件

uniapp自定义导航栏左中右内容和图标&#xff0c;以及点击事件 效果&#xff1a; 页面&#xff1a; <view class"navigation-bar"><view class"navigation-bar-left" click"navigateBack"><u-icon name"arrow-left"…

VoxelRCNN

PDF: Voxel R-CNN: Towards High Performance Voxel-based 3D Object Detection CODE: https://github.com/djiajunustc/Voxel-R-CNN 一、大体内容 现有基于Point-based的目标检测方法可以保留精确点的位置,具有更好的性能,但是由于无序的存储方式,计算量很大。而Voxel-base…

关于在forEach循环中使用异步,造成forEach里面的函数还未执行完毕,外层的同步已经被执行的问题

使用 原生的 for循环替代forEach循环即可解决问题 1.实例代码&#xff1a; select_Father_comment_sql_res.forEach( (item) > {const Select_FId_children_sql util.format("Select *, \IFNULL(User.UserName,) as CommentUserName, \IFNULL(User.UserName,) as AtU…

FreeType Glyph Conventions 翻译(7)——FreeType点阵图 Bitmaps

原文地址 https://freetype.org/freetype2/docs/glyphs/glyphs-7.html 目录矢量坐标 和 像素坐标 Vectorial versus pixel coordinatesFT_Bitmap描述符 The FT_Bitmap descriptor将轮廓线转化为点阵图 Converting outlines into bitmaps and pixmaps 这一节的目标是展示FreeTyp…

flask_restful规范返回值

使用方法 导入 flask_restful.marshal_with 装饰器 定义一个字典变量来指定需要返回的标准化字段&#xff0c;以及该字段的数据类型 在请求方法中&#xff0c;返回自定义对象的时候&#xff0c; flask_restful 会自动的读 取对象模型上的所有属性。 组装成一个符合标准化参…

FPGA接口系列——UART

FPGA接口系列——UART 一、UART简介 UART是一种采用异步串行通信方式的通用异步收发传输器。这里我们主要弄明白两个问题:①什么是串行通信,与并行通信有什么区别 ②同步串行通信和异步串行通信有什么区别 ③我们常说的UART和 RS232 以及 RS485 又有什么区别? 串行通信和并…

分析nginx日志统计接口情况

一、背景 近来打算对后端接口进行优化,所以要先对现有接口的情况进行统计。因为相关业务接口是index.php?action=XXX的形式,所以公司运维的管理平台并不能满足需求,所以要自行处理nginx日志获取接口的情况了。 二、处理思路 1.nginx日志中不止包含相关接口的日志,所以先要…