• 现今C+标准模板库中,所有东西都被设计为template形式,不支持模板,就无法使用标准程序库。
  • 模板是针对一个或多个尚未明确的类型而编写一套函数或类型。
  • 模板是C++的一个新特性。
  • 使用模板,C++允许推迟对某些类型的选择,直到想使用模板或者对模板进行专门化处理时。
  • 模板让程序员面对相似而又略有不同的特性时,更快捷地编写代码

  • C/C++中基本概念,
  • 如何定义类模板,
    • 成员模板、友元模板、函数模板、类模板的参数,
    • 最后介绍模板库

1.1C++为什么需要模板功能

  • 理解了这个话题,程序员才能深度理解STL,才能用好STL,所以,本书的开篇,让我们深入
    浅出地理解C++的引入模板功能的思想

1.1.1计算机太傻了

  • 计算机蠢笨。不过运算的比人类快(电子的速度吗),
  • 记忆力好(能存很多数据)
  • 且不给指令还什么都干不了
  • 就是给指令,写一个程序,计算机也不灵活
  • C++中,同样一个加法,要给出不同的数据类型

いち:类模板简介

1.1.2 类和函数重载部分解決这问题

  • 计算机程序,就是最大限度模拟人思维,让计算机不断接近人的认知能力
  • 科学家和工程师想了很多办法
  • 其中一个是面向对象

  • 通过类的封装和函数重载,部分解決这个问题。
  • 比如常这样做。

いち:类模板简介

  • 用cal.add,就不用考虑这两个参数的具体数据类型。
  • 实现一定的柔性处理,计算机变得聪明了一点点儿
  • 但还不够,不够自然,不够完美

1.1.3泛型编程完美思路

  • 能否研制一种编程机制,让一个函数适应所有的数据类型,包括自己定义的
  • 既然适应所有的数据类型,就称为泛型编程GP
  • C++也支持这种泛型编程机制
  • GP最初提出的动机很简单,
    • 发明一种语言机制,能帮助实现

  • (1)通用的标准容器库。
    • 通用标准容器库,就是要能够做到,
    • 如用一个List类存放所有可能类型的对象
  • (2)GP让编写完全一般化并可重复使用的算法,
    • 其效率与针对某特定数据类型而设计的算法相同。
    • 泛型即是指具有在多种数据类型上皆可操作的含义,
    • 这样算法与数据结构完全分离
  • 算法是泛型的,不与任何特定数据结构或对象类型联系在一起

  • 泛型编程的代表作品STL
  • 是一种高效、泛型、可交互操作的软件组件。
  • STL以迭代器和容器为基础,是一种泛型算法库,
  • 容器的存在使这些算法有东西可以操作。
  • STL含各种泛型算法、泛型迭代器、泛型容器及函数对象。
  • STL并非只是一些有用组件的集合,它是描述软件组件抽象需求
    条件的一个正规而有条理的架构

  • 泛型的第一个好处是编译时严格类型检査
  • 这是集合框架最重要的一个特点
  • 此外,泛型消除绝大多数的类型转换。
  • 如果没有泛型,当用集合框架时,不得不进行类型转换。

  • 上面有些云里雾里,可后面再研究。
  • 泛型编程的理解可以用下面一句:
    • 它是把数据类型(自定义的class类型)作为一种参数传递进来

1.1.4C++的模板

  • C++很需要泛型这种新的编程模式,于是引入模板这个功能。
  • C++中,引入关键字template

  • 使用模板是为实现泛型

  • 前面的函数add
  • 如果不用模板
  • 我们需针对不同的类型写很多个功能相同的函数,
  • 模板则只需使用一个函数即可:

いち:类模板简介

  • 调用时显示说明类型。
  • add(3,5)
  • 还可以自己定义数据类型,甚至自己定义的类,
    • 具体参照本书后面章节。

1.1.5 C++ STL渊源

  • 有了泛型编程思想,有了模板功能,
  • 程序员们就可以编写出很多通用的针对不同数据类型的算法,
  • STL脱颖而出,成为C++标准,只需掌握这个标准,就不用自己费心费力从头开始编写一些算法。
  • 这就是所谓的开发基本思想:不要重复发明轮子。

  • STL( Standard Template Library),是
    • 具有高可用性的、高效的C++程序库
  • 被容纳在C++ Standard Library中,
    • 是ANSI/SOC++标准中最新的也是极具革命性的
  • 该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。
  • 为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。你刚开始可以理
    解为C++内置的函数库,类算法框架库等。

  • 最开始是惠普实验室开发的一系列软件的统称,由Alexander Stepanov、 Meng Lee和David R Musser在惠普实验室工作时开发的
  • 太秀了,为避免他人重复,被C++标准组织投票成为C++标准的一部分
  • STL是“容器”的集合,
    • 有list、 vector、set、map
  • STL也是算法和其他一些组件的集合
    • “容器”和算法的集合指的是聪明人多年的杰作
  • STL的目的是标准化组件,就不用重新开发,可用现成组件
    • STL被内建在C++的编译系统,是C++的部分,不用额外安装。

1.2C++基本概念通览

  • 本主要包括:
    • 命名空间、头文件、面向对象的程序设计、
    • C+中的声明和定义、
    • 最简单的C++程序、
    • 指针、函数、文件、
    • 程序的编译和链接、程序的启动和终止、异常处理。

1.2.1命名空间

  • 命名空间: 标识符的可见范围或者有效范围。
  • 是C++中较新特性
  • 为将多个程序员(或厂商)开发的代码组合起来,
    • 防止重复的函数名、类名等
    • 命名空间可以将不同的代码封装在有效的范围内。
  • 用using来声明,并且每个命名均要用 using
  • STL(标准模板库)用命名空间技术来应对大规模软件开发
  • C++标准库内的所有标识符都被定义在std命名空间

いち:类模板简介

  • 用C++标准库的命名空间std后,
  • 可任意使用标准库中的函数和变量

いち:类模板简介

  • using namespace std可放在源代码的任意位置,不同的位置表示std的不同有效范围。

1.2.2头文件

  • # include< iostream>中的 iostream就是被 include语句包含的头文件
  • C中,头文件都是以h形式存在
  • C++中,头文件只有名字,没扩展名
  • C体系中的头文件部分仍以h形式存在
    • 部分头文件被升级到C++中而不复存在,
    • 这部分头文件均在原有名字的前面添加字符c来标志

いち:类模板简介

  • 书写头文件名时,不要添加其他字符,例如:空格。
    • 有些编译程序会提示无法找到该头文件,
    • 但 VC++6.0可避免类似
  • 头文件主要是将原程序片段收集到一起,形成一个提供给编译程序的文件
  • 一般情况头文件中只包含各种声明、
    • 常量定义、预编译、注释、类型定义、模板定义
  • 常规的函数定义,数据定义,导出的模板定义不应在头文件
  • C++标准库头文件是标准库的外在表现形式
  • 使用标准库的唯一途径就是包含相应的头文件
  • 标准库头文件没有后缀

いち:类模板简介

  • 头文件是为提供类、函数、变量的声明,从而可以方便地使用这些类、函数、变量。
  • 标准库同样提供大量的头文件,当用这些头文件时,
    • 标准库的强大功能

相关文章: