博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++学习笔记之函数重载和模板理解
阅读量:4357 次
发布时间:2019-06-07

本文共 2866 字,大约阅读时间需要 9 分钟。

1、函数重载:

      C++ 不允许变量重名,但是允许多个函数取相同的名字,只要参数表不同即可,这叫作函数的重载(其英文是 overload)。重载就是装载多种东西的意思,即同一个事物能完成不同功能。

      所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。

     函数的重载使得 C++ 程序员对完成类似功能的不同函数可以统一命名,减少了命名所花的心思。例如,可能会需要一个求两个整数的最大值的函数,也可能还要写一个求三个实数的最大值的函数,这两个函数的功能都是求最大值,那么就都命名为 Max 即可,不需要一个命名为 MaxOfTwoIntegers,另一个命名为 MaxOfThreeFloats。如下:

1 #include 
2 using namespace std; 3 void Max(int a, int b) 4 { 5 cout << "Max 1" << endl; 6 } 7 void Max(double a, double b) 8 { 9 cout << "Max 2" << endl;10 }11 void Max(double a, double b, double c)12 {13 cout << "Max 3" << endl;14 }15 int main()16 {17 Max(3, 4); //调用 int Max(int, int)18 Max(2.4, 6.0); //调用 double Max(doubleA double)19 Max(1.2, 3.4, 5); //调用 double Max(double, double, double)20 Max(1, 2, 3); //调用 double Max(double, double, double)21 Max(3, 1.5); //编译出错:二义性22 return 0;23 }

再如:

1 #include 
2 using namespace std; 3 4 //交换 int 变量的值 5 void Swap(int *a, int *b){ 6 int temp = *a; 7 *a = *b; 8 *b = temp; 9 }10 11 //交换 float 变量的值12 void Swap(float *a, float *b){13 float temp = *a;14 *a = *b;15 *b = temp;16 }17 18 //交换 char 变量的值19 void Swap(char *a, char *b){20 char temp = *a;21 *a = *b;22 *b = temp;23 }24 25 //交换 bool 变量的值26 void Swap(bool *a, bool *b){27 char temp = *a;28 *a = *b;29 *b = temp;30 }31 32 int main(){33 //交换 int 变量的值34 int n1 = 100, n2 = 200;35 Swap(&n1, &n2);36 cout<
<<", "<
<

运行结果:

200, 10056.93, 12.5B, A1, 0

 

这些函数虽然在调用时方便了一些,但从本质上说还是定义了三个功能相同、函数体相同的函数,只是数据的类型不同而已,这看起来有点浪费代码,能不能把它们压缩成一个函数呢?

能!可以借助本节讲的函数模板。

 

2、在C++中,数据的类型也可以通过参数来传递,在函数定义时可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的实参自动推断数据类型。这就是类型的参数化。

值(Value)和类型(Type)是数据的两个主要特征,它们在C++中都可以被参数化。
所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。这个通用函数就称为函数模板(Function Template)
在函数模板中,数据的值和类型都被参数化了,发生函数调用时编译器会根据传入的实参来推演形参的值和类型。换个角度说,函数模板除了支持值的参数化,还支持类型的参数化。
一但定义了函数模板,就可以将类型参数用于函数定义和函数声明了。说得直白一点,原来使用 int、float、char 等内置类型的地方,都可以用类型参数来代替。

下面我们就来实践一下,将上面的四个Swap() 函数压缩为一个函数模板:

1 #include
2 using namespace std; 3 4 template
void Swap(T *a,T *b){ //交换函数模板 5 T temp=*a; 6 *a=*b; 7 *b=temp; 8 } 9 10 int main(void){11 //交换 int 变量的值12 int n1=1000;13 int n2=2000;14 Swap(&n1,&n2);15 cout<
<<", "<
<

运行结果:

2000, 100056.93, 12.5

template是定义函数模板的关键字,它后面紧跟尖括号<>,尖括号包围的是类型参数(也可以说是虚拟的类型,或者说是类型占位符)。typename是另外一个关键字,用来声明具体的类型参数,这里的类型参数就是 T。从整体上看,template<typename T>被称为模板头。

模板头中包含的类型参数可以用在函数定义的各个位置,包括返回值、形参列表和函数体;本例我们在形参列表和函数体中使用了类型参数T
类型参数的命名规则跟其他标识符的命名规则一样,不过使用 T、T1、T2、Type 等已经成为了一种惯例。

转载于:https://www.cnblogs.com/chaoyingLi/p/11170026.html

你可能感兴趣的文章
ubuntu nginx+php环境520错误
查看>>
Java中OutOfMemoryError(内存溢出)的三种情况及解决办法
查看>>
windows 10 无法使用内置管理员账户打开应用的解决方案
查看>>
php入门变量
查看>>
wince(2.3)获取位图某一点的RGB值
查看>>
【转】C#中如何实现左截取和右截取字符串
查看>>
SQL Server 中关于EXCEPT和INTERSECT的使用方法
查看>>
csdn肿么了,这两天写的博文都是待审核
查看>>
windows下cocos2dx3.0开发环境及Android编译环境搭建
查看>>
BW连接数据库
查看>>
登录之后更新导航
查看>>
spring 的单例模式
查看>>
Python学习手册
查看>>
完整的系统帮助类Utils
查看>>
使用PowerShell批量注册DLL到GAC
查看>>
递归算法
查看>>
ubuntu 17.04 添加用户到sudo组
查看>>
Differences between page and segment
查看>>
Jdk与Tomcat配置与安装
查看>>
关于一个Java web与JFrame的深度结合
查看>>