C++:6.1函数模板与类模板整理





函数模板:


1、类型的参数化:


   在C++中,数据的类型也可以通过参数来传递,在函数定义时可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的实参自动推断数据类型。这就是类型的参数化。


   值和类型是数据的两个主要特征,它们在C++中都可以被参数化。


   所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型,形参类型,局部变量类型)可以不具体指定,而是用一个虚函数的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再传入的实参来推逆出真正的类型。这个通用函数就称为函数模板。


  在函数模板中,数据的值和类型都被参数化了,发生函数调用时编译器会根据传入的实参来推演形参的值和类型。换个角度说,函数模板除了支持 “值” 的参数化,还支持 “类型” 的参数化。


2、函数模板


  template关键字<类型参数 可以有多个 逗号隔开> 返回值类型 函数名(形参)


  例如:
      template<typename T,typename K>//模板头
      void Swap(T&a,K&b)
      {
T temp = a;
a = b;
b = temp;
      }


    说明:
        调用函数时,在函数名后面加<类型>:
          
        Swap<int>(n1,n2);


        但是,但函数调用时候能自动推导出T K U 所有的类型,可以在函数调用时省略<>;  
        Swap<int,float>(n1,n2);


3、类模板


   声明类模板的语法为:
   
   template<typename 类型参数1, typename 类型参数2, ...> 
   class 类名
  {
//TODO;
   }


   类模板和函数模板都是以template开头,后跟类型参数;类型参数不能为空,多个类型参数用逗号隔开。


   一旦声明了类模板,就可以将类型参数用于类的成员函数和成员变量了。换句话说,原来使用int、float、char等内置类型的地方,都可以用类型参数来代替。


   ★类模板注意点:


     1、在类外定义成员函数仍然需要带上模板头,格式为:


     template<typename 类型参数1 , typename 类型参数2,....>
     返回值类型 类名<类型参数1 , 类型参数2, ...>::函数名(形参列表 )
    {
//TODO;别忘记类名字后面的<>!!
     }


     2、与函数模板不同的是,类模板在实例化时必须显示地指明数据类型,编译器不能根据给定的数据推演出数据类型。


        除了对象变量,我们也可以使用对象指针的方式来实例化:


      Point<float,float>* p1 = new Point<float, float>(10.6,109.3);


      Point<char*,char*>* p1 = new Point<char*,char*>("aa","bb");


      需要注意的是,赋值号两边都要指明具体的数据类型,且要保持一致。下面的写法是错误的:
  
     //赋值号两边的数据类型不一致


     
Point<float, float> *p = new Point<float, int>(10.6, 109);


     
//赋值号右边没有指明数据类型


     
Point<float, float> *p = new Point(10.6, 109);


4、函数模板的重载


   函数模板的重载与之前不同,不是通过参数类型或者个数,而是只能通过数据类型的个数来构成重载。


      



































阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页