原文地址:http://www.jizhuomi.com/software/45.html

hello,everyone,鸡啄米上一节讲到的是函数的参数传递和内联函数,这一讲鸡啄米会给大家讲点稍微有点难度的函数重载和函数模板,如果大家把之前的编程入门课程都掌握了,这一讲的内容自己上机试下就很容易理解了。

 一.重载函数

现实生活中的一个词可能有多种含义,比如,洗衣服、洗头、洗车,都有一个洗字,但是他们的操作方式是不一样的。函数也一样,有时候它们的操作不完全一样但是名字一样,这就是重载函数。

重载函数就是,两个以上的函数取相同的函数名,但是函数形参的个数或者类型不同,编译器会根据实参与形参的类型和个数进行最佳匹配,自动确定调用哪一个函数。

为什么要有重载函数呢?因为如果没有重载函数,那么对不同类型的数据进行类似的操作也要定义不同名称的函数,比如加法函数,就必须对整数加法和浮点数加法分别定义不同的函数名:

int nadd(int a, int b);
float fadd(float a, float b);

这样调用需要记住的函数名太多,而且功能类似,很不方便。鸡啄米给大家举几个重载函数的例子:形参类型不同的例子:

int   add(int x,int y);
float add(float x,float y);

形参个数不同的例子:

int add(int x,int y);
int add(int x,int y,int z);

1.重载函数的形参不管是类型还是个数必须有一样是不同的。因为编译器就是看实参和哪个函数的形参的类型及个数匹配,来判断调用哪个函数,如果函数名、 形参类型和个数相同,即使函数返回值类型不同,编译器也会认为是函数重复定义的语法错误,就是说它认为是一个函数。以下两种是错误的重载函数:

  int add(int x,int y);int add(int a,int b);

上面两个函数虽然形参名不同,但是编译器不会以形参名来区分函数,它会认为这是一个函数。我们以后也要记住,若只改变形参名则函数不会变,调用的地方也不必变。

int add(int x,int y);
void add(int x,int y);

上面这两个函数返回值不同,确实是两个函数,但是编译器也不会以返回值来区分函数,也会认为是重复定义。

2.重载函数都是进行类似的操作,不要把不同的功能定义成重载函数,否则会让人对调用有误解,比如:

 int add(int x,int y)
{  return x+y;
}float add(float x,float y)
{  return x-y; }

这两个函数一个是实现的两个数的加法,一个是实现减法,在语法上并没有问题。但是功能不一样但是都叫add,我们调用的时候是不是会混淆?       鸡啄米给大家一个重载函数的例子,大家仔细研究下代码,上机试下,通过上面的讲解,很容易理解:

#include<iostream>
using namespace std;
int add(int m,int n);       // 函数调用前必须先声明函数原型
float add(float x,float y);int main()
{int m, n;float x, y;cout<<"Enter two integer: ";cin>>m>>n;cout<<"integer <<m<<'+'<<n<<"="<<add(m,n)<<endl;cout<<"Enter two float: ";cin>>x>>y;cout<<"float "<<x<<'+'<<y<<"= "<<add(x,y)<<endl;return 0;
}
int add(int m,int n)
{ return m+n;
}
float add(float x,float y)
{ return x+y;
}

屏幕先输出Enter two integer:,我们输入2 3,则屏幕会接着显示integer 2+3=5,然后继续提示Enter two float:,我们继续输入2.1 3.4,最后屏幕会出现float 2.1+3.4=5.5。

二.函数模板

有时候我们使用重载函数还不能达到最优的效果,比如,两个求绝对值的函数:

 int abs(int x)
{return x<0 ? -x:x;
}
double abs(double x)
{return x<0 ? -x:x;
}

大家观察下这两个函数,这两个函数只是返回值类型和参数类型不同,功能完全一样,如果能有办法写一段通用的代码适用于多种不同的数据类型,就是不用 像上面那样写两个函数而只是一段代码就能实现两个函数的功能,那代码的复用性不是更高了吗?开发效率也会提高的。这就要函数模板来实现了。

模板是有可以使用和操作任何数据类型的通用代码构成,这种程序设计叫做参数化程序设计,因为它把数据类型当成了参数,可以用来创建一个通用功能的函数,支持多种不同类型的形参和返回值。函数模板的定义形式是:

template <typename 标识符>函数定义

鸡啄米给大家一个上面那样求绝对值的函数模板示例:

#include<iostream>
using namespace std;template <typename T>
T abs(T x)
{return x<0 ? -x:x;
}int main()
{int     n = 5;double  d = -2.3;cout << abs(n) << endl;cout << abs(d) << endl;return 0;
}

鸡啄米给大家分析下这个程序,编译器会根据调用abs函数时传入实参的类型来确定函数模板的类型参数是什么类型。上面使用调用表达式abs(n)时,因为n是int类型,所以模板中类型参数T就是int,然后编译器会以函数模板为样板生成一个函数:

 int abs(int x)
{return x<0 ? -x:x;
}

同样,对于调用表达式abs(d),因为d是double类型,所以类型参数T就是double,编译器会根据函数模板生成下面的函数:

double abs(double x)
{return x<0 ? -x:x;
}

所以,abs(n)实际上调用的是函数模板生成的函数:int abs(int x)。而abs(d)调用的是由函数模板生成的函数:double abs(double x)。

最后,鸡啄米跟大家简单说下C++系统函数。C++系统库中提供了几百个函数供我们使用,我们只要用include指令包含相应的头文件就可以使用了。比 如,包含了math.h文件我们就可以使用abs、sqrt、sin等函数。如果需要用到一些库函数可以msdn上查也可以上网查。

转载于:https://www.cnblogs.com/fuxianfeng1988/p/3273141.html

重载函数与函数模板(转)相关推荐

  1. 泛函编程—模板函数_类模板

    函数业务逻辑一样,只是函数参数类型不同 函数模板的本质:类型参数化--泛型编程 语法: template <typename T> template <class T1,class ...

  2. 普通函数与函数模板的区别

    普通函数与函数模板区别: 普通函数调用时可以发生自动类型转换(隐式类型转换) 函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换 如果利用显示指定类型的方式,可以发生隐式类型转换 #inclu ...

  3. c++ 函数模板_C/C++编程笔记:C++入门知识,深入解析C++函数和函数模板

    本篇要学习的内容和知识结构概览 函数的参数及其传递方式 1. 函数参数传递方式 传值: 传变量值: 将实参内存中的内容拷贝一份给形参, 两者是不同的两块内存 传地址值: 将实参所对应的内存空间的地址值 ...

  4. 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

     1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...

  5. C++ 普通函数与函数模板 区别以及调用规则01

    //普通函数 和 函数模板 区别 int myPlus(int a, int b) {return a + b; }template<class T> T myPlus2(T a, T b ...

  6. 【C++】C++类的学习(三)——运算符重载与友元函数

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 前面的两篇博文中介绍了类的一些基本特性,今天讲一讲运算符重载和友元. 运算符重载 运算 ...

  7. C++提高部分_C++普通函数与函数模板调用规则---C++语言工作笔记085

    然后我们再来看一下普通函数和函数模板的调用规则 可以看到有4个, 1.如果函数模板和普通函数都可以地调用的时候,优先调用普通函数 2.可以通过空模板参数列表,强制调用,函数模板 3.函数模板可以发生函 ...

  8. C++程序设计(三)—— 函数和函数模板

    一.函数的参数及其传递方式 C++的函数传递有两种传递方式:传值和伟引用.传值分为传"对象值"和"对象地址值","对象值"是指对象的数据成员 ...

  9. 模板 (函数模板语法 ,类模板与函数模板的区别,:函数模板案例,普通函数与函数模板的区别,普通函数与函数模板调用规则,模板的局限性,类模板分文件编写.cpp,Person.hpp,类模板与友元)

    **01:函数模板语法: #include<iostream> using namespace std;//交换两个整型函数 void swapInt(int &a ,int &a ...

  10. 模板函数与函数模板 类模板和模板的说明

    一,模板的概念. 引入模板的原因: 我们已经学过重载,对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同.正确的调用重载函数.例如,为求两个数的最大值,我们定义MAX()函数需要对不同 ...

最新文章

  1. 解决虚拟机安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题(一般出现在win7 旗舰版)
  2. postgres的initdb解析——从一次插件升级失败说起
  3. Android:30分钟弄明白Touch事件分发机制
  4. SpringBoot笔记:SpringBoot2.3集成Kafka组件配置
  5. ubuntu-桌面版-常用设置
  6. android 监听界面变化,Android之页面有变化用onWindowFocusChanged来监听权限是否开启...
  7. 02-图像的几何变换
  8. 009_【OS X和iOS系统学习笔记】 OS X架构
  9. 带网格的_装修要不要用网格布,了解这几点之后再做决定
  10. matlab fft 功率谱,matlab实现功率谱估计,关于FFT点数选取到底什么标准?
  11. Java求解迷宫问题:栈与回溯算法
  12. 魔兽登录后 服务器那显示不兼容,魔兽世界服务器不兼容什么意思?魔兽世界服务器不兼容解决方法...
  13. 联发科MT6763处理器参数MT6763处理器芯片资料下载
  14. 【小墨mysql】mysql系列之一---索引
  15. Ubuntu:火狐浏览器加速下载(Flashgot+Aria2+Uget)
  16. 上交所几大业务平台简介
  17. 2017web前端校招面试总结 - 陌陌技术保障组
  18. qq播放器免费的方法
  19. 4椭圆曲线密码学:破坏安全性及与RSA的比较
  20. 基于FPGA 以太网gmii_to_rgmii模块编写 附源码

热门文章

  1. Objective-C:MRC(引用计数器)获得对象所有权的方式(init、retain、copy等)
  2. 跨域请求之JSONP
  3. 各种操作系统ping时的TTL值
  4. 【C010】Python - 基础教程学习(一)
  5. 基于地图开发控件GMap.Net 使用 (一) 原创
  6. 潘越云《面朝海子》:诗里的人都会终成眷属
  7. 局域网通过专线上网的维护经验点滴
  8. 【BATJ面试必会】Java 基础篇
  9. netty 之 telnet HelloWorld 详解
  10. 496. Next Greater Element I - LeetCode