zoukankan      html  css  js  c++  java
  • 类模板、模板类、函数模板、模板函数

    一:什么是类模板

      一个类模板允许用户为类定义一种模式,使得类中的某些数据成员、默认成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)

      如果一个类中数据成员的数据类型不能确定、或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表一类类。

    二:类模板定义及注意事项

      template<class 模板参数表> 或者template<typename 模板参数表>

      class 类名

      {

        //类定义

      };

    其中,template是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是类型参数,也可以是非类型参数。类型参数有关键字class或typename及其后面的标识符构成,非类型参数由一个普通参数构成,代表模板定义中的一个常量。

    例如:

    template<class type,int width>

    //type为类型参数。width为非类型参数

    注意:

    1):如果在全局中声明了与模板参数同名的变量,则该变量被隐藏。

    2):模板参数名不能被当作模板定义中类成员的名字。

    3): 同一个模板参数名在模板参数表中只能出现一次。

    4):在不同的类模板或声明中,模板参数名可以被重复使用。

    typedef  string  type;
    template<class type,int width>
     
    class Graphics
    {
            type node; //node不是string类型
            typedef double type; //错误::成员名不能与模板参数type同名
    };
     
    template<class type,class type> //错误,重复使用名为type的参数
    class Rect;
    template<class type>  //参数名"type"在不同模板间可以重复使用
    class Round;
    下面我们看 一个例子:
     1 #include "stdafx.h"
     2 #include<iostream>
     3 
     4 using namespace std;
     5 
     6 template<typename T>
     7 
     8 class myTest
     9 {
    10 private:
    11     T n;
    12     const T i;
    13 public:
    14     myTest():i(0) {}
    15     myTest( T k);
    16     void print();
    17     T operator+( T x );
    18 };
    19 
    20 template<typename T>
    21 void myTest<T>::print()
    22 {
    23     cout << "n::" << n << endl;
    24     cout << "i::" << i << endl;
    25 }
    26 
    27 template<typename T>
    28 myTest<T>::myTest(T k):i(k)
    29 {
    30     n=k;
    31 }
    32 
    33 template<typename T>
    34 T myTest<T>::operator+( T x )
    35 {
    36     return n+x;
    37 }
    38 
    39 int _tmain(int argc, _TCHAR* argv[])
    40 {
    41     myTest<int> test(2); //模板类
    42     test.print();
    43     cout << "test+1::" << endl;
    44     cout << test+1 << endl;
    45     system("pause");
    46     return 0;
    47 }

    三:什么是模板类
      模板类其实就是类模板实例化的一个产物,举个例子:我们把类模板比作一个做饼干的模子,而模板类就是用这个模子做出来的饼干,至于这个饼干是什么味道的就要看你自己在实例化时放的是什么材料了,你可以做香草味的饼干,也可以做巧克力味的饼干,这些饼干出了材料不一样外,其它的东西都是一样的。

    四:什么是函数模板

      我们知道函数的重载可以实现一个函数名多用,将功能相同或者类似函数用同一个名来定义,这样可以简化函数的调用形式,但是程序中,我们仍然需要定义每一个函数。

      而函数模板可以更加简化这个过程。所谓函数模板实际上就是建立一个通用的函数,其函数返回类型及参数列表类型不具体指定,用一个虚拟的类型来代表。这个通用函数就被称为函数模板。

      定义函数模板一般形式是:

    template<typename T>

    通用函数定义

    或者

    template<typename T>

    通用函数定义

    我们可以对比一下使用普通函数,使用函数的重载以及使用函数模板的情况:

    1):使用普通函数

     1 #include<iostream>
     2 using namespace std;
     3 int int_add(int a,int b)                              //定义函数int_add用于int型数据相加
     4 {
     5  int c;
     6  c=a+b;
     7  return c;
     8 } 
     9 double double_add(double a,double b)     //定义函数double_add用于double型函数相加
    10 {
    11  double c;
    12  c=a+b;
    13  return c;
    14 }
    15 int main()
    16 {
    17  cout<<int_add(2,8)<<endl;              //调用int_add函数
    18  cout<<double_add(2.21,8.27)<<endl;  //调用double_add函数
    19  return 0;
    20 }

    2):使用函数重载

     1 #include<iostream>
     2 using namespace std;
     3 int add(int a,int b)                              //定义函数add用于int型数据相加
     4 {
     5  int c;
     6  c=a+b;
     7  return c;
     8 } 
     9 double add(double a,double b)    //定义函数add用于double型函数相加
    10 {
    11  double c;
    12  c=a+b;
    13  return c;
    14 }
    15 int main()
    16 {
    17  cout<<add(5,3)<<endl;             //调用add函数
    18  cout<<add(5.35,5.5)<<endl;   //调用add函数
    19  return 0;
    20 }

    3):使用函数模板

     1 #include<iostream>
     2 using namespace std;
     3 template<typename T>
     4 T add(T a,T b)
     5 {
     6  T c;
     7  c=a+b;
     8  return c;
     9 } 
    10 int main()
    11 {
    12  cout<<add(2,8)<<endl;
    13  cout<<add(2.21,8.27)<<endl;
    14  return 0;
    15 }

    我们可以看出使用函数模板要省出不少的代码量

    五:什么是模板函数

      跟模板类类似,其实模板函数就是实例化出来的函数模板。如上例中的add(2,8)就是一个模板函数。
     
  • 相关阅读:
    weblogic中server的启动
    oracle connect by
    DBA常用的一些视图和sql
    查询分类并实现分类统计SQL存储过程
    从一组数据中寻找第K大的数
    一个关于StringBuilder延伸类
    总结.net的技术特性
    C#Reflection学习记录
    Asp.net 安全补丁发布
    比较无聊的while与for的较量。
  • 原文地址:https://www.cnblogs.com/cxq0017/p/6549549.html
Copyright © 2011-2022 走看看