第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++中重要的代码复用方式

时间: 2024-08-06 16:01:38

第56课 函数模板的概念和意义的相关文章

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

1. 类模板 (1)一些类主要用于存储和组织数据元素 (2)类中数据组织的方式和数据元素的具体类型无关.如数组类.链表类.Stack类.Queue类等. (3)C++中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能. 2. C++中的类模板 (1)以相同的方式处理不同的类型 (2)在类声明前使用template进行标识. (3)<typename T>用于说明类中使用的泛指类型T template <typename T> class Ope

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

一.模板的概念与意义 Q:C++中有几种交换变量的方法?定义宏代码与定义函数A.定义宏代码优点:代码复用,适合所有的类型缺点:编译器不知道宏的存在,缺少类型检查B.定义函数优点:真正的函数调用,编译器对类型进行检查缺点:根据类型重复定义函数,无法代码复用 C.泛型编程--不考虑具体数据类型的编程方式Swap泛型写法中的T不是一个具体的数据类型,而是泛指任意的数据类型C++中的泛型编程函数模板--一种特殊的函数可用不同类型进行调用,看起来和普通函数很相似,区别是类型可被参数化函数模板的语法规则1.

类模板的概念和意义

思考:在C++中是否能够将泛型的思想应用于类? 类模板 一些类主要用于存储和组织数据元素 类中数据组织的方式和数据元素的具体类型无关 如:数组类,链表类,Stack类,Queue类,等 C++中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能. C++中的类模板 以相同的方式处理不同的类型 在类声明前使用template进行标识 <typename T>用于说明类中使用的泛指类型T template <typename T> { public:

c++中函数模板的使用

在程序设计中,经常要使用到函数体相同的函数,如果我们要根据所使用的参数表不同来决定调用具体哪个函数时,我们经常使用的方式是进行函数重载,但是当我们的函数很多的时候会发现实现起来很不方便.所以c++提供了函数模板的概念,这和类模板实现起来的方式是类似的. 下面举个例子,我们经常要使用的冒泡排序算法,被排序的对象可能是double,int,char,float等等,下面是实现代码: template <typename T1,typename T2> void bubble(T1 *A, T2 l

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

第57课 深入理解函数模板

1. 函数模板深入理解 (1)编译器从函数模板通过具体类型产生不同的函数 (2)编译器会对函数模板进行两次编译 ①对模板代码本身进行编译 ②对参数替换后的代码进行编译(编译时机:可能发生在定义对象或函数调用时) (3)注意事项 ①函数模板本身不允许隐式类型转换 ②自动推导类型时,必须严格匹配 ③显式类型指定时,能够进行隐式类型转换 [编程实验]函数模板的本质 #include <iostream> #include <string> using namespace std; cla

快速排序函数模板

这段时间对STL比较痴迷,遂做了些许研究,今天把原来写过的快速排序算法用模板函数重新写了一下,把代码贴出来分享一下 有两个版本,版本二可以传入比较器,自己定义排序规则 快速排序算法思路: 1)从序列中选出一个元素作为基准: 2)重排序列,所有比基准小的元素位于基准左侧,比基准大的元素位于基准右侧,和基准相等的元素位于任意一侧,此过程称为分组: 3)以递归的方式对小于基准的分组和大于基准的分组分别进行排序. #include <vector> #include <list> //打印

PLSQL_Oracle PLSQL内置函数大全(概念)

2014-06-20 BaoXinjian PLSQL常用方法大全 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual; A         a      ZERO     SPACE --------- --------- --------- --------- 65        97        48        32 2.CH

类模板和函数模板

函数模板: 函数模板全特化:所谓特化,是指相对普通模板的特化,是另外一个模板.但不是实例,只是模板 template <class T>                                      //普通函数模板,泛型T mymax(const T t1, const T t2){   return t1 < t2 ? t2 : t1;} template <>const char* mymax(const char* t1,const char* t2)