C++ 在 C 语言的基础上添加了对面向对象编程和泛型编程的支持:
-
- C++ 继承了 C 语言高效、简洁、快速和可移植性的传统;
-
- C++ 面向对象;
-
- C++ 泛型编程。
第一章首先介绍C++的背景,然后介绍创建 C++ 程序的一些基本原则。后面其他章节将讲述如何使用 C++ 语言,从最浅显的基本知识开始,到面向对象的编程(OOP)及其支持的新术语 - 对象、类、封装、数据隐藏、多态和继承等,然后介绍它对泛型编程的支持。
1.1 C++ 简介
C++ 融合了 3 种不同的编程方式:C 语言代表的过程性语言、C++ 在 C 语言基础上添加的类代表的面向对象语言、C++ 模板支持的泛型编程。使用 C++ 的原因之一是为了利用其面向对象的特性。要利用这种特性,最好是对标准 C 语言知识有较深入的了解,因为它提供了基本类型、运算符、控制结构和语法规则。所以,如果已经对 C 有所了解,那么学习 C++ 将会容易很多,如果学习过其他面向对象的语言像 Java 语言等,学习起来也会比较容易。对于没有学习过编程语言的同学来说也没关系,我们会从最基础的知识开始讲,跟着一步一步走就可以了。
1.2 C 的起源
20世纪 70 年代早期,贝尔实验室的 Dennis Ritchie 致力于开发 UNIX 操作系统(操作系统是能够管理计算机资源、处理计算机与用户之间交互的一组程序。例如,操作系统将系统提示符显示在屏幕上以提供终端式界面、提供管理窗口和鼠标的图形界面以及运行程序)。为完成这项工作,Ritchie 需要一种语言,它必须简洁,能够生成简洁、快速的程序,并能有效地控制硬件。刚开始,程序员使用汇编语言来满足这些需求,汇编语言依赖于计算机的内部机器语言。然而,汇编语言是低级(low-level)语言,即直接操作硬件,如直接访问 CPU 奇存器和内存单元。因此汇编语言针对于特定的计算机处理器,要将汇编程序移植到另一种计算机上,必须使用不同的汇编语言重新编写程序。这有点像每次购买新车时,都发现设计人员改变了控制系统的位置和功能,客户不得不重新学习驾驶。
然而,UNIX 是为在不同的计算机 (或平台)上工作而设计的,这意味着它是一种高级语言。高级(high-level)语言致力于解决问题,而不针对特定的硬件。一种被称为编译器的特殊程序将高级语言翻译成特定计算机的内部语言。这样,就可以通过对每个平台使用不同的编译器来在不同的平台上使用同一个高级语言程序了。Ritchie 希望有一种语言能将低级语言的效率、硬件访问能力和高级语言的通用性、可移植性融合在一起,于是他在旧语言的基础上开发了 C 语言。
1.3 C++ 的起源
与 C 语言一样,C++ 也是在贝尔实验室诞生的,Bjarne Stroustrup 于 20 世纪 80 年代在这里开发出了这种语言。用他自己的话来说,“C++ 主要是为了我的朋友和我不必再使用汇编语言、C 语言或其他现代高级语言来编程而设计的。它的主要功能是可以更方便地编写出好程序,让每个程序员更加快乐。” Stroustrup 比较关心的是让 C++ 更有用,而不是实施特定的编程原理或风格。在确定 C++ 语言特性方面,真正的编程需要比纯粹的原理更重要。Stroupstrup之所以在C 的基础上创建 C++,是因为C语言简洁、适合系统编程、使用广泛且与 UNIX 操作系统联系紧密。C++ 的 OOP 方面是受到了计算机模拟语言 Simula67 的启发。Stroustrup 加入了 OOP 特性和对 C 的泛型编程支持,但并没有对 C 的组件作很大的改动。因此,**C++ 是 C 语言的超集,**这意味着任何有效的C程序都是有效的C++程序。它们之间有些细微的差异,但无足轻重 C++ 程序可以使用己有的 C 软件库。名称 C++来自 C语言中的递增运算符++,该运算符将变量加 1。名称 C++ 表明,它是 C 的扩充版本计算机程序将实际问题转换为计算机能够执行的一系列操作。另外,C++ 是在 C 语言的基础上添加 OOP 特性,您可以忽略 C++ 的面向对象特性,但将错过很多有用的东西。在C++获得一定程度的成功后 Stroustrup 才添加了模板,这使得进行泛型编程成为可能。在模板特性被使用和改进后,人们才逐渐认识到,它们和 OOP 同样重要一甚至比 OOP 还重要。
1.4 C++ 的可以移植性与标准
假设您为运行 Windows 2000 的老式奔腾 PC 编写了一个很好用的 C++ 程序,而管理人员决定用使用不同操作系统(如 Mac os X 或Linux)和处理器(如SPARC 处理器)的计算机替换它。该程序是否可以在新平台上运行呢?当然,必须使用为新平台设计的 C++ 编译器对程序重新编译。但是否需要修改编写好的代码呢?如果在不修改代码的情况下,重新编译程序后,程序将运行良好,则该程序是可移植的。
在可移植性方面存在两个障碍,其中的一个是硬件。硬件特定的程序是不可移植的。例如,直接控制 IBMPC 视频卡的程序在涉及 Sun 时将“胡言乱语”(将依赖于硬件的部分放在两数模块中可以最大限度地降低可移植性问题:这样只需重新编写这些模块即可)。本书将避免这种编程。
可移植性的第二个障碍是语言上的差异。口语确实可能产生问题。约克郡的人对某个事件的描述,鲁克林人可能就听不明白,虽然这两个地方的人都说英语。计算机语言也可能出现方言。Windows xPC++ 的实现与 Red Hat Linux 或 Macintosh os× 实现相同吗?虽然多数实现都希望其 C++ 版本与其他版本兼容,但如果没有准确描述语言工作方式的公开标准,这将很难做到。因此,美国国家标准局 (American NationalStandards Institute,ANSI)在1990年设立了一个委员会 (ANSI X3J16),专门负责制定C++标准 (ANSI制定了C语言标准)。国际标准化组织(ISO)很快通过自己的委员会(ISO-WG-21)加入了这个行列,创建了联合组织 ANSI/ISO,致力于制定 C++ 标准。
经过多年的努力,制定出了一个国际标准 ISO1EC 14882:1998,并于 1998 年获得了 ISO、IEC(International Electrotechnical Committee, 国际电工技术委员会)和 ANSI 的批准。该标准常被称为 C++98, 它不仅描述了己有的 C++ 特性,还对该语言进行了扩展,添加了异常、运行阶段类型识别 (RTTI)、模板和标准模板库(STL)。2003 年,发布了 C++标准第二版 (IOS/EC 14882:2003);这个新版本是一次技术性修订,这意味着它对第一版进行了整理一修订错误、减少多义性等,但没有改变语言特性。这个版本常被称为 C++03。由于 C++03 没有改变语言特性,因此我们使用 C++98 表示 C++98/C++2003。C++ 在不断发展。ISO 标准委员会于 2011年8月批准了新标准 ISO/EC 14882:2011,该标准以前称为 C++11。与 C++98 一样,C++11 也新增了众多特性。
1.5 本书遵循的 C++ 标准
当代编译器都会 C++98 提供了很好的支持。编写本书期间,有些编译器还支持一些 C++ 新特性,随着新标准获批,这些特性的支持将很快得到提高。本书反应了当前的情形,详细的介绍了 C++98 ,并涵盖了 C++11 新增的一些特性。在探讨相关的 C++98 主题是顺便介绍了一些 C++ 新特性,在第 18 章有专门的新特性介绍,它总结了前面所有提到的新特性,并且补充了其他新特性。
在编写本书前对 C++11 的支持还不全面,因此难以全面介绍 C++11 新增的所有特性。考虑到篇幅的限制,即使这个新标准获得了全面的支持,也无法在一本书中全面介绍它。本书的重点介绍大多数编译器都支持的特性,并简要的总结其他特性。
1.6 程序创建技巧
假设你编写了一个 C++ 程序。如何让他运行起来,具体的步骤取决于计算机环境和使用的 C++ 编译器,但大体如下,参见文章最后的图。
1.使用文本编译器编写程序,保存到文件中,这个文件就是程序的源代码
2.编译源代码。这就意味着运行一个程序,将源代码翻译成主机使用的内部语言 - 内部语言。翻译后的程序的文件就是程序的目标代码(object code)
3.将目标代码与其他代码链接起来。例如,C++ 程序通常使用库。C++ 库包含一系列计算机例程(被称为函数)的目标代码,这些函数可以执行像在屏幕上输出信息或计算平方根等任务。链接指的是将目标代码同使用的函数代码以及一些标准的启动代码组合起来。生成程序的运行阶段版本,最终生成的文件被称为可执行代码。
视频链接: pan.baidu.com/s/1tSTjRw_x2SqVqE3-6BvfmA
视频密码: fvy9