zoukankan      html  css  js  c++  java
  • 第五十六课、函数模板的概念和意义

    一、交换变量的方法

    1、定义宏代码块

    (1)、优点:代码复用,适合所有的类型

    (2)、缺点:编译器不知道宏在哪,缺少类型检查

    2、定义函数

    (1)、优点:真正的函数调用,编译器对类型进行检查

    (2)、缺点:根据类型重复定义函数,无法代码复用

    #include<iostream>
    
    
    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 i = a;
        a = b;
        b = i;
    }
    
    /*
    void swap(double& a, double& b)
    {
        int i = a;
        a = b;
        b = i;
    }
    */
    int main()
    {
        int a = 1;
        int b = 2;
        
        swap(a, b);
        cout << "swap(a, b):" << a << "," << b << endl;// 输2,1
        
        SWAP(int, a, b);
        cout << "SWAP(int, a, b):" << a << "," << b << endl;//输出1, 2
        
        
        return 0;
    }

    二、泛型编程与函数模板

    1、泛型编程的概念:不考虑具体类型的编程方式

    2、c++中的泛型编程:函数模板

    (1)、一种特殊的函数可用不同的类型来调用

    (2)、看起来和普通函数很类似,区别是类型可被参数化

    3、函数模板的语法规则

    (1)、template关键字用于声明开始进行泛型编程

    (2)、typename关键字用于声明泛指类型

    4、函数模板的使用

    (1)、自动推导调用

    (2)、具体类型显示调用

    #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 Sort(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);
        Sort(a, 5);
        Println(a, 5);
        
        string s[5] = {"Java", "C++", "Pascal", "Ruby", "Basic"};
        
        Println(s, 5);
        Sort(s, 5);
        Println(s, 5);
        
        return 0;
    }

    三、小结

    (1)、函数模板是泛型编程在c++中的应用方法之一(还有类模板等)

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

    (3)、函数模板支持显示地指定参数类型

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

     

  • 相关阅读:
    “过程决定质量”论之证明
    益老而弥坚:软件开发哲学反思录
    TMS TDBPlanner的使用介绍
    混沌现象检测基础
    混沌现象简介
    如何学习软件工程
    阅读随想(2):《你的灯亮着吗?——发现问题的真正所在》
    阅读随想(1):《你的灯亮着吗?——发现问题的真正所在》
    my learning
    IBM Websphere Integration Developer 6.1
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6373730.html
Copyright © 2011-2022 走看看