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

27人阅读 评论(0) 收藏 举报




函数模板:


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、函数模板的重载


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


      



































查看评论

C++类模板及友元类模板,友元函数模板

C++类模板友元分为以下几种情况1.非模板友元类或友元函数。 书上给了一个例子:class Foo{    void bar();};template class QueueItem{    frie...
  • hyf62399
  • hyf62399
  • 2010-04-03 23:34:00
  • 1557

C++ 类模板作为函数模板示例

类模板作为函数参数 函数的形参类型可以是类模板或类模板的引用,对应的实参 应该是该类模板实例化的模板类对象。 带有类模板参数的函数必须是函数模板。 #include using namespace s...
  • Slience_Perseverance
  • Slience_Perseverance
  • 2014-03-06 17:20:56
  • 2824

深入浅出理解:函数模板与类模板、存在的实际意义以及使用方法,

(1)在讲模板之前,先闲扯一下吧: C++最重要的特性之一就是代码重用,为了实现代码重用,代码必须具有通用性。 通用代码不受数据类型的影响,并且可以自动适应数据类型的变化,这种程序设计类型称为参数化程...
  • rl529014
  • rl529014
  • 2015-11-17 18:40:12
  • 1179

C++的 函数模板和模板函数、类模板和模板类区别

1、函数模板和模板函数 函数模板:函数模板的重点是模板。表示的是一个模板,专门用来生产函数。 template void fun(T a) { } 模板函数:是模板函数的实例化 fun...
  • u010889616
  • u010889616
  • 2015-08-23 22:05:42
  • 1140

C++---函数模板与类模板

函数模板 函数模板是建立一个通用的函数,函数类型和形参不具体指定,用一个虚拟类型代替,这个通用函数称为函数模板。 例子: #include using namespace std; ...
  • u013355826
  • u013355826
  • 2017-11-27 19:55:46
  • 69

C++类模板中的模板函数

在C++中类模板中可以嵌套函数模板,但是在使用时候有些注意事项如下: 一、如果类模板中参数为template,在函数模板中,函数的不同模板名字是可以重载的,如template void assign...
  • u010585135
  • u010585135
  • 2015-01-24 10:05:23
  • 1413

C++类模板的成员函数模板写法

这几天本来想将Lua_Tinker移植到Linux上去的,但是由于VC中的模板写法与gcc中的模板写法有些不同之处,比如下面一段代码:   struct pop_ { template ...
  • witton
  • witton
  • 2007-05-21 13:04:00
  • 3294

函数模板与类模板的区别

函数模板与类模板有什么区别?答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化 必 须由程序员在程序中显式地指定。 即函数模板允许隐式调用和显式调用而类模板只能显示调用...
  • csw_100
  • csw_100
  • 2010-08-27 20:35:00
  • 11294

c++ 模板函数,类模板,仿函数使用实例代码

1.模板函数  #include using namespace std; template T myMin(T x, T y) {  return (x } ...
  • alex_xhl
  • alex_xhl
  • 2015-08-21 23:26:16
  • 1758

C++模板的特化详解(函数模版特殊,类模版特化)

参照 小解C++模板特化 C++模板的特化 模板的全特化与偏特化 模版与特化的概念函数模版与类模版C++中模板分为函数模板和类模板 函数模板:是一种抽象函数定义,它代表一...
  • gatieme
  • gatieme
  • 2016-03-22 14:40:24
  • 10525
    个人资料
    等级:
    访问量: 940
    积分: 229
    排名: 32万+
    文章分类
    文章存档
    最新评论