第2章 程序的组成部分
C++入门经典(第6版)
本章介绍如下内容:
为何使用C++;
C++程序的组织结构;
注释如何让程序更容易理解;
函数的作用。
虽然已面世37年,但是C++编程语言的地位比20世纪70年代末出现的其他东西高得多。当前C++仍在风行,还是一种世界级编程语言。
造就它令人惊讶的生命力的原因在于,通过使用C++,只需编写少量的代码,就可创建快速执行的程序,且可在各种计算环境下运行。当今的C++编程功能让您能够生成功能强大的复杂应用程序,适用于商业、商务和开源开发。
2.1 使用C++的原因
在计算时代持续的70年中,计算机编程语言得到了长足发展。C++被认为是对1972年面世的C语言的革命性改进。
最早的程序员使用最原始的计算机指令:机器语言,这些指令用一长串1和0表示。后来,人们发明了汇编语言,它们将机器指令映射到人类能阅读且易于管理的命令,如ADD和MOV。
组成计算机程序的指令称为源代码。
随后出现了高级语言,如BASIC和COBOL,这些语言让程序员能够使用类似于实际单词或句子的语言编写程序,如Let Average = .366。然后,由称为解释器或编译器的工具将这些指令转换为机器语言。
基于解释器的语言每次读取一行代码,并将指令进行转换。
基于编译器的语言通过编译将程序转换为目标代码,这些代码存储在目标文件中。然后,由链接器将目标文件转换为可在操作系统上运行的可执行程序。
由于解释器在代码编写时读取它,并动态地执行代码,因此对程序员来说更容易使用。编译器要求程序员执行不那么方便的编译和链接步骤,但好处是运行速度比解释器运行的程序快得多。
多年来,程序员的目标是编写可快速执行的简短代码。程序必须很小,因为内存昂贵;其运行速度也必须快,因为处理能力的要求也很苛刻。随着计算机价格越来越便宜、速度越来越快、处理能力越来越强大,而内存的容量越来越大、价格越来越便宜,因此,这些制约因素已不再重要。
当前,最大的编程开销是程序员的时间成本。诸如C++等现代语言使得编写结构良好、易于维护的程序更容易,而且这些程序还可扩展和改进。
2.1.1 编程风格
随着编程语言的发展,出现了满足不同编程风格的语言。
在过程型编程中,程序被设计为一系列操作,这些操作对一组数据进行处理。结构化编程的出现为组织这些过程和管理大量数据提供了一种系统性方法。
结构化编程的主要思想是分而治之。对于程序要执行的任务,如果太复杂,则将其划分为一组更小的任务。如果这些任务还太复杂,则进一步划分成更小的任务。最终的目标是,任务足够小,足够独立,易于理解。
例如,假设有出版商请您编写一个程序,以跟踪其天才横溢、魅力四射的计算机图书作者小组的平均收入,可将这项工作划分成如下子任务。
(1)找出每位作者的收入。
(2)计算出版商有多少作者。
(3)计算这些作者的总收入。
(4)将总收入除以作者数。
计算总收入又可做如下划分。
(1)获取每位作者的个人记录。
(2)获悉作者的预付款和版税。
(3)扣除咖啡的费用、治疗眼睛疲劳的费用以及脊椎保健的费用。
(4)将其收入加入总收入。
(5)获取下一位作者的个人记录。
获取作者记录的任务又可进一步划分为如下子任务。
(1)打开存储作者记录的文件夹。
(2)选择正确的记录。
(3)从磁盘读取数据。
虽然结构化编程得到了广泛应用,但这种方法也存在一些缺点。随着数据量的增加,将数据与操作数据的任务分开将更难。使用数据要做的事情越多,程序越令人感到迷惑。
过程型程序员经常发现自己为解决问题而重新寻求新的解决方案,而不是编写可重用的程序。重用性基于的理念是,创建程序组件,需要时将其插入程序中。这种方法模拟了现实世界。在现实世界中,使用已制造好的零件组装成设备,这些零件执行特定的任务,因此自行车设计师无须从头开始制作刹车;相反,他可将现有的刹车融合到设计中,以利用其功能。
在面向对象编程面世前,计算机程序员无法使用这种基于组件的方法。
2.1.2 C++和面向对象编程
面向对象编程(OOP)是一种革命性的编程风格,正是C++让它得以大行其道。
从本质上说,面向对象编程就是将数据和操作数据的过程视为一个对象:一个有身份和特征的独立实体。
C++全面支持面向对象编程,包括面向对象开发的三个支柱概念:封装、继承和多态。
1.封装
前面说到,自行车工程师在设计新车时,他将各个组件组合起来,如车架、手把、车轮和前灯。每个组件都有一些属性,能够完成一些行为。他不用了解前灯的工作原理就能使用,只要知道它是做什么用的即可。
为了实现这个目标,前灯必须是独立的,它必须完成明确的任务,并且全面完成。全面完成一项任务称为封装。
前灯的所有属性都封装在headlight对象中,而不是遍布整辆自行车。
C++支持通过创建用户定义的类型来封装属性,这种类型称为类。定义良好的类是一个完全封装的实体,要么使用整个实体,要么不使用。使用定义良好的类时,程序不需要知道其工作原理,根据这一原则,应隐藏类的内部工作原理。程序员只需知道如何使用它即可。如何创建类将在第8章介绍。
2.继承和重用
下面更深入地了解自行车工程师,假设他名为Penny Farthing。Penny要让新设计的自行车快速投放市场:他欠了一屁股债,这些债主可没有耐心。
鉴于时间紧迫,Penny决定对一款现有的自行车进行改进,给它添加杯托和里程表等新部件,推出一款有额外功能的改进型新车。他重用了普通自行车的所有部件,同时添加了新部件,以拓展其用途。
C++通过继承来支持重用的概念。可将新类型声明为现有类型的扩展,新子类称为继承了现有类型。Penny设计的自行车继承了老式普通自行车,因此具备其所有品质,但根据需要添加了新功能。有关继承及其应用将在第16章讨论。
3.多态
作为最后一个卖点,Penny Farthing设计的Amazo-Bicycle牌自行车的铃铛的行为与众不同,不是像病鸭那样叫,而是轻按时像汽车喇叭,重按时像雾号。铃铛根据骑车人如何使用它发出正确的叫声。
为了支持这种不同对象做相应事情的概念,C++使用了称为函数多态和类多态的功能。 多态指的是同一样东西有多种形态,这将在第17章讨论。
通过学习C++,您将全面了解面向对象编程。等您阅读完本书并开始开发C++程序时,将熟悉这些概念。
本书不介绍如何设计自行车,也不介绍从债务缠身的状态下走出来。