zoukankan      html  css  js  c++  java
  • c++学习笔记之函数重载和模板理解

    1、函数重载:

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

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

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

     1 #include <iostream>
     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 <iostream>
     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<<n1<<", "<<n2<<endl;
    37    
    38     //交换 float 变量的值
    39     float f1 = 12.5, f2 = 56.93;
    40     Swap(&f1, &f2);
    41     cout<<f1<<", "<<f2<<endl;
    42    
    43     //交换 char 变量的值
    44     char c1 = 'A', c2 = 'B';
    45     Swap(&c1, &c2);
    46     cout<<c1<<", "<<c2<<endl;
    47    
    48     //交换 bool 变量的值
    49     bool b1 = false, b2 = true;
    50     Swap(&b1, &b2);
    51     cout<<b1<<", "<<b2<<endl;
    52 
    53     return 0;
    54 }

    运行结果:

    200, 100
    56.93, 12.5
    B, A
    1, 0

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

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

    值(Value)和类型(Type)是数据的两个主要特征,它们在C++中都可以被参数化。

    所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。这个通用函数就称为函数模板(Function Template)

    在函数模板中,数据的值和类型都被参数化了,发生函数调用时编译器会根据传入的实参来推演形参的值和类型。换个角度说,函数模板除了支持值的参数化,还支持类型的参数化。

    一但定义了函数模板,就可以将类型参数用于函数定义和函数声明了。说得直白一点,原来使用 int、float、char 等内置类型的地方,都可以用类型参数来代替。

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

     1 #include<iostream>
     2 using namespace std;
     3 
     4 template<typename T> 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<<n1<<", "<<n2<<endl;
    16 
    17     //交换 float 变量的值
    18     float f1 = 12.5, f2 = 56.93;
    19     Swap(&f1, &f2);
    20     cout<<f1<<", "<<f2<<endl;
    21     return 0;
    22 }

    运行结果:

    2000, 1000
    56.93, 12.5

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

    模板头中包含的类型参数可以用在函数定义的各个位置,包括返回值、形参列表和函数体;本例我们在形参列表和函数体中使用了类型参数T

    类型参数的命名规则跟其他标识符的命名规则一样,不过使用 T、T1、T2、Type 等已经成为了一种惯例。

  • 相关阅读:
    PAT B1027 打印沙漏 (20 分)
    PAT B1025 反转链表 (25 分)
    PAT B1022 D进制的A+B (20 分)
    PAT B1018 锤子剪刀布 (20 分)
    PAT B1017 A除以B (20 分)
    PAT B1015 德才论 (25 分)
    PAT B1013 数素数 (20 分)
    PAT B1010 一元多项式求导 (25 分)
    HDU 1405 The Last Practice
    HDU 1165 Eddy's research II
  • 原文地址:https://www.cnblogs.com/chaoyingLi/p/11170026.html
Copyright © 2011-2022 走看看