『c++』 模板(template)--- 参数化多态性
---恢复内容开始---
题外话:
模板机制的设计和细节是由Bjarne Stroustrup在其1988年10月发表的名为“Parameterized Types for C++”一文中披露的。
引入:
假设有两个类
它们的结构完全相同,差别就是数据类型int与double,因此我们可以引入下图结构表示:
在建立对象时用实参int或double代入形参T即可,这种做法成为参数化,即是将数据类型作为参数传递,用以替代形参T的实参可以是预定义数据类型或用户自定义数据类型(主要是类的对象),这是参数化的多态性。
详解:
一 函数模板
上图定义了函数模板,主函数建立了三个模板函数,其中sq(i)使用 int 类型将类型形参 T实例化,sq(l)使用 long 型使形参T实例化,sq(5.55)则是double型。
由此可见,在函数模板中使用类型参数 T 作为形参,这不是具体函数而是函数的抽象。等到进行实例化,即代入具体类型实参例如int、double等以后,就建立了具体函数,被称为模板函数。
二,函数模板的重载
由结果明显可以看出,max(i,j),max(d,f),max(ch,hc)重载的为模板函数,max(d,j),max(i,d),max(ch,f)则调用的重载函数,注意下max(i,j),i,j同为int类型,max(d,f),d,f同为double型,ch,hc则同为char,我们返回查看函数并未发现与之相匹的重载函数,而max(d,j),max(i,d),我们在找到了与其匹配的重载函数,其恰巧也是调用的相应重载函数,但对于max(ch,f),ch为char类型,f为double的类型,首先程序中没有与之匹配的重载函数,也无匹配的函数模板,肿么办?程序显示了其调用了void max(int a, double b),我们不禁疑惑,为什么它不调用void max(double b, int a),而偏偏调用前一个函数,细观察另个函数的形式参数,不难发现void max(int a, double b),第二个形式参数为double类型,与f为同一类型,相比void max(double b, int a)更为接近,为什么会这样呢?查看调用的规则,我们会发现在混合使用重载的函数和模板时,应当避免二义性。此时它们的调用顺序是:
1.先调用匹配的重载函数
2. 如无匹配的重载函数,则调用匹配的函数模板。如果找到,则将其实例化,建立一个模板函数
3. 如再匹配不上,则调用相近的重载函数,此时可能丢失精度。
因此,可粗略地归纳为:先重载,再模板,后相近。
三 重载函数与函数模板都属于多态性机制,它们的区别如下:
(1)主函数调用重载函数和模板函数的格式完全相同。
重载函数的优点是能够对不同数据类型使用不同程序逻辑进行类似操作。例如用于求取int或double的最大值的程序逻辑和操作就和求取char或char*的最大值的程序逻辑和操作差别很大。而函数模板无法处理。
如果每种数据类型的程序逻辑和操作相同,则使用函数模板将会更加简洁和方便。
模板是一种代码产生机制。
(2)对于重载函数,无论它们使用与否,全部都存于代码区中,都占用空间。
而对于函数模板,只当使用一个具体参数类型时才建立一个模板函数,而当使用另一个具体参数类型时再建立另一个模板函数。编程方便,使用灵活,效率较高。
---恢复内容结束---
『c++』 模板(template)--- 参数化多态性的更多相关文章
- 『WPF』DataGrid的使用
原文 『WPF』DataGrid的使用 几点说明 这里主要是参考了MSDN中关于DataGrid的说明 这里只会简单说明在WPF中,DataGird最简单的使用方法 对于MSDN中的翻译不会很详细,也 ...
- 『片段』OracleHelper (支持 多条SQL语句)
C# 调用 Oracle 是如此尴尬 >System.Data.OracleClient.dll —— .Net 自带的 已经 过时作废. >要链接 Oracle 服务器,必须在 本机安装 ...
- 『实践』VirtualBox 5.1.18+Centos 6.8+hadoop 2.7.3搭建hadoop完全分布式集群及基于HDFS的网盘实现
『实践』VirtualBox 5.1.18+Centos 6.8+hadoop 2.7.3搭建hadoop完全分布式集群及基于HDFS的网盘实现 1.基本设定和软件版本 主机名 ip 对应角色 mas ...
- 『AngularJS』$location 服务
项目中关于 $location的用法 简介 $location服务解析在浏览器地址栏中的URL(基于window.location)并且让URL在你的应用中可用.改变在地址栏中的URL会作用到$loc ...
- [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装
[原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...
- JS 中通过对象关联实现『继承』
JS 中继承其实是种委托,而不是传统面向对象中的复制父类到子类,只是通过原型链将要做的事委托给父类. 下面介绍通过对象关联来实现『继承』的方法: Foo = { // 需要提供一个 init 方法来初 ...
- 『摄影欣赏』16幅 Romantic 风格照片欣赏【组图】
今天,我们将继续分享人类情感的系列文章.爱是人类最重要的感觉,也可能是各种形式的艺术(电影,音乐,书,画等)最常表达的主题 .这里有40个最美丽的爱的照片,将激励和给你一个全新的视觉角度为这种情绪.我 ...
- 『开源』Slithice 2013 服务器集群 设计和源码
相关介绍文章: <『设计』Slithice 分布式架构设计-支持一体式开发,分布式发布> <『集群』001 Slithice 服务器集群 概述> <『集群』002 Sli ...
- 『设计』Laura.Compute 设计思路
前言: 前一篇文章 <『开源』也顺手写一个 科学计算器:重磅开源> ,继 Laura.Compute 算法开源之后,有 博客园 园友 希望公开一下 Laura.Compute算法 的 设计 ...
随机推荐
- spring && Cobertura && maven &&junit 单元测试以及测试覆盖率
1. 目的: junit 单元测试,Cobertura 测试覆盖率报告 项目目录结构 2. maven 配置 <project xmlns= ...
- 性能测试知多少---系统架构分析 转自https://yq.aliyun.com/articles/35147?spm=5176.100239.blogcont24251.8.lS96At
摘要: 有些事儿一旦放一放就难再拾起来,突然发现<性能测试知多少>这个系列两月没更新,关键时我都不知道啥时候放下的,总容易被各种技术所吸引走,如饥似渴的想学更多的东西,这几天一直有朋友问我 ...
- [转]windows下编译及使用libevent
http://www.cnblogs.com/luxiaoxun/p/3603399.html Libevent官网:http://libevent.org/ windows 7下编译: 编译环境: ...
- mysql主从复制+读写分离 菜鸟入门
MYsql主从复制 1.mysql主从复制原理: Master将数据变化记录到二进制日志中[binary log] Slave将master的二进制日志[binary log]拷贝到自己的中继日志[r ...
- 百度地图api 标注的图标不显示问题
图中郑州PPT设计制作中心前面应该有一个小的标,但是死活就是不显示. 经过百度搜索和测试,终于解决.应该是页面定义的CSS和百度的冲突了,解决办法如下: 在当前页面中,加入 <style typ ...
- 集合Collection
/* * 集合的由来: * 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储. * 而要想存储多个对象,就不能是一个基本 ...
- OAF_开发系列20_实现OAF打印功能
ddddd 添加一个页面级的button区域:pagebuttonBar,在之下添加button item ,这里主要设置的参数有:采用默认的oaf的打印按钮的id名称: IcxPrintablePa ...
- codeforces 83 D. Numbers
题意: 给出l,r,k,(1 ≤ l ≤ r ≤ 2·109, 2 ≤ k ≤ 2·109) 求在区间[l,r]内有多少个数i满足 k | i,且[2,k-1]的所有数都不可以被i整除 首先,如果k不 ...
- Unicode 转成中文
代码转换如下: if __name__ == "__main__": data = "\u5c71\u5cb3\u548c\u4e00\u5207\u4e18\u9675 ...
- ORACLE10gRAC数据库迁移至10gRAC
1.数据库备份RUN {ALLOCATE CHANNEL ch00 DEVICE TYPE disk;ALLOCATE CHANNEL ch01 DEVICE TYPE disk;ALLOCATE C ...