当前位置: 首页 > news >正文

C++ 泛型编程,函数模版和类模版

1.泛型编程

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础

就比如说活字印刷术,就是提供一个模具,然后根据模具来印刷出不同的字。

泛型编程跟着类似,提供一个模版,根据这个模版由编译器自动生成不同的函数或者类

2.函数模版

2.1为什么要有函数模版

在c语言中,我们想交换两个整数、交换两个浮点数、交换自定义类型类型,我们必须自己手动写n个函数!!!并且每个函数的函数名都不一样!!!

void SwapInt(int& a,int& b)
{int c = a;a = b;b = c;
}
void SwapDouble(double& a, double& b)
{double c = a;a = b;b = c;
}int main()
{int a1 = 1, b1 = 2;SwapInt(a1, b1);cout << a1 << " " << b1 << endl;double a2 = 1.1, b2 = 2.2;SwapDouble(a2, b2);cout << a2 << " " << b2 << endl;return 0;
}

有没有一种方法能使我们不用再写很多个函数,只用写一个函数(模版),就能完成各个类型的交换呢?这时候函数模版就登场了

2.2怎么使用函数模版

模版格式:

template<class T1,class T2,class T3...>

返回值 函数名(函数参数){  函数体  }

template<class T>
void Swap(T &a ,T &b)
{T c = a;a = b;b = c;
}
int main()
{int a1 = 1, b1 = 2;Swap(a1, b1);cout << a1 << " " << b1 << endl;double a2 = 1.1, b2 = 2.2;Swap(a2, b2);cout << a2 << " " << b2 << endl;return 0;
}

2.3函数模版的实例化

这里我们提供的swap是仅仅只是一个函数模版而已,并不是真正的函数,用不同类型的参数使用函数模板时需要由编译器自动生成一个相应的函数,这就叫做函数模版的实例化!!!

模版的实例化分为显示实例化隐式实例化

2.3.1隐式实例化

由编译器识别实参类型,推导出模版参数的类型

template<class T>
void Swap(T &a ,T &b)
{T c = a;a = b;b = c;
}
int main()
{int a1 = 1, b1 = 2;Swap(a1, b1);double a2 = 1.1, b2 = 2.2;Swap(a2, b2);return 0;
}

由传进来的参数推导出T的类型,这种就叫做隐式实例化

2.3.2显示实例化

在函数名后的<>中指定所传的具体类型

template<class T>
void Swap(T &a ,T &b)
{T c = a;a = b;b = c;
}
int main()
{int a1 = 1, b1 = 2;Swap<int>(a1, b1);double a2 = 1.1, b2 = 2.2;Swap<double>(a2, b2);return 0;
}

3.类模版

3.1为什么需要有类模版

当我们需要两个栈,一个栈存int类型,一个存double类型时,我们又只能自己写两个不同的类,这两个类 类名不同,但是类中除了类型,其他的都是一样的!!!

class StackInt
{
public:StackInt(int capacity = 4){_a = new int[capacity];_top = 0;_capacity = capacity;}~StackInt(){delete[] _a;_a = nullptr;_top = _capacity = 0;}
private:int* _a;int _top;int _capacity;
};
class StackDouble
{
public:StackDouble(int capacity = 4){_a = new double[capacity];_top = 0;_capacity = capacity;}~StackDouble(){delete[] _a;_a = nullptr;_top = _capacity = 0;}
private:double* _a;int _top;int _capacity;
};int main()
{StackInt st1;StackDouble st2;return 0;
}

这时候就需要用到我们的类模版来解决这个问题了.

3.2怎么使用类模版

模版格式:

template<class T1,class T2,class T3...>

class 类名 {  成员函数和成员变量  };

template<class T>
class Stack
{
public:Stack(int capacity = 4){_a = new T[capacity];_top = 0;_capacity = capacity;}~Stack(){delete[] _a;_a = nullptr;_top = _capacity = 0;}
private:T* _a;int _top;int _capacity;
};int main()
{Stack<int> st1;Stack<double> st2;return 0;
}

3.3类模版的实例化

类模版的实例化和函数模版的实例化不同,类模版的实例化是在类名后加<>,在<>中加上实例化的类型, 类模板名字不是真正的类,而实例化的结果才是真正的类

Stack是类名

Stack<int>是类型

相关文章:

C++ 泛型编程,函数模版和类模版

1.泛型编程 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。模板是泛型编程的基础 就比如说活字印刷术&#xff0c;就是提供一个模具&#xff0c;然后根据模具来印刷出不同的字。 泛型编程跟着类似&#xff0c;提供一个模版&#xff0c;根据这…...

【封装UI组件库系列】封装Button图标组件

封装UI组件库系列第四篇封装Button按钮组件 &#x1f31f;前言 &#x1f31f;封装Button组件 1.分析封装组件所需支持的属性与事件 支持的属性&#xff1a; 支持的事件&#xff1a; 2.创建Button组件 &#x1f31f;封装功能属性 type主题颜色 plain是否朴素 loading等…...

windows系统mobaxterm远程执行linux上ssh命令

命令如下 start "" "%~dp0\MobaXterm_Personal_23.4.exe" -newtab "sshpass -p root ssh root192.168.11.92 mkdir 33" -p 是密码 左边是用户名&#xff0c;右边是服务器ip 后面跟的是服务器上执行的命令 第一次执行的时候要设置mobaxt…...

debian 12 配置

1. 修改apt源 修改apt源为http版本 # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware # deb-src http://mirrors.tuna.tsinghua.edu.cn/d…...

AIGC创作系统ChatGPT网站源码、支持最新GPT-4-Turbo模型、GPT-4图片对话能力+搭建部署教程

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…...

Vue 中简易封装网络请求(Axios),包含请求拦截器和响应拦截器

Vue 中简易封装网络请求&#xff08;Axios&#xff09;&#xff0c;包含请求拦截器和响应拦截器 axios简介 Axios 是一个基于 promise 的网络请求库&#xff0c;可以用于浏览器和 node.js Axios官方中文文档 特性 从浏览器创建 XMLHttpRequests从 node.js 创建 http 请求支…...

git提交报错error: failed to push some refs to ‘git url‘

1.产生错误原因 想把本地仓库提交到远程仓库&#xff0c;报错信息如下 git提交报错信息 error: src refspec master does not match any error: failed to push some refs to git url 错误原因&#xff1a; 我们在创建仓库的时候&#xff0c;都会勾选“使用Reamdme文件初始化…...

【Python】(自定义函数)模块的相对路径导入

是我以前写的老文章的升级版&#xff0c;本质上使用exec和sys.path实现相对路径导入。 RelativeImport&#xff1a; __version__1.1.0 __author__Ls_Janimport os import sys import inspectdef RelativeImport(module,*args):#模块导入module为模块所在路径(模块名不需要.py后…...

巧妙之中见真章:深入解析常用的创建型设计模式

设计模式之创建型设计模式详解 一、设计模式是什么&#xff1f;二、模板方法2.1、代码结构2.2、符合的设计原则2.3、如何扩展代码2.4、小结 三、观察者模式3.1、代码结构3.2、符合的设计原则3.3、如何扩展代码3.4、小结 四、策略模式4.1、代码结构4.2、符合的设计原则4.3、如何…...

Selenium切换窗口、框架和弹出框window、ifame、alert

一、切换窗口 #获取打开的多个窗口句柄 windows driver.window_handles #切换到当前最新打开的窗口 driver.switch_to.window(windows[-1]) #最大化浏览器 driver.maximize_window() #刷新当前页面 driver.refresh() 二、切换框架frame 如存在以下网页&#xff1a; <htm…...

QT linux下应用程序打包

一、应用程序app 1、应用程序的pro文件 2、 程序工作函数 3、app的UI界面 二、动态库lib 1、Lib类头文件 2、.cpp文件 三、对应用程序和动态库进行构建 1、对动态库进行qmake,然后进行构建 2、对应用程序进行qmake&#xff0c;然后进行构建 3、查看构建目录 四、编写脚本 …...

Java高级技术(单元测试)

一&#xff0c;概括 二&#xff0c;junit 三&#xff0c;案例 &#xff08;1&#xff09;&#xff0c;实验类 package com.bilibili;public class Name {public static void main(String name) {if (name null){System.out.println("0");return;}System.out.print…...

leetCode 1080.根到叶路径上的不足节点 + 递归 + 图解

给你二叉树的根节点 root 和一个整数 limit &#xff0c;请你同时删除树中所有 不足节点 &#xff0c;并返回最终二叉树的根节点。假如通过节点 node 的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit&#xff0c;则该节点被称之为 不足节点 &#xff0c;需要被删除…...

C++基础 -10- 类

类的格式 public:公共成员 类外可访问 protected:保护成员 类外不可访问 private:私有成员 类外不可访问 class base {public:int a;protected:int b;private:int c;};...

【软件测试】性能测试相关指标

性能测试 了解性能测试相关指标 1.什么是做性能测试 1.1 生活中遇到的软件性能问题 软件用着用着就不能用了&#xff0c;一看热搜&#xff0c;发现该软件的服务器崩崩溃了。 1.2 性能测试定义 测试人员借助性能测试工具&#xff0c;模拟系统在不同场景下&#xff0c;对应…...

Leetcode 2943. Maximize Area of Square Hole in Grid

Leetcode 2943. Maximize Area of Square Hole in Grid 1. 解题思路2. 代码实现 题目链接&#xff1a;2943. Maximize Area of Square Hole in Grid 1. 解题思路 这一题的话其实横轴和竖轴可以分开来独立考察&#xff0c;因为两者互不影响&#xff0c;我们最终的答案一定是两…...

qt 简单了解QHBoxLayout QVBoxLayout QFormLayout水平,垂直,表单布局管理器.

QHBoxLayout水平布局,QVBoxLayout垂直布局,QFormLayout表单布局管理器,是常用的布局管理器,是用代码编写应用界面必不可少的功能类. 1.tips 这里值得注意的是,2个单选按钮(QRadioButton)同时放进一个水平布局管理器(QHBoxLayout)中,相当于放进了一个分组器中,此时,2个单选按钮…...

springboot中4级配置文件优先级

springboot中4级配置文件优先级...

Python(八十九)函数的参数的内存分析

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…...

西南科技大学C++程序设计实验二(类与对象一)

C++最大的特点就是面向对象,掌握它的几种基本性质还是好理解的,可以看我C++专栏的期末速成,希望对你们学习C++有帮助。 一、实验目的 1.理解简单类的定义、说明与使用 2.理解类中不同属性数据成员的访问特点 3.理解构造函数、析构函数的作用 重点:掌握类的定义与实现,…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...