重载(Overloading)以及模板(Template)
继续《C++ premier plus》的学习
(1)函数重载,通俗来说,就是相同的函数名字名下,存在多个函数,要使得这成立,各个同名函数必须形参列表(也称为“签名”,signature)不同,形参相同,仅仅返回值不同,不能用作函数重载。
(2)如果某个调用,匹配多个函数,编译器是如何选择的?
原则是选择最匹配的(exact match)函数,例如有如下三个函数原型
void stove(double & r1); //matches modifiable lvalue
void stove(const double & r2); //matches modifiable and non-modifiable lvalue, and rvalue
void stove(double && r3); //matches rvalue
并且有如下语句:
double x = 55.5;
const double y = 32.0;
stove(x); //使用stove(double & )
stove(y); //使用stove(const double &)
stove(x+y); //使用stove(double &&)
(3)模板(template)并不是函数的定义,而是告诉编译器如何自动去定义函数的规则,定义两个数据交换的函数模板可以写成如下形式
例子: template <typename T>
void swap(T &a, T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}
上述代码中,关键词“typename”可以换成“class”,因为C++ 98标准创立以前,使用的是“class”,因此两种写法都是正确的
(4)模板重载
当两个模板名字相同,参数列表不同,即可以重载,方法与函数重载类似,不再赘述,值得提出的是,模板的参数列表允许出现其他类型的具体参数,如
整型,浮点型,等等。
(5)关于优先级
假设一个函数调用匹配了多个函数(exact match),编译器会选择最佳匹配,这个过程称为“重载决策”,如果多个函数中只有一个非模板函数,则选择非模板函数;如果所有函数均为模板函数,选择更具体化(more specialized)的那个;如果有两个或以上同等匹配的非模板函数(模板函数),他们同样具体化,那么编译器将会报错。举例如下,
template <typename T> //模板A
void ShowArray(T arr[], int n);
template <typename T> // 模板B
void Show Array(T * arr[], int n);
有如下语句:
int a[4] = {1, 2, 3, 4};
double * pd[3];
for (int i = 0; i < 3; i++)
*pd[i] = i;
ShowArray(a, 4); //调用模板A
ShowArray(pd, 3); //调用模板B
上述例子中,第一次调用ShowArray(),选用模板A,T只用被解释成int 类型即可,因此编译器选择模板A;第二次调用ShowArray(), 选用模板A,T需要被解释成double *类型(指向double类型数据的指针),选用模板B,T只需要被解释成double数据类型,因此B比A更具体化,所以选用模板B
重载(Overloading)以及模板(Template)的更多相关文章
- C++函数重载和函数模板
1.函数重载 这是小菜鸟写的一个例子. 函数重载应该注意以下几点: 1.1重载函数有类似的功能: 1.2只能以参数的类型(形参个数和类型)来重载函数, int max(int a,int b);flo ...
- C++ 函数重载、函数模板,类模板
1.函数重载 相同作用域下,有多个函数名相同,但形参列表不同的函数,常用于处理功能相同但数据类型不同的问题 函数重载的规则: 函数名必须相同 函数形参列表必须不同(可以是参数个数不同,或者数据类型不同 ...
- C++ 函数重载,函数模板和函数模板重载,选择哪一个?
重载解析 在C++中,对于函数重载.函数模板和函数模板重载,C++需要有一个良好的策略,去选择调用哪一个函数定义(尤其是多个参数时),这个过程称为重载解析. (这个过程将会非常复杂,但愿不要遇到一定要 ...
- Java 重写(Overriding)和重载(Overloading)
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现. 重写是父类与子类之间多态性的一种表现 重载是一类中多态性的一种表现.
- Magento的布局(Layout),块(Block)和模板(Template)
public function indexAction() { //remove our previous echo //echo 'Hello Index!'; $this->loadLayo ...
- Silverlight 模板(Template)使用
模板(Template)是控件另一种样式 它和样式(style)不同的是它允许已有的控件进行组合新的一个控件样式 那么先看一下最简单Template代码 xaml代码 <Button Conte ...
- Python - 定制pattern的string模板(template) 具体解释
定制pattern的string模板(template) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28625179 ...
- Java-Runoob-高级教程-实例-方法:15. Java 实例 – 重载(overloading)方法中使用 Varargs
ylbtech-Java-Runoob-高级教程-实例-方法:15. Java 实例 – 重载(overloading)方法中使用 Varargs 1.返回顶部 1. Java 实例 - 重载(ove ...
- 微信小程序开发--模板(template)使用,数据加载,点击交互
微信小程序视图层提供了 模板(template),可以在模板中定义代码片段,然后在不同的地方调用.结果在数据渲染那懵逼了.按照官网上对模板的说明和对数据的加载. 1.定义模板 使用name属性,作为模 ...
- java多态性方法的重写Overriding和重载Overloading详解
java多态性方法的重写Overriding和重载Overloading详解 方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类 ...
随机推荐
- WPF 媒体播放器(MediaElement)实例,实现进度和音量控制
WPF 视频音频播放控件MediaElement实现进度控制,音量控制实例 说明: 1.Volume控制音量的大小,double类型,并且实现了属性依赖,可以用来双向绑定:在 0 和 1. 之间的线性 ...
- c# try..... catch
功能说明:在此例中,try 块包含对可能导致异常的ProcessString()方法的调用.catch子句包含仅在屏幕上显示消息的异常处理程序,当从ProcessString内部调用throw语句时, ...
- 把Excel数据导入到数据库
引入命名空间 using System.IO; using System.Data; using System.Data.OleDb; 引入命名空间 首先要把Excel上传到服务器 //上传Excel ...
- CouchBase 遇到问题笔记(一)
刚开始看CouchBase,按照官网给出的示例,边敲边理解,遇到了一个很奇怪的问题,如下代码: IView<IViewRow> view = client.GetView("be ...
- 欢迎使用 Markdown 编辑器写博客
本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML ...
- jQuery 效果- 动画
jQuery animate() 方法允许您创建自定义的动画. jQuery 动画实例 jQuery jQuery 动画 - animate() 方法 jQuery animate() 方法用于创建自 ...
- maven+jetty项目在tomcat部署
步骤1:项目打包 clean install 步骤二:拷贝war 包到tomcat下 步骤三:修改server.xml文件的端口 步骤四:启动tomcat,注意jetty的项目是不需要带项目名的,To ...
- MySQL的C++简单封装
/* *介绍:MySQL的简单封装,支持流操作输入输出MySQL语句,然而并没有什么软用,大二学生自娱自乐,有不足求指点 *作者:MrEO *日期:2016.3.26 */ 头文件 my_sql.h ...
- mysql命令行导出导入数据库
一.MYSQL的命令行模式的设置: 桌面->我的电脑->属性->环境变量->新建->PATH=“:path\mysql\bin;”其中path为MYSQL的安装路径.二. ...
- Android单元测试初探——Instrumentation(转载)
学习Android有一段时间了,虽然前段时间对软件测试有了一些了解,不过接触android的单元测试却是头一次.这几天在物流大赛上也用了不少时间,所以对于android的单元测试没有太深入的研究,所以 ...