继续《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)的更多相关文章

  1. C++函数重载和函数模板

    1.函数重载 这是小菜鸟写的一个例子. 函数重载应该注意以下几点: 1.1重载函数有类似的功能: 1.2只能以参数的类型(形参个数和类型)来重载函数, int max(int a,int b);flo ...

  2. C++ 函数重载、函数模板,类模板

    1.函数重载 相同作用域下,有多个函数名相同,但形参列表不同的函数,常用于处理功能相同但数据类型不同的问题 函数重载的规则: 函数名必须相同 函数形参列表必须不同(可以是参数个数不同,或者数据类型不同 ...

  3. C++ 函数重载,函数模板和函数模板重载,选择哪一个?

    重载解析 在C++中,对于函数重载.函数模板和函数模板重载,C++需要有一个良好的策略,去选择调用哪一个函数定义(尤其是多个参数时),这个过程称为重载解析. (这个过程将会非常复杂,但愿不要遇到一定要 ...

  4. Java 重写(Overriding)和重载(Overloading)

    方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现. 重写是父类与子类之间多态性的一种表现 重载是一类中多态性的一种表现.

  5. Magento的布局(Layout),块(Block)和模板(Template)

    public function indexAction() { //remove our previous echo //echo 'Hello Index!'; $this->loadLayo ...

  6. Silverlight 模板(Template)使用

    模板(Template)是控件另一种样式 它和样式(style)不同的是它允许已有的控件进行组合新的一个控件样式 那么先看一下最简单Template代码 xaml代码 <Button Conte ...

  7. Python - 定制pattern的string模板(template) 具体解释

    定制pattern的string模板(template) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28625179 ...

  8. Java-Runoob-高级教程-实例-方法:15. Java 实例 – 重载(overloading)方法中使用 Varargs

    ylbtech-Java-Runoob-高级教程-实例-方法:15. Java 实例 – 重载(overloading)方法中使用 Varargs 1.返回顶部 1. Java 实例 - 重载(ove ...

  9. 微信小程序开发--模板(template)使用,数据加载,点击交互

    微信小程序视图层提供了 模板(template),可以在模板中定义代码片段,然后在不同的地方调用.结果在数据渲染那懵逼了.按照官网上对模板的说明和对数据的加载. 1.定义模板 使用name属性,作为模 ...

  10. java多态性方法的重写Overriding和重载Overloading详解

    java多态性方法的重写Overriding和重载Overloading详解 方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类 ...

随机推荐

  1. 内网映射到公网工具 --- ngrok

    ngrok可以将内网映射到公网上,这样就可以在公网上访问你的网络服务. 该工具通常在进行app开发和微信开发时比较有用,这样就可避免在公网服务器上单独部署项目,通过映射,直接连接本地服务即可进行开发. ...

  2. Linux下安装Nginx1.9.3-0303(本人亲手实践)

    Linux下安装Nginx1.9.3 Linux操作系统 Oel 5.8 64bit 最新版Nginx: 1.9.3 最近同事让我帮忙搞 ngix,两天时间 安装.配置搞定了.继续 Nginx 1.9 ...

  3. xcode中如何安装多个版本的模拟器

    在xcode里面,安装的时间默认自带的有模拟器,有时间为了调试需要使用个多个版本的模拟器 在xcode  -> preference  里面 选择download,这里你可下载你需要的模拟器

  4. [转]Delphi I/O Errors

    The following are the Windows API (and former DOS) IO errors, which are also the IO errors often ret ...

  5. Spring 创建bean的时机

    默认在启动spring容器的时候,spring容器配置文件中的类就已经创建完成对象了        在<bean>中添加属性lazy-init,默认值为false.    true  在c ...

  6. ZOJ 刷题记录 小黑屋 (`・д・´)

    P1006:模拟 然而我的同余方程能过样例然而就是WA⊙﹏⊙b [已查明:扩展欧几里得算法出了很隐蔽的问题] int exGcd(int x,int y,int& a,int& b) ...

  7. Codeforces 543D Road Improvement(DP)

    题目链接 Solution 比较明显的树形DP模型. 首先可以先用一次DFS求出以1为根时,sum[i](以i为子树的根时,满足要求的子树的个数). 考虑将根从i变换到它的儿子j时,sum[i]产生的 ...

  8. 用jQuery实现瀑布流效果学习笔记

    jQuery一直没系统的学,只知道是js库,封装了好多js函数,方便了开发.以前做过一个原生的图片网站瀑布流效果,超级麻烦,这次用了jQuery方法,瞬间代码浓缩了,只有56行js代码.神奇的让我来把 ...

  9. C#实现对邮件的发送

    首先是邮件帮助类 using System; using System.Collections.Generic; using System.Text; using System.Net.Mail; u ...

  10. Python 异常处理--raise函数用法

    raise语句手工引发一个异常: "raise" [expression ["," expression ["," expression]] ...