在20世纪70年代,C、Pascal引领人们进入了结构化编程时代。除了提供结构化编程工具外,C还能生成简洁、快速运行的程序,并提供了处理硬件问题的能力。这使得C成为20世纪80年代主要的编程语言。同时,20世纪80年代,人们也见证了一种新编程模式的成长:面向对象编程(OOP)。
1.2.1 C语言
20世纪70年代早期,贝尔实验室的Dennis Ritchie致力于开发UNIX操作系统。为完成这项工作,Ritchie需要一种简洁并能够生成简洁、快速的程序的语言。
传统上,程序员使用汇编语言。但是移植到另一种计算机上时必须使用另一个汇编语言重新编写程序。
由于UNIX是为不同平台而设计的,这就需要一种高级语言。编译器将高级语言翻译成计算机内部语言,这样就可以通过对每个平台使用不同的编译器来在不同的平台上使用同一个高级语言程序了。于是,Ritchie开发了C语言。
1.2.2 C语言编程原理
一般来说,计算机语言要处理两个概念:数据和算法。
随着程序规模的扩大,早期的程序语言(如FORTRAN、BASIC)都会遇到组织方面的问题。为了解决这种问題,计算机科学家开发了一种更有序的编程方法:结构化编程(structuredprogramming)。C语言具有这种特性。
另一个新原则是自顶向下(top-down)的设计。C语言的理念是将大型程序分解成小型、便于管理的任务。
1.2.3 面向对象编程
与强调算法的过程性编程不同的是,OOP强调的是数据。其理念是设计与问题的本质特性相对应的数据格式。
在C++中,类是一种规范,它描述了这种新型数据格式,对象是根据这种规范构造的特定数据结构。
OOP程序首先设计类,它们准确地表示了程序要处理的东西。例如,绘图程序需要定义矩形、直线、圆、画、确笔类,类定义描述了对每个类可执行的操作,如移动圆或旋转直线。然后就可以设计一个使用这些类的对象的程序。从低级组织(如类)到高级组织(如程序)的处理过程叫做自下向上(bottom-up)的编程。
OOP编程并不仅仅是将数据和方法合并为类定义。例如,OOP还有助于创建可用的代码,这将减少大量工作。信息隐藏可以保护数据,使其免遭不适当的访问。多态能够为运算符和函数创建多个定义,通过编程上下文来确定使用哪个定义。继承能够使用旧类派生出新类。
设计有用、可靠的类是一项艰巨的任务。幸运的是,厂商提供了大量有用的类库。C++真正的优点之一是:可以方便地重用和修改现有的、经过仔细测试的代码。
1.2.4 C++和泛型编程
泛型编程(generic programming)是C++支持的另一种编程模式。它与OOP的目标相同,即使得重用代码和抽象通用概念的技术更简单。不过OOP强调的是数据方面,而泛型编程强调的是独立于特定数据类型。它们的侧重点不同。OOP是一个管理大型项目的工具,而泛型编程提供了执行常见任务(如对数据排序或合并链表)的工具。术语泛型(genenc)指的是创建独立于类型的代码。C++的数据表示有多种类型:整数、小数、字符、字符串、用户定义的、复合结构。要排序不同类型的数据,通常必须为每种类型创建一个排序函数。泛型编程需要对语言进行扩展,以便可以只编写一个泛型(即不是特定类型的)函数,并将其用于各种实际类型。C++模板提供了完成这种任务的机制。
1.2.5 C++起源
Bjarne Stroustrup于20世纪80年代在贝尔实验室开发出了C++。用他自己的话来说:“C++主要是为了我的朋友和我不必再使用汇编语言、C语言或其他现代高级语言来编程而设计的。它一的主要功能是可以更方便地编写出好程序,让每个程序员更加快乐”。
Bjarne Stroustrup的主页 Bjarne Stroustrup设计并实现了C编程言,他是权威参考手册《The C++ Programming Language》和《The design and Evolution of C++》的作者。他的个人网站:http://www.research.att.com/-bs/。
该网包括了C++语言有趣的发展历史、Bjarne的传记材栉和C++ FAQ。Bjarne被问得最多的问题是:应该如何读Bjame Stroustrup。您可以访可Strouup的网站,阅读FAQ部分并下载WAV文件听一听。
Stroupstrup之所以在C上创建C++,是因为C语言简洁、适合一系统编程、使用广泛且与UNIX操作系统联系紧密。C++的OOP方面是受到了计算机模拟语言Simula67的启发。Stroustrup加入了OOP特性和对C的泛型编程支持,并没有对C的组件作大的改动。因此,C++是C语言的超集,这意味着任何有效的C程序都是有效的C++程序。C++可以使用已有的C库。C++的名称来自C语言中的递增运算符++,表明C++是C的扩充版本。
OOP部分赋予了C++将问题所涉及的概念联系起来的能力,C部分则赋予了C++紧密联系硬件的能力,如下图所示:(C++的二重性)
C++获得成功后,Stroustrup才添加了模板,这使得泛型编程成为可能。后来人们才逐渐认识到:它和OOP同样重要。