浅墨浓香

想要天亮进城,就得天黑赶路。

导航

第8课 泛型编程简介

Posted on 2017-03-28 20:05  浅墨浓香  阅读(303)  评论(0编辑  收藏  举报

1. 数据结构与泛型编程

(1)数据结构专注于数据元素之间的关系并不关注数据元素的具体类型

(2)数据结构专注于特定结构上的算法

(3)泛型编程是不考虑具体数据类型的编程方式,很适合编写数据结构的相关代码。

2. C++中的函数模板

(1)一种特殊的函数,可用于不同类型进行调用

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

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

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

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

 

(4)函数模板的使用

  ①自动类型推导调用

  ②具体类型显式调用

3. C++中的类模板

(1)以相同的方式处理不同的类型

(2)在类声明前使用template进行标识

(3)<typename T>用于说明类中使用的泛指类型T

(4)类模板的应用

  ①只能显式指定具体类型,无法自动推导

  ②使用具体类型<Type>定义对象

 

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

//main.cpp

#include <iostream>

using namespace std;

//函数模板
template <typename T>
void Swap(T& a, T& b)
{
    T t = a;
    a = b;
    b = t;
}

//类模板
template <typename T>
class Op
{
public:
    T process(T v)
    {
        return v * v;
    }
};

int main(int argc, char *argv[])
{
    /*函数模板调用示例*/
    int a = 2;
    int b = 1;

    Swap(a, b);  //自动类型推导
    cout <<"a = " << a << ", b = "<< b << endl;

    double c = 0.01;
    double d = 0.02;

    Swap<double>(c, d);  //显式指定类型
    cout <<"c = " << c << ", d = "<< d << endl;

    cout << endl;

    /*类模板调用示例*/
    Op<int> opInt;
    Op<double> opDouble;

    cout << "5 * 5 = " << opInt.process(5) << endl; //类模板必须显式指定类型
    cout << "0.3 * 0.3 = " << opDouble.process(0.3) << endl;

    return 0;
}
/*输出结果
a = 1, b = 2
c = 0.02, d = 0.01

5 * 5 = 25
0.3 * 0.3 = 0.09
*/

4. 小结

(1)模板是泛型编程理论在C++中的实现

(2)函数模板支持的自动推导和显式指定

(3)类模板在使用时只能显式指定类型

(4)类模板非常适用于编写数据结构相关的代码