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 等已经成为了一种惯例。

  • 相关阅读:
    AJAX注册
    文件上传加水印
    邮箱
    AJAX完整操作
    跨窗体操作
    容器布局
    EF异常类
    SQL查出字段横向拼接,如:1,2,3,4
    asp.net三层结构中,SQL助手类DbHelperSQL
    正则抓取页面信息
  • 原文地址:https://www.cnblogs.com/chaoyingLi/p/11170026.html
Copyright © 2011-2022 走看看