第56课 函数模板的概念和意义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第56课 函数模板的概念和意义相关的知识,希望对你有一定的参考价值。

1. 发散性问题:C++中的几种交换变量的方法

(1)宏代码块 VS 函数

【编程实验】变量的交换

#include <iostream>
#include <string>

using namespace std;

//宏定义代码块
#define SWAP(t, a, b)   do                      {                           t c = a;                a = b;                  b = c;              }while(0);

//定义函数方式
void Swap(int& a, int& b)
{
    int c = a;
    a = b;
    b = c;
}

void Swap(double& a, double& b)
{
    double c = a;
    a = b;
    b = c;
}

void Swap(string& a, string& b)
{
    string c = a;
    a = b;
    b = c;
}

int main()
{
    int a = 0;
    int b = 1;
    
    Swap(a, b);   //Swap(int&, int&)
    
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    
    SWAP(int, a, b); //宏代码
    
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    
    double m = 2;
    double n = 3;
    
    Swap(m, n);  //Swap(double&, double&)
    cout << "m = " << m << endl;
    cout << "n = " << n << endl;
    
    SWAP(double, m, n);  //宏代码
    cout << "m = " << m << endl;
    cout << "n = " << n << endl;   
    
    string s = "Santa";
    string c = "Claus";
    
    Swap(s, c);
    
    cout << "s = " << s << endl;
    cout << "c = " << c << endl; 

    SWAP(string,s, c);
    
    cout << "s = " << s << endl;
    cout << "c = " << c << endl; 
    
    return 0;
}

(2)优缺点比较

 

宏义宏代码块

定义函数

优点

代码复用,适合所有类型

真正的函数调用,编译器对类型进行检查

缺点

编译器不知道宏的存在,缺少类型检查

根据类型重复定义函数,无法代码复用

2.新的解决方案——泛型编程

(1)不考虑具体数据类型的编程,集合了上述两种方案的优点。

(2)函数模板:C++中的泛型

  ①一种特殊的函数可用不同类型进行调用

  ②看起来和普通函数很相似,区别是类型可被参数化,如

      template<typename T>

      void Swap(T& a, T& b)

(3)函数模板的语法规则

  ①template关键字用于声明开始进行泛型编程

  ②typename关键字用于声明泛指类型

技术分享 

3. 函数模板的使用

(1)自动类型推导调用

     int a = 0, b = 1;

     Swap(a, b); //自动推导

(2)具体类型显式调用

     float c = 2, d = 3;

     Swap<float>(c, d); //显式调用

【编程实验】函数模板使用初探

#include <iostream>
#include <string>

using namespace std;

template <typename T>
void Swap(T& a, T& b)
{
    T c = a;
    a = b;
    b = c;
}

template <typename T>
void SelectSort(T a[], int len)
{
    for (int i = 0; i < len; i++)
    {
        for(int j = i; j < len; j++)
        {
            if (a[i] < a[j])  //降序
            {
                Swap(a[i], a[j]);
            }
        }
    }
}

template <typename T>
void Println(T a[], int len)
{
    for(int i = 0; i < len; i++)
    {
        cout << a[i] << ", ";
    }
    cout << endl;
}

int main()
{
    int a[5] = {5, 3, 2, 4, 1};
    Println(a, 5);
    SelectSort(a, 5);
    Println(a, 5);
    
    string s[5] = {"Java", "C++", "Pascal", "Ruby", "Basic"};
    
    Println(s, 5);
    SelectSort(s, 5);
    Println(s, 5);   
    
    return 0;
}

4. 小结

(1)函数模板是泛型编程在C++中的应用方式之一

(2)函数模板能够根据实参对参数类型进行推导

(3)函数模板支持显式的指定参数类型

(4)函数模板是C++中重要的代码复用方式

以上是关于第56课 函数模板的概念和意义的主要内容,如果未能解决你的问题,请参考以下文章

第56课.函数模板的概念和意义

第58课 类模板的概念和意义

C++--模板的概念和意义深入理解函数模板类模板的概念和意义

第58课 类模板的概念和意义

第43课 继承的概念和意义

第49课.多态的概念和意义