模板(Templates)
模板,顾名思义,就是预先做好的样板,利用该样板可以制造出样式相近的产品,但是产品可能所用材料不同,却具有相同的功能操作,比如,要想铸造铝锅,首先要有个模子,其后就是材料的制取了。然而通过这个模子也可以造个金锅出来。
C++中的模板与上大同小异,都是基于世界上万事万物都具有相似性这一事实,只不过模板前面加上了“C++的”,即C++编程世界的模板问题。
编程就是一项有趣的对现实世界的建模活动,所以,在使用面向对象语言对现实系统进行抽象描述时,肯定会或多或少地存在相似甚至相同代码的情况,但内在还是有区别的:各类事物(对应于编程中一定类型的对象)的内部,其属性和操作的内涵各不相同,故摆在编程人员面前的一个永恒的问题<通常的编程行为>就是:如何描述和处理不同事物(特别是没有继承关系的事物),使其共享相似或相近代码?即通用性编程问题,或称之为泛型编程问题<如果代码能够对处理各种事物通用,那么其编程就是generic programming,亦称为通用性编程。>.
C++编程问题
C++编程简单地说就是一些类型和函数,甚至可以说,<以前的认识:从结构上或者从本质上说,程序设计就是设计函数!!!由此想到:一个长期存在问题的现在的认识记录:在进行程序设计时,会涉及一个到底是先设计算法,还是先设计数据结构的问题。以前往往把算法封做神灵,将数据结构放置不管不闻,所以就简单地认为是算法需要优先设计。实际上,当时的暗含的潜在默认是已经有了数据结构,本质上里面涉及了人们往往在进行开发的前期,舍不得把时间放到数据结构的设计上,从而其后设计的基于数据结构的算法很是低效,并且导致整个系统索然无味。随着岁月的流逝,慢慢知道,数据结构的设计不仅仅关系到算法的设计,还关系到系统的可扩展性,以及后期的维护。有了良好的数据结构,算法也会水到渠成。>编程就是设计类型和函数,然后将其按照C++的程序结构组织起来。
注:这只是一点儿体会,实际上,设计出高质量的系统是来之不易的!不是空口就来的!!!
C++模板编程
模板编程:由于事物的相似性,设计出的类型和函数有时也表现出相似甚至相同性,将这些具有相似的类型和函数归纳起来构成一个类族或函数族,并采用一种统一的方式来进行编程的方式。
把类型看成是一类事物,则以类型为参数的模板编程便可以看作是适应于各类事物的通用编程了。而从技术上,模板编程涉及类型参数,因此,模板编程可以看作是广泛适用于各类型的编程,即泛型编程。这犹如引用,在技术上,含有指针的意义,但在概念上看,则应称之为别名。
模板编程就是泛型编程,这正如虚函数编程就是面向对象编程。于是,只要在程序中用到了模板声明和定义,就属于泛型编程。然而从广义上说,泛型编程更讲求目的:模板设计的目的是为了能得到多种类型的有效通用。
通用编程
通用编程是概念级的编程,它高度抽象一组概念,描述通用和高效的算法或数据结构,即让一组相关领域的概念,普遍适用于通用编程,已达到高度抽象的目的。
C++ STL的重要性
STL是一个独特的、以模板为基础堆积起来的类型框架,它提供了许多通用的操作<标准算法>,而这些操作是作用在数据结构<容器>之上的,而且所有的这些操作和数据结构都是采用模板设计实现的。
STL的设计者在每个容器类中都做了一个遍历器(类),将逐个罗列容器中元素的操作标准化,以使算法可以脱颖而出而通用化。
遍历器的通用性导致了算法的通用性,算法的通用之后,便成为各个容器共同拥有的财产,数据结构的操作集合从本身的成员函数一下子扩展到所有通用的算法,而且付出的性能代价是最小的。
注:遍历器的操作是通用的,然而,遍历器的操作的内在处理是不同的,因为数据结构的不同决定了元素访问策略的不同。从而也就决定了各个不同的数据结构具有不同的遍历器,这些遍历器都继承自一个抽象的iterator类,在该类中含有遍历器的标准操作。并且遍历器的标准操作的返回值也是标准的,可以作为算法的参数,故遍历器的通用性导致了算法的通用性。
模板分类
模板分为类模板和函数模板,函数模板的类型参数强调数据实参演绎,而类模板没有数据实参,只有类型实参。
类模板:以所处理的数据类型的说明所为参数的类的描述。
函数模板:以所处理的数据类型的说明作为参数的函数的描述。
一个模板并非是一个实实在在的类或函数,仅仅是一个类或函数的描述。
模板的根本:可以实现逻辑相同,数据类型不同的程序代码的复制,即所处理的数据类型可能不同,但处理数据却具有相同的表现形态<亦行为表现,或操作行为>;
模板意义:减轻编程和维护的工作量和难度。
两者所实例化的结果都会受其模板定义的约束,如其初值设定。
模板表现了一种完全不同的代码重用方法:模板对源代码进行重用,而不是通过继承和组合重用对象代码。当用户使用模板时,参数由编译器来替换,这非常像原来的宏方法,却更加清晰,更容易使用。
模板编译时行为
模板使类和函数可在编译时定义所需处理和返回的数据类型。
附:
对于类型来说,从类型能够创建出任意个对象,对象视其创建时初值(实参值)的不同而不同。同样对于模板来说,从类模板能够产生出任意个类型定义,类型视其创建时的初值(类型实参值)的不同而不同。也可以从函数模板派生出任意的函数定义体,函数也视其创建时初值(实参值能够推演到的类型:数据实参类型<如int>-->匹配数据形参类型-->确认模板实参-->推得模板形参(该过程称之为数据实参的演绎))的不同而不同。
类模板的一个好处是发展通用数据结构,因此,有一种观点认为泛型编程只是模板编程的一种。
分享到:
相关推荐
C++类和函数模板学习笔记 本文档主要讲解了C++语言中的类模板和函数模板的概念、语法、注意事项和应用实例。通过本文档,读者可以了解C++泛型编程的思想,掌握函数模板和类模板的使用方法,并且了解两者的区别。 ...
本学习笔记将详细介绍Smarty的核心概念、安装配置、基本用法以及一些高级特性。 1. Smarty核心概念: - 模板:HTML代码,其中包含特殊的SMARTY标记,用于插入动态数据。 - 配置文件:定义SMARTY的全局设置,如...
在【标题】和【描述】中提到的“Boost模板元编程学习笔记(二)”主要围绕两个主题展开:数值计算和类型计算。 1. 数值计算 在提供的代码示例中,`binary`模板展示了如何使用模板元编程实现将十进制数转换为二进制...
标题中的“学习笔记蓝色教育ppt模板.rar”表明这是一个与教育相关的PowerPoint(PPT)模板,主要用于制作学习笔记,设计风格以蓝色为主调。在描述中,“手握圆珠笔写笔记”暗示模板可能包含手绘或模拟手写笔记的元素...
这个“基于gitbook的学习笔记和自用模板”压缩包文件显然是一个集合,包含了作者个人使用Gitbook进行学习记录和模板构建的一些资源。以下是关于Gitbook及其相关知识点的详细说明: 1. **Gitbook简介**:Gitbook 是...
该模板适用于各种记录和笔记场景,例如日常笔记、 meeting 记录、学习笔记等。用户可以根据需要快速记录和笔记,提高工作和学习效率。 Word模板的优点 Word模板-随笔笔记.docx具有以下优点: * 快速记录:该模板...
《Learning Hard C# 学习笔记》是一份深入浅出的C#编程教程,旨在帮助初学者快速掌握C#这门强大的编程语言。C#是由微软公司开发的一种面向对象的编程语言,广泛应用于Windows平台、游戏开发(尤其是Unity引擎)、...
Log4j2 配置模板学习笔记 Log4j2 是 Java 语言中一种流行的日志记录工具,它提供了灵活的日志记录管理功能。下面我们将学习 Log4j2 配置模板的使用和配置。 引入 Log4j2 依赖 在使用 Log4j2 之前,需要在 Maven ...
学习使用Bootstrap Metronic完全响应式管理模板,具体内容如下 1.简介 Bootstrap Metronic是一个基于Bootstrap 3.x的高级管理控制面板主题。Bootstrap Metronic – 是一个完全响应式管理模板。基于Bootstrap3框架。...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。
JAVA学习笔记 JAVA学习笔记是面向对象编程语言的学习笔记,涵盖了JAVA的基本概念、面向对象编程思想、类和对象的概念、实例变量和局部变量的区别、方法的定义和调用、类型转换、精度问题、移位问题、switch语句的...
Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。
"Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...
这份"C++学习笔记"涵盖了C++的基础到高级概念,旨在帮助初学者和有一定经验的程序员深入理解并掌握C++。 在C++的学习过程中,以下几个关键知识点是不可或缺的: 1. **基础语法**:C++起源于C语言,因此它保留了...
数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 ...
【Java学习笔记模版】 Java实习工程师在学习过程中,会涉及到许多关键知识点,尤其是在企业级开发的场景下。从给出的四天学习笔记来看,实习生正在逐步掌握Java Web开发的基础和核心技能。以下是对这些知识点的详细...
《Linux学习笔记》这份资料非常全面且详细,从 Linux 常用命令到 Linux 常用操作,再到网络管理、性能优化,几乎覆盖了 Linux 基础学习的方方面面,非常适合初学者入门!这里只是对于常用命令进行了整理,希望可以...
总的来说,这份压缩包提供了一系列丰富的电子笔记模板,结合了康奈尔笔记法、超链接、时间管理等多种功能,适用于学习、工作和个人成长的多个方面。对于华为安卓用户,特别是使用鸿蒙系统的用户来说,这些模板将带来...