下面要开始介绍面向对象。面向对象是观察世界和编写计算机程序的自然方式。
那么,为什么不从一开始就介绍面向对象呢?我们为什么要把面向对象放到第6章再介绍呢?原因是我们要建立的对象是由各个结构化程序段组成的,因此先要介绍结构化编程基础。
前面五章先介绍结构化编程的传统方法。然后在每一章的最后介绍面向对象。第一章要介绍基本概念(如“有关对象的思考”)和术语(如“对象表达”)。第2章到第5章考虑更实质的问题,然后用面向对象设计 (object-orienteddesign,OOD)技术攻克难题。我们将分析建立系统时的典型问题语句,确定实现系统需要哪些对象、对象需要哪些属性、表示哪些行为以指定对象之间如何交互,以满足系统的需要。我们用实际问题而不是课堂例子来介绍这些内容,而且是在编写面向对象的C++程序之前介绍。第6章就可以开始在C++中编写面向对象的系统。我们首先介绍一些面向对象的关键术语。看看实际生活中,对象无处不在,人、动物、植物、汽车、飞机、大楼、计算机都是对象,我们通过对象来思考问题。我们有较高的抽象(abstrction)能力。可以将屏幕图形作为人、飞机、树、山等对象,而不是各个颜色点(称为像素)。我们能看到沙滩而不是一粒粒沙子,森林而不是一棵棵树,房子而不一块块砖。
我们经常把对象分为两类:活动对象与非活动对象。活动对象是运动的,可以活动与工作。而非活动对象(如毛巾)则不能做什么事,只能静止在某处。但所有这些对象却有一些共同之处,即具有尺寸、形状、颜色、重量等属性(attribute),并具有一些行为(behavior)如球可以滚动、跳动、收缩和膨胀;婴儿会哭、会睡、会爬、会跑、会眨眼;汽车能加速、刹车、转向;毛巾能吸水等等。
人们通过观察对象属性和行为而了解对象。不同对象可能有相似的属性和行为。例如,可以比较婴儿与成人,比较人与猩猩。汽车、卡车、货车和轻便小客车也有一些相似之处。面向对象编程(object oriented programming,OOP)用软件对象模拟实际对象。它利用类(class)关系,其中某一类的对象(如汽车类)有一些共同特性。它利用继承(inheritance)关系,还可以用多重继承(multipleinheritance)从现有类派生新类,并在新类中增加独特的特征。敞蓬车类对象有一些汽车类的属性,但敞蓬车的车顶可以打开、关闭。
面向对象编程可以更自然、更直观地浏览编程过程,即构造现实对象、其属性和行为。OOP还构造对象之间的通信,就像人与人之间可以互相发送信息一样(如军官命令士兵立正),对象也可以通过消息互相互通信。
OOP将数据(属性)和函数(行为)封装(encapsulate)成对象(object),对象的数据和函数是密切联系的。对象具有信息隐藏(infomation hiding)属性,即对象虽然通过定义接口(interface)能够相互通信,但该对象通常不知道其它对象的实现方法,因为实现细节隐藏在对象内部。显然,我们可以很好地驾驶汽车而不需要知道发动机、传送系统和燃料系统内部如何工作。稍后将会介绍信息隐藏对于出色的软件工程是何等重要。
在C语言和其它过程式编程语言(procedural programming language)中,编程是面向操作的(action-oriented);而在C++中,编程是面向对象的(object-oriented)。在C语言中,编程单位是函数(function);而在C++中,编程单位是类(class),通过类可以最终实例化(即生成)对象。
C++类包含函数。C语言程序员将精力更多地放在编写函数上。完成相同任务的一组操作组成了函数,而一些函数又组成了程序。C语言中的数据虽然很重要,但数据只是用于支持函数所要完成的操作。系统中的动词(verb)帮助C语言程序员确定一组函数,这组函数一起组成系统。C++程序员则要集中考虑生成自己的用户定义类型(称为类)。每个类包含数据和一组操作数据的函数 。类的数据组件称为数据成员(data member),而类的函数组件称为成员函数(在其它面向对象编程语言中通常称为方法)。内部类型 (如int)的实例称为变量,而用户自定义类型(即类)的实例为对象。
程序员用内部类型作为构造用户自定义类型的基本组件。C++中关注的重点是类(构成对象的类)而不是函数。系统中的名词(noun)帮助C++语言程序员确定一组类,由这些类生成系统的对象。对象的类就像房子的蓝图,我们可以用一张蓝图建造多个房子,同样也可以用一个类生成多个对象。
软件打包成类时,这些类变成组件,可以在今后软件系统中复用。就像房地产代商告诉客户影响房地产价位的三个主要因素是“地段、地段和地段”,同样,影响今后软件开发的三个最主要因素是“复用、复用和复用”。
事实上利用对象技术,今后大多数软件都是组合“标准化、可互换组件”的类而生成,本书介绍如何建立可复用类。每个新类都是宝贵的软件资源,可以用于加速和提高今后的软件开发速度。
本章介绍了一个C++控制结构——if结构。第2章将介绍六个其他控制结构,介绍如何组合控制结构与各种操作语句,形成结构化程序。我们将会发现只需要三种不同的控制结构,这些结构只要用两种不同组合方式就可以形成任何以C++程序。第2章末尾我们将继续介绍面向对象,确定实际系统中需要实现的对象。●计算机是一种设备,能够进行计算和逻辑判断,运算速度是人类速度的几百万甚至几十亿倍。
●计算机在计算机程序的控制下处理数据。
●构成计算机系统的各种设备(如键盘、屏幕、鼠标磁盘、内存、光盘和处理单元)称为硬件。
●计算机上运行的计算机程序称为软件。
●输入单元是计算机的“接收”部分,如今大多数信息都是通过键盘和鼠标设备输入计算机。
●输出单元,这是计算机的“发送”部分。计算机输出的大多数信息是通过屏幕显示或书面打印。
●内存单元,这是计算机中的“库存”部分,也称为内存或主内存。
●算术逻辑单元(ALU)进行计算和判断。
●没有经常使用的程序或数据通常放在辅助存储单元(如磁盘)中,直到需要时再使用。
●在单用户批处理中,计算机一次运行一个程序,成组或成批处理数据。
●利用称为操作系统的软件系统可以更方便地使用计算机和取得更好的性能。
●多道程序操作系统使多个作业在计算机上“同时”操作,这些作业共享计算机资源。
●分时是多道程序的一种特殊情况,用户通过终端访问计算机,使用户的程序好像是同时运行。
●在分布式计算中,组成化计算分布在网络上实际工作的站点。
●服务器提供公用存储程序和数据,供网络中分布的客户计算机使用,从而出现了客户/服务器计算。
●任何计算机只能直接了解其本身的机器语言。
●机器语言通常包括数字字符串(最终简化为0和1),让计算机一次一个地进行最基本的操作。机器语言是机器相关的。
●用类似英文缩写的助记符构成了汇编语言,人们用汇编器按计算机的速度将汇编语言程序转换为机器语言。
●编译程序将高级语言程序变为相应的机器语言。高级语言使程序员能够编写更像英语的指令.可以包含常用的数学符号。
●解释器程序可以直接执行高级语言程序而不必先将这些程序编译成相应的机器语言。
●尽管编译程序的执行速度比解释程序更快.但解释器在程序开发环境中更常用,因为增加新特性和纠正错误时经常需要更新编译程序。程序开发完成后.编译版本的运行最有效。
●可以用C/C++编写能移植到大多数计算机的程序。
●
FORTRAN用于数学应用。
●
C0BOL主要用于需要精确和有效地操作大量数据的商业应用程序。
●结构化编程用规定的方法编写比非结构化编程更清晰、更容易测试和调试、更容易修改的程序。
●Pascal用于大学环境中讲解结构化编程。
●Ada编程语言是由美国国防部资助开发的,以Pascal为基础。
●多任务使程序员可以指定多个活动并行发生。
●C++系统通常由几个部分组成;程序开发环境、语言和C++标准库。标准库函数本身不属于C++语言,而是用于进行数学运算等常用操作o
●C++程序通常要经过六个阶段执行,即编辑、预处理、编译、连接、装入和执行。
●程序员用编辑器输入C++程序,并进行必要的修改。C++程序文件名通常以.cpp、cxx或.C扩展名结尾。
●编译器将C++程序翻译为机器语言代码(也称为目标码)。
●C++预处理器采用预处理指令,通常包括在要编译的文件中包括其他文本文件和进行各种文本替换。
●连接器将目标码与这些默认功能的代码连接起来,建立执行程序映像(不缺少内容)。在典型的UNIX系统中,编译和连接C++程序的命令是CC。如果程序编译和连接正确.则产生文件a.out,这是该程序的执行程序映像。
●装入器取出磁盘中的执行程序.并将其放进内存中。
●计算机在CPU控制下一次一条指令地执行程序。
●除数为0之类的错误在程序运行时发生,因此这类错误称为运行时错误。
●除数为0通常是个致命错误,会使程序立即终止,无法完成工作。非致命错误能让程序运行完毕,但通常会产生错误结果。
●有些C++函数的输入来自cin(标准输入流),通常输入来自键盘.但cin也可以连接其他设备。数据输出到cout(标准输出流),通常输出到计算机屏幕,但cout也可以连接另一设备。
●标准错误流cerr通常连接屏幕,用于显示错误消息。
●不同C++编译器和不同计算机的许多问题使移植性难以实现o
●C++提供面向对象编程功能。
●对象实际上是可复用软件组件,构造实际中的项目。对象是由其“蓝图”(类)生成的。
●单行注释语句以“//开头。程序员插人注释语句用来说明程序和提高程序可读性。注释语句在运行程序时并不使计算机采取任何操作。
●“#incLude<iostream.h>”语句是个预处理指令。告诉预处理器要在程序中包括输入/输出流头文件。这个文件在编译使用cin、cout以及>>与<<运算符的程序时需要。
●C++程序通常从main开始执行。
●输出流对象cout通常连接屏幕,用于输出数据。多个数据项可以通过连接流插入运算符(<<)输出。输入流对象cin通常连接键盘,用于输入数据。多个数据项可以通过连接流读取运算符(>>)输人。
●所有变量都应先声明名称和数据类型之后才能在程序中使用。
●C++变量名可以是任何有效标识符。标识符是一系列由字母、数字和下划线(
_)组成的字符串,不能以数字开头。C++允许任意长度的标识符.但系统和C++版本可能限制标识符长度。
●C++是区别大小写的。
●大多数计算都是在赋值语句中进行。
●计算机内存中的每个变量都有名称、类型、长度和值。
●数值放在内存地址时,这个值取代该地址中原有的值,前一个值被删除。
●从一个内存地址读取数值时,这个过程是非破坏性的,只是读取一个副本原件保留。
●C++中算术运算符的运算顺序是由运算符优先级和结合律确定的。
●if结构根据某些条件的真假值作出判断,if结构的格式如下:
if(condition)
statement;
●如果条件符合,即为true(真),则执行if结构体的语句;如果不符合,即条件为false(假),则不执行话语句。
●if结构中的条件可以用相等运算符和关系运算符表示,这些运算符的结果总是“true”或"false"。
●面向对象是观察世界和编写计算机程序的自然方式。
●对象具有尺寸、形状、颜色、重量等属性,并具有一些行为。
●人们通过观察对象属性和行为而了解对象。
●不同对象可能有相似的同性和行为。
●面向对象编程(OOP)用软件对象模拟实际对象。它利用类关系,其中某一类的对象有一些共同特性。它利用继承关系,还可以用多重继承从现有类派生新类,并在新类中增加独特的特征。
●面向对象编程可以更自然、更直观地浏览编程过程,即构造现实对象、属性和行为。
●OOP可以通过消息在对象之间相互通信。
●OOP将数据(属性)和函数(行为)封装成对象。
●对象具有信息隐藏的属性,即对象虽然通过定义接口能够相互通信,但对象通常不知道其他对象的实现方法,因为实现细节隐藏在对象内部。
●信息隐藏对良好的软件工程非常重要。
●在C语言和其他过程式编程语言中,编程是面向操作。C语言中的数据虽然很重要,但数据只是用于支持函数要完成的操作。
●C++程序员则要集中考虑生成自己的用户自定义类型(称为类),每个类包含数据和一组操作数据的函数。类的数据组件称为数据成员,而类的函数组件称为成员函数或方法。
abstraction 抽象 attributes of an object 对象属性
action 操作 behaviors of an object 对象行为
ANSI/ISO C binary operator 二元运算符
ANSI/ISO C++ draft standard body of a function 函数体
arithmetic and logicunit(ALU) 算术逻辑单元 C
arithmetic operators 算术运算符 C++
assembly language 汇编语言 C++ standard library C++标准库
assignment operator(=) 赋值运算符 case sensitive 大小写相关
accoeiativity of operators 运算符结合律 central processing unit(CPU) 中央处理单元
cin object cin 对象 interface 接口
clarity 清晰性 interpreter 解释器
class 类 iostream
client/server computing 客户/服务器计算 iostream.h
comment(//) 注释语句 left-to-right associativity 从左向右结合律
compile error 编译错误 linking 连接
compile-time error 编译时错误 loading 装入
compile 编译器 logic error 逻辑错误
compute 计算机 maching dependent 机器相关
computer program 计算机语言 maching independent 机器无关
condition 条件 maching language 机器语言
cout object cout对象 main
CPU 中央处理器 member function 成员函数
crafting valuable classes 构造重要类 memory 内存
data 数据 memory location 内存地址
data member 数据成员 message 消息
decision 判断 method 方法
declaration 声明 modeling 构造
distributed computing 分布式计算 modulus operator(%) 求模运算符
editor 编辑器 multiple inheritance 多重继承
encapsulation 封装 multiplication operator(*) 乘法运算符
equality operators 相等运算符 multiprocessor 多处理器
== "is equal to" 等于 multiprogramming 多道程序处理
!= "is not equal to" 不等于 multitasking 多任务
escape character(\) 转义符 namespace
escape sequence 转义序列 newline character(\n) 换行符
execution-time error 执行时错误 nested paretheses 嵌套的括号
fatal error 致命错误 non-fatal error 非致命错误
file server 文件服务器 object 对象
flow of control 控制流 object-oriented design(OOD) 面向对象设计
fully qualified name(with namespaces) 完全限定名 object-oriented programming 面向对象编程
function 函数 operand 操作数
hardware 硬件 operator 运算符
high-level language 高级语言 operator associativity 运算符结合律
identifier 标识符 output device 输出设备
if structure if 结构 parenttheses 括号
information hiding 信息隐藏 procedence 优先级
inheritance 继承 preprocessor 预处理器
input device 输入设备 primary memory 主内存
input/output(I/O) 输入/输出设备 procedural programming 过程式编程
integer(int) 整数 programming language 编程语言
integer division 整除 prompt 提示
relational operators 关系运算符 standard input object(cin) 标准输入对象
>"is greater than" 大于 standard output object(cout) 标准输出对象
<"is less than" 小于 statment 语句
>="is greater than or equal to" 大于或等于 statment terminator(;) 语句终止符
<="is less than or equal to" 小于或等于 std::cout
reserved words 保留字 string 字符串
"reuse,reuse,reuse" 复用、复用、复用 structured programming 结构化编程
right-to-left associativity 从右向左结合律 syntax error 语法错误
rules of operator precedence 运算符优先级规则 translator program 翻译器程序
run-time error 运行时错误 user-defined type 用户自定义类型
semicolon(;) 分号,语句终止符 using namespace std;
software 软件 variable 变量
software asset 软件资源 variable name 变量名
software reusability 软件可复用性 variable value 变量值
standard error object(cerr) 标准错误对象 white-space characters 空白字符