当前位置:首页 > 科技  > 软件

C++之函数模板

来源: 责编: 时间:2023-12-13 17:02:02 315观看
导读为什么需要模板相信写过Java的童鞋们都知道泛型编程,在C++中与之对应的就是模板。模板是一种对类型进行参数化的工具,通常有两种形式:函数模板和类模板。模板是一些为多种类型而编写的函数和类,而且这些类型都没有指定。

为什么需要模板

相信写过Java的童鞋们都知道泛型编程,在C++中与之对应的就是模板。KFS28资讯网——每日最新资讯28at.com

模板是一种对类型进行参数化的工具,通常有两种形式:函数模板和类模板。KFS28资讯网——每日最新资讯28at.com

KFS28资讯网——每日最新资讯28at.com

模板是一些为多种类型而编写的函数和类,而且这些类型都没有指定。当使用模板的时候,你只需要把所希望的类型作为一个(显式或者隐式的)实参传递给模板。 另外,由于模板是语言本身所具有的特性,所以它完全支持类型检查和作用域。使用模板的目的就是能够让程序员编写与类型无关的代码,尽可能地减少重复代码。KFS28资讯网——每日最新资讯28at.com

众所周知,C++是一门强类型的静态语言。在声明变量、函数和大多数其他类型的实体的时候,C++要求我们使用指定的类型。 然而,对于许多代码,除了类型不同之外,其余的代码看起来都是相同的。例如我们需要实现一个交换两个变量的函数,为了通用性, 这个交换变量的函数不能固定两个变量的类型,这就使得模版横空出世。。。KFS28资讯网——每日最新资讯28at.com

在C++标准库中,几乎所有的代码都是模板代码,可以说没有C++模板就没有STL。KFS28资讯网——每日最新资讯28at.com

模板函数

首先我们看下函数模板的格式:KFS28资讯网——每日最新资讯28at.com

template <typename 形参名,typename 形参名,......> 返回类型 函数名(参数列表){    函数体}

或者使用class关键字也可:KFS28资讯网——每日最新资讯28at.com

template <class 形参名,class 形参名,......>  返回类型 函数名(参数列表){    函数体}

为什么会有两种不同的格式呢?这是因为鉴于历史的原因,你可能还会使用class取代typename,来定义类型参数。 在C++语言的演化过程中,关键字typename的出现相对较晚一些;在它之前,关键字class是引入类型参数的唯一方式,并一直作为有效方式保留下来。 但是更加标准的格式是使用typename关键字。KFS28资讯网——每日最新资讯28at.com

例如我们使用模板定义了返回较大值的模板函数:KFS28资讯网——每日最新资讯28at.com

template <typename T>const T& max_fun(const T& a,const T& b){    return a >= b? a:b;}

下面我们调用一下我们定义的模板函数max_fun:KFS28资讯网——每日最新资讯28at.com

int main(int argc, char* argv[]) {    // 都是int类型 ok    int max = max_fun(10,10);    // 都是double类型 ok    int max = max_fun(10,10);    // 一个int类型,一个double类型 编译不通过    int max = max_fun(10,11.0);    std::cout << "max:" << max << std::endl;    return 0;}

在上面的例子中我们发现函数max_fun(10,11.0)报错了,无法编译通过,这是为什么呢?因为我们定义的模板函数max_fun只有一个参数类型, 但是max_fun(10,11.0)却传了两个不同的参数类型,二载函数模板中是不允许进行自动类型转换的,因此报错,有两种方式可以解决这个报错:KFS28资讯网——每日最新资讯28at.com

  • 一是对实参进行强制类型转换,使它们可以互相匹配:
max_fun(10,static_cast<int>(11.0));
  • 二是显式指定(或者限定)T的类型:
max_fun<int>(10,11.0);

重点:在函数模板实参演绎的过程中,是不允许进行自动类型转换的。KFS28资讯网——每日最新资讯28at.com

重载函数模板

模板函数在使用时编译器回自动实现实例化,只要使用函数模板,(编译器)会自动地引发这样一个实例化过程,因此程序员并不需要额外地请求模板的实例化。KFS28资讯网——每日最新资讯28at.com

和普通函数一样,函数模板也可以被重载。就是说,相同的函数名称可以根据不同的函数参数具有不同的函数定义; 于是,当使用函数名称进行函数调用的时候,C++编译器必须决定究竟要调用哪个候选函数。KFS28资讯网——每日最新资讯28at.com

一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。 对于非模板函数和同名的函数模板,如果其他条件都是相同的话,那么在调用的时候,重载解析过程通常会调用非模板函数,而不会从该模板产生出一个实例。KFS28资讯网——每日最新资讯28at.com

下面我们通过一个小例子来了解下重载函数模板:KFS28资讯网——每日最新资讯28at.com

#include <iostream>#include <memory>template <typename T>const T& max_fun(const T& a,const T& b){std::cout << "模板类型max_fun:"<< std::endl;return a >= b? a:b;}const int& max_fun(const int& a,const int& b){std::cout << "int 类型max_fun:"<< std::endl;return a >= b? a:b;}int main(int argc, char* argv[]) {// 都是double类型 匹配到模板函数max_fun//    int max = max_fun(10.0,11.0);// 都是int类型 匹配到 普通函数max_fun//    int max = max_fun(10,10);// 一个char类型,一个double类型 匹配到普通函数max_funint max = max_fun('a',11.0);std::cout << "max:" << max << std::endl;return 0;}

在上面的例子main函数中我们多次调用了函数max_fun,那么怎么区分是调用了模板函数max_fun还是调用了重载的普通函数max_fun呢?KFS28资讯网——每日最新资讯28at.com

有一条规则是这样的:KFS28资讯网——每日最新资讯28at.com

一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。对于非模板函数和同名的函数模板,如果其他条件都是相同的话,那么在调用的时候,重载解析过程通常会调用非模板函数,而不会从该模板产生出一个实例。KFS28资讯网——每日最新资讯28at.com

KFS28资讯网——每日最新资讯28at.com

因此在上面的例子中我们可以很容易地看出第17行调用的是模板函数max_fun,因为没有参数是double类型的max_fun被重载。 但在第19行因为有一个参数是int类型的重载函数max_fun,因此这一行调用的是普通重载函数max_fun。KFS28资讯网——每日最新资讯28at.com

那么在第21行也是调用了int类型的重载函数max_fun,这是为什么呢?KFS28资讯网——每日最新资讯28at.com

这是因为模板是不允许自动类型转化的,但普通函数可以进行自动类型转换,所以第21行调用的是int类型的重载函数max_fun(‘a’和11.0都被转化为int)。KFS28资讯网——每日最新资讯28at.com

函数重载应该牢记一条首要规则:函数的所有重载版本的声明都应该位于该函数被调用的位置之前。KFS28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-44395-0.htmlC++之函数模板

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Spring Boot + MyBatis-Plus 实现 MySQL 主从复制动态数据源切换

下一篇: Python中的Random模块,随机性的神奇世界

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 轿车从天而降电动车主被撞身亡 超速抢道所致:现场视频让网友吵翻

    近日,上海青浦区法院判决轿车从天而降电动车主被撞身亡案,轿车车主被判有期徒刑一年。案件显示当时男子驾驶轿车在上海某路段行驶,前车忽然转弯提速超车,
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人&ldquo;珍藏&rdquo;是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页&ldquo;充值中心&rdquo;入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾&ldquo;低价&rdquo;口号。而过去与他们错位竞争的拼多多,靠
  • 苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
Top