`

模板学习笔记

    博客分类:
  • C++
阅读更多

模板(Templates)

     

         模板,顾名思义,就是预先做好的样板,利用该样板可以制造出样式相近的产品,但是产品可能所用材料不同,却具有相同的功能操作,比如,要想铸造铝锅,首先要有个模子,其后就是材料的制取了。然而通过这个模子也可以造个金锅出来。

      C++中的模板与上大同小异,都是基于世界上万事万物都具有相似性这一事实,只不过模板前面加上了“C++的”,即C++编程世界的模板问题。


      编程就是一项有趣的对现实世界的建模活动,所以,在使用面向对象语言对现实系统进行抽象描述时,肯定会或多或少地存在相似甚至相同代码的情况,但内在还是有区别的:各类事物(对应于编程中一定类型的对象)的内部,其属性和操作的内涵各不相同,故摆在编程人员面前的一个永恒的问题<通常的编程行为>就是:如何描述和处理不同事物(特别是没有继承关系的事物),使其共享相似或相近代码?即通用性编程问题,或称之为泛型编程问题<如果代码能够对处理各种事物通用,那么其编程就是generic programming,亦称为通用性编程。>.

 

C++编程问题

      C++编程简单地说就是一些类型和函数,甚至可以说,<以前的认识:从结构上或者从本质上说,程序设计就是设计函数!!!由此想到:一个长期存在问题的现在的认识记录:在进行程序设计时,会涉及一个到底是先设计算法,还是先设计数据结构的问题。以前往往把算法封做神灵,将数据结构放置不管不闻,所以就简单地认为是算法需要优先设计。实际上,当时的暗含的潜在默认是已经有了数据结构,本质上里面涉及了人们往往在进行开发的前期,舍不得把时间放到数据结构的设计上,从而其后设计的基于数据结构的算法很是低效,并且导致整个系统索然无味。随着岁月的流逝,慢慢知道,数据结构的设计不仅仅关系到算法的设计,还关系到系统的可扩展性,以及后期的维护。有了良好的数据结构,算法也会水到渠成。>编程就是设计类型和函数,然后将其按照C++的程序结构组织起来。

      注:这只是一点儿体会,实际上,设计出高质量的系统是来之不易的!不是空口就来的!!!

 

 

C++模板编程

 

      模板编程:由于事物的相似性,设计出的类型和函数有时也表现出相似甚至相同性,将这些具有相似的类型和函数归纳起来构成一个类族或函数族,并采用一种统一的方式来进行编程的方式。


      把类型看成是一类事物,则以类型为参数的模板编程便可以看作是适应于各类事物的通用编程了。而从技术上,模板编程涉及类型参数,因此,模板编程可以看作是广泛适用于各类型的编程,即泛型编程。这犹如引用,在技术上,含有指针的意义,但在概念上看,则应称之为别名。


      模板编程就是泛型编程,这正如虚函数编程就是面向对象编程。于是,只要在程序中用到了模板声明和定义,就属于泛型编程。然而从广义上说,泛型编程更讲求目的:模板设计的目的是为了能得到多种类型的有效通用。

 

通用编程

 

      通用编程是概念级的编程,它高度抽象一组概念,描述通用和高效的算法或数据结构,即让一组相关领域的概念,普遍适用于通用编程,已达到高度抽象的目的。

 

 

C++ STL的重要性

       STL是一个独特的、以模板为基础堆积起来的类型框架,它提供了许多通用的操作<标准算法>,而这些操作是作用在数据结构<容器>之上的,而且所有的这些操作和数据结构都是采用模板设计实现的。

       STL的设计者在每个容器类中都做了一个遍历器(类),将逐个罗列容器中元素的操作标准化,以使算法可以脱颖而出而通用化。

      遍历器的通用性导致了算法的通用性,算法的通用之后,便成为各个容器共同拥有的财产,数据结构的操作集合从本身的成员函数一下子扩展到所有通用的算法,而且付出的性能代价是最小的。

      注:遍历器的操作是通用的,然而,遍历器的操作的内在处理是不同的,因为数据结构的不同决定了元素访问策略的不同。从而也就决定了各个不同的数据结构具有不同的遍历器,这些遍历器都继承自一个抽象的iterator类,在该类中含有遍历器的标准操作。并且遍历器的标准操作的返回值也是标准的,可以作为算法的参数,故遍历器的通用性导致了算法的通用性。

 

模板分类

 

      模板分为类模板和函数模板,函数模板的类型参数强调数据实参演绎,而类模板没有数据实参,只有类型实参。

 

      类模板:以所处理的数据类型的说明所为参数的类的描述。

      函数模板:以所处理的数据类型的说明作为参数的函数的描述。


      一个模板并非是一个实实在在的类或函数,仅仅是一个类或函数的描述。


      模板的根本:可以实现逻辑相同,数据类型不同的程序代码的复制,即所处理的数据类型可能不同,但处理数据却具有相同的表现形态<亦行为表现,或操作行为>;

 

      模板意义:减轻编程和维护的工作量和难度。


      两者所实例化的结果都会受其模板定义的约束,如其初值设定。


      模板表现了一种完全不同的代码重用方法:模板对源代码进行重用,而不是通过继承和组合重用对象代码。当用户使用模板时,参数由编译器来替换,这非常像原来的宏方法,却更加清晰,更容易使用。


模板编译时行为

       模板使类和函数可在编译时定义所需处理和返回的数据类型。

 

附:

      对于类型来说,从类型能够创建出任意个对象,对象视其创建时初值(实参值)的不同而不同。同样对于模板来说,从类模板能够产生出任意个类型定义,类型视其创建时的初值(类型实参值)的不同而不同。也可以从函数模板派生出任意的函数定义体,函数也视其创建时初值(实参值能够推演到的类型:数据实参类型<如int>-->匹配数据形参类型-->确认模板实参-->推得模板形参(该过程称之为数据实参的演绎))的不同而不同。


      类模板的一个好处是发展通用数据结构,因此,有一种观点认为泛型编程只是模板编程的一种。

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics