iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++超详细介绍模板
  • 369
分享到

C++超详细介绍模板

2024-04-02 19:04:59 369人浏览 独家记忆
摘要

目录定义例子格式处理方法定义 函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。

定义

函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。

一个程序一般是经过预处理——>编译——>汇编——>链接。但是因为程序无法知道模板的具体类型(int,double),所以无法进行预处理,也就不能生成可执行代码。

例子

下面我们来看一个例子

我们在学习C语言的时候,当我们需要交换两个数,我们是这样做的

交换整数

void Swap(int & x, int & y)
{
    int tmp = x;
    x = y;
    y = tmp;
}

交换小数

void Swap (double & xr double & y)
{
    double tmp = x;
    x = y;
    y = tmp;
}

我们可以看出,只要类型做了变化,我们就需要重新写一个几乎不变的代码,这是非常不方便的。

那么我们像活字印刷术一样做一个模板出来让编译器根据自行推导类型呢?

于是模板就出现了。

对于上面的情况,我们模板是这样处理的。

格式

template <class T>
void Swap(T & x, T & y)
{
    T tmp = x;
    x = y;
    y = tmp;
}
template <class T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 3;
	int b = 2;
	Swap(a, b);
	cout << a << endl<< b << endl;
	return 0;
}

template <class 类型参数1, class类型参数2, ...>
返回值类型  模板名(形参表)
{
    函数体
}

意识就是说,我们在这里用template定义了一个模板”T”,当我们使用Swap的时候,计算机根据我们a,b(都是int)的类型,推出T应当是int 型。

实际上这个

void Swap(T & x, T & y)

变成了

void Swap (int & x, int & y)

但是需要注意,只有当a,b都是同类型的时候,计算机才能自动推到,如果是不同类型,我们将b换为double类型

template <class T>
void Swap(T & x, T & y)
{
    T tmp = x;
    x = y;
    y = tmp;
}
template <class T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 3;
	double b = 2.5;
	Swap(a, b);
	cout << a << endl<< b << endl;
	return 0;
}

就会出现:

因为两个数一个int一个double,计算机就不知道给这个T赋int 还是double,这个时候有两种处理方法

处理方法

第一种隐式实例化:让编译器根据实参推演模板参数的实际类型

#include<iOStream>
using namespace std;
template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}
int main()
{
	int a1 = 10, a2 = 20;
	double d1 = 10.0, d2 = 20.5;
	Add<int>(a1, d2);//在这个地方前面加<int>,计算机就会默认T为int型
}

第二种显式实例化:在函数名后的<>中指定模板参数的实际类型

#include<iostream>
using namespace std;
template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}
int main()
{
	int a1 = 10, a2 = 20;
	double d1 = 10.0, d2 = 20.5;
	Add(a1,(int) d2);//此处d2原本是double型,但是我们强制转换为int之后,两者的类型都相同,计算机就能自动推导了
}

到此这篇关于c++超详细介绍模板的文章就介绍到这了,更多相关C++模板内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++超详细介绍模板

本文链接: https://www.lsjlt.com/news/153732.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++超详细介绍模板
    目录定义例子格式处理方法定义 函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。 ...
    99+
    2024-04-02
  • C++模板超详细介绍
    目录1.前言2.函数模板3.类模板1.前言 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。 模板是创建泛型类或函数的蓝图或公式。 通常有两种形式:函数模板和...
    99+
    2024-04-02
  • 【C++】详细介绍模版初阶—函数模版、类模板
    文章目录 一、泛型编程二、函数模版2.1 函数模版概念2.2 函数模版格式2.3 函数模版的原理2.4 函数模版的实例化2.5 函数模版的匹配原则 三、类模版3.1 类模版定义3.2 类模...
    99+
    2023-09-02
    c++ 前端
  • C++中模板和STL介绍详解
    目录一、模板1.1.函数模板1.1.1.两种函数模板的实例化1.1.2.模板参数的匹配原则1.2.类模板二、STL总结一、模板 对于一个交换函数,虽然C++支持函数重载,我们可以对多...
    99+
    2024-04-02
  • C++模板的特化超详细精讲
    目录一、泛型编程二、函数模板2.1、函数模板的概念2.2、函数模板的格式2.3、函数模板的原理2.4、函数模板的实例化2.4.1、隐式实例化2.4.2、显示实例化三、类模板3.1、类...
    99+
    2022-11-13
    C++ 模板特化 C++ 模板函数特化
  • C++超详细讲解模板的使用
    目录一、函数模板1.1函数模板概念1.2 函数模板格式1.3 函数模板的原理1.4 函数模板的实例化二、类模板2.1 类模板的定义格式2.2类模板的实例化总结一、函数模板 1.1函数...
    99+
    2024-04-02
  • C++模板Template详解及其作用介绍
    目录1. 模板2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板原理2.4 函数模板的实例化2.5 模板参数的匹配原则2.6声明定义分离3. 类模板3.1 类模板...
    99+
    2024-04-02
  • JavaLambda表达式超详细介绍
    目录一、背景1.Lambda表达式的语法2.函数式接口二、Lambda表达式的基本使用三、语法精简四、变量捕获五、Lambda在集合当中的使用1.Collection接口六、List...
    99+
    2024-04-02
  • ReentrantLock介绍及使用(超详细)
    点击 Mr.绵羊的知识星球 解锁更多优质文章。 目录 一、介绍 1. 简介 2. 是什么类型的锁 3. 优点 4. 原理 5. 主要方法 6. 使用时注意事项 二、实际应用 1. 案例一 2. 案例二 一、介绍 1. 简介     ...
    99+
    2023-09-20
    java 开发语言
  • C++中模板(Template)详解及其作用介绍
    目录概述函数模板类模板模板类外定义成员函数类库模板抽象和实例概述 模板可以帮助我们提高代码的可用性, 可以帮助我们减少开发的代码量和工作量. 函数模板 函数模板 (Function...
    99+
    2024-04-02
  • C++继承详细介绍
    在我们进行开发的时候,我们经常会遇到抽象出来的类之间具有继承关系。 举个简单的例子,比如我们在设计某游戏,当中需要定义Human也就是人这个类。每个人有名字,以及一定的血量,能够工作...
    99+
    2024-04-02
  • C++多态特性之派生与虚函数与模板详细介绍
    目录继承与派生虚函数父类代码如下模板函数模板类模板字符串继承与派生 C ++ 是面向对象编程,那么只要面向对象,都会有多态、继承的特性。C++是如何实现继承的呢? 继承(Inheri...
    99+
    2024-04-02
  • Flask模板渲染与Get和Post请求详细介绍
    目录模板渲染GET和POST请求模板渲染 所谓模板渲染就是让flask渲染一个html文档,比如你有一个html文件,想要在网站上加载出来,你就要渲染它。 首先把这个文件,叫做模板渲...
    99+
    2024-04-02
  • SpringBoot底层注解超详细介绍
    目录1. @Configuration2. @bean3. @Import4. @Conditional条件装配5. 配置绑定SpringBoot自动配置原理(源码分析)1. @Co...
    99+
    2024-04-02
  • Kotlin扩展函数超详细介绍
    目录1.扩展函数2.infix 关键字3.扩展函数文件4.重命名扩展函数1.扩展函数 1)当我们没法接触某个类的定义,或者某个类没有用open修饰无法继承时,我们可以通过扩展函数,来...
    99+
    2024-04-02
  • Phar反序列化超详细介绍
    目录Phar是什么如何创建一个Phar 文件如何反序列化利用Phar是什么 在百度中得到介绍是这样的: 在软件中,PHAR(PHP归档)文件是一种打包格式,通过将许多PHP代码文件和...
    99+
    2022-11-16
    Phar反序列化方法 Phar反序列化 Phar序列化
  • Kotlin扩展方法超详细介绍
    目录前言一、扩展方法1.扩展方法的原型2.扩展方法的使用二、Kotlin扩展方法实现原理三、泛型扩展方法四、扩展属性五、为伴生对象添加扩展六、Kotlin 中常用的扩展七、案例前言 ...
    99+
    2024-04-02
  • React事件处理超详细介绍
    目录1. 事件绑定1.1 函数组件1.2 类组件2. 合成事件3. 事件传参的3种不同写法4. this 指向问题1. 事件绑定 React 元素的事件处理和 DOM 元素的很相似,...
    99+
    2024-04-02
  • VueRouter路由守卫超详细介绍
    目录全局前置&后置路由守卫独享路由守卫组件内路由守卫全局前置&后置路由守卫 router/index.js import Vue from 'vue'; import...
    99+
    2023-01-28
    Vue Router路由守卫 Vue 路由守卫
  • Jetpack Compose Canvas绘制超详细介绍
    目录1. Canvas2. 绘制方法1. drawLine2. drawRect3. drawRoundRect4. drawImage5. drawCircle6. drawArc...
    99+
    2022-11-13
    Jetpack Compose Canvas Jetpack Canvas绘制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作