logo资料库

白话C++(全本).doc

第1页 / 共473页
第2页 / 共473页
第3页 / 共473页
第4页 / 共473页
第5页 / 共473页
第6页 / 共473页
第7页 / 共473页
第8页 / 共473页
资料共473页,剩余部分请下载后查看
第一章 程序漫谈 
1.1 硬件、软件、程序
1.3.1 机器语言
1.3.4.1 C++ Builder的基本功能
1.3.4.2 VCL vs. MFC 
第二章 编程环境
2.1 CB界面
2.2 Win 版Hello,World
2.2.1 一个空白工程
2.2.2 最简单的Hello World工程
2.3 DOS 版 Hello,World
2.3.1 一个空白的控制台工程
2.3.2 用控制台输出“Hello world”
2.4 简单程序调试
2.4.1 编译期错误与运行期错误
2.4.2 学会使用帮助文档
第三章 计算机原理
3.1 电唱机、电话、电脑——谈谈模拟信号
3.2 数字信号
3.3 I/O设备,存储器、处理器
3.4 内存
3.4.1 内存地址
3.4.2 虚拟内存
第四章 数据类型
4.1 这是个有类型的世界
4.2 数据类型基本概念
4.2.1 理解数据类型
4.2.2 理解整型和实型
4.2.3 理解数值的范围
4.2.4 理解有符号数和无符号数
4.3 字符集和保留字
4.3.1 字符集
4.3.2 保留字
4.4 基本数据类型
4.4.1 字符型和各种整型、实型
4.4.2 布尔型(bool)和无类型(void)
4.4.3 为数据类型起别名:typedef
4.5 sizeof 的使用
4.5.1 sizeof 例程
第五章 变量和常量
5.1 从类型到变量
5.1.1 公孙龙的“白马非马” 
5.1.2 定义变量
5.1.3 如何为变量命名
5.1.4 如何初始化变量
5.1.4.1 什么时候需要给变量初始化?
5.1.4.2 初始化变量的两个时机
1.在定义时初始化变量
2.在定义以后赋值
5.1.4.3 通过计算得到初始值
5.1.4.4 变量的取值范围
5.2 变量与内存地址
5.3 常量
5.3.1 几种数据类型常数的表达方法
5.3.1.1 整型常数的表达
5.3.1.2 实型常数的表达
5.3.1.3 字符常量的表达
5.3.1.4 字符串常量
5.3.2 用宏表示常数
5.3.3 常量定义
5.3.4 枚举常量
5.3.4.1 为什么需要枚举类型
5.3.4.2 定义枚举类型的基本语法
5.3.4.3 关于枚举常量的输出效果
第六章 二进制、八进制、十六进制
6.1 为什么需要八进制和十六进制?
6.2 二、八、十六进制数转换到十进制数
6.2.1 二进制数转换为十进制数
6.2.2 八进制数转换为十进制数
6.2.3 八进制数的表达方法
6.2.4 八进制数在转义符中的使用
6.2.5 十六进制数转换成十进制数
6.2.6  十六进制数的表达方法
6.2.7 十六进制数在转义符中的使用
6.3 十进制数转换到二、八、十六进制数
6.3.1 10进制数转换为2进制数
6.3.2 10进制数转换为8、16进制数
6.4 二、十六进制数互相转换
6.5 原码、反码、补码
6.6 通过调试查看变量的值
6.7 本章小结
第七章 运算符、表达式、语句
7.1 算术运算符
7.1.1 加减乘除
7.1.2 求模运算
7.1.3 赋值运算
7.1.4 自运算
7.1.5  ++ 和 -- 运算
7.2 算术类型转换
7.2.1 隐式类型转换
7.2.2 显式类型转换
7.3 关系运算
7.4 逻辑运算
7.5 表达式
7.6 语句
第八章 顺序流程
8.1 顺序流程
8.1.1 加法计算器(DOS版)
8.1.2 加法计算器(WIN版)
第九章 条件分支语句
9.1 if...else  语句
9.2 if... 语句
9.3  ? :  表达式
9.4  多级 if...else...语句
9.5 switch 语句
9.6 小结
第十章 循环语句
10.1 while 循环
10.2 do ... while 循环
10.3 for 循环
10.3.1 循环条件三要素
10.3.2 三要素在for循环结构上体现
10.4 多层循环
10.5 小结及一点问题
第十一章 流程控制拾遗与混合训练
11.1 break
11.1.1 break的作用与用法
11.1.3 break 在for循环中的一点注意
11.1.4 多层循环中的break
11.2 continue
11.3 goto
11.4  流程控制强化训练
11.4.1 求绝对值
11.4.2 判断用户输入字符的类型
11.4.3 等腰三角形图形的输出
11.4.4 输出正弦曲线图
11.4.5 标准体重计算程序
第十二章 函数(一)
12.1 函数的引入
12.2 学会调用函数
12.2.1 哪些函数可调用?
12.2.1.1 库函数
12.2.1.2 操作系统的 API 函数
12.2.1.3 VCL 库函数
12.2.2 调用者必须能“找”得到被调用者
12.2.3 调用者必须传递给被调用者正确的参数
12.2.4 如何得到函数的运行结果
12.2.5 调用库函数的实例
12.3 自定义函数
12.3.1 函数的格式
12.3.2 自定义函数实例
12.3.2.1 小写字母转换为大写字母的函数
12.3.2.2 使用函数改写“统计程序”
12.3.2.3 求多种平面形状的面积
12.4 主函数
12.4.1 DOS程序的主函数
12.4.2 Windows程序的主函数
12.5 小结
第十三章 函数(二)
13.1 函数的返回值
13.1.1 函数的返回类型
13.1.2 return 语句
13.1.3 跟踪函数
13.2 函数的参数
13.2.1 形参和实参
13.2.2 参数的传递方式
13.2.2.1 传值方式
13.2.2.2 传址方式
13.2.3 参数的传递过程(选修)
13.2.4 参数默认值
13.3 函数重载
13.3.1 重载的目的
13.3.2 函数重载的规则
13.3.3 参数默认值与函数重载的实例
13.4 inline 函数
13.4.1 什么叫inline函数?
13.4.2 inline函数的规则
13.5 函数的递归调用(选修)
13.5.1 递归和递归的危险
13.5.2 递归调用背后隐藏的循环流程
13.5.3 参数在递归调用过程中的变化
13.5.4 一个安全的递归调用函数实例
13.5.5 递归函数的返回
13.6 小结
第十四章 程序的文件结构
14.1 源文件和头文件
14.2 如何创建多个单元文件
14.3 如何写头文件
14.3.1 在头文件内加入函数声明
14.3.2 最常见的预编译语句
14.4 如何使用头文件
14.5 变量在多个源文件之间的使用
14.5.1 变量声明
14.5.2 多个文件中共享变量的实例
14.6 附:如何单独生成一个头文件
第十五章 存储类型、作用域、可见性和生存期
15.1 存储类型
15.1.1 外部存储
15.1.2 静态存储类型
15.2 作用域和可见性
15.2.1 局部作用域
15.2.2 全局作用域 和 域操作符
15.2.3 作用域嵌套及可见性
15.3 生存期
15.3.1 程序的内存分区
15.3.2 动态生存期
15.3.3 局部生存期
15.3.4 静态生存期
15.3.5 局部静态变量
15.4 对前15章的一点小结
第十六章 数组(一)
16.1 引子 -- “小王”成绩管理系统
16.1.1 “小王成绩管理系统Ver1.0”
16.1.2 “倒退的2.0”
16.2 数组的定义及使用
16.2.1 实例演示
16.2.2 个数定义必须是常量
16.3 如何给数组中的元素赋值
16.3.1 在定义数组时初始化。
16.3.2 在定义之后为元素赋值
16.4 控制台下如何输入和输出数组
16.4.1 输入
16.4.2 输出
16.4.3 数组输入输出练习
16.5 数组的尺寸
16.6 字符数组
16.6.1 字符数组通常用于显示
16.6.2 字符数组初始化
16.6.3 字符数组的输入
16.6.4 字符数组的输出
16.7 数组应用实例
16.7.1 “小王成绩管理系统新版”
16.7.2 “!dnalroB evol I”
16.7.3 “数组中的玄机”
16.7.4 “猜奖Ver 1.0”
16.7.5 求最值
16.8 小结:我们又迈出了重要的一步
第十七章 数组(二)
17.1 数组与内存
17.1.1 数组的内存结构
17.1.2 数组的内存地址
17.1.3 数组元素的内存地址
17.1.4 数组访问越界
17.2 二维数组
17.2.1 二维数组基本语法
17.2.2 二维数组初始化
17.2.3 二维数组的内存结构
17.2.4 二维数组的内存地址
17.3 二维数组实例
17.3.1 用二维数组做字模
17.3.2 二维数组在班级管理程序中应用
17.4 三维和更多维数组
17.4.1 多维数组的定义与初始化
17.4.2 多维数组的定义与初始化
17.5 数组作为函数的参数
17.5.1 数组参数默认是传址方式
17.5.2 可以不指定元素个数
17.5.3 数组作为函数参数的上机实例
17.5.4 二维及更多维数组作为函数参数
17.5.5 函数的返回值类型不能是数组
17.6 sizeof 用在数组上
17.6.1 用sizeof自动计算元素个数
17.6.2 sizeof对数组参数不可用
第十八章 数组(三) ---- 数组的最值与排序
18.1 求数组中的最大值
18.1.1 基本思路与实现
18.1.2 实例
18.2 将数组元素排序
18.2.1 现实算法与程序算法的不同
18.2.2 冒泡排序
18.2.3 选择排序
18.2.4 快速排序 (选修)
18.3 小结
第十九章 指针一 基本概念
19.1 指针是什么?
19.2 指针的大小
19.3 定义一个指针变量
19.4 初始化指针变量
19.4.1 指向不明的指针
19.4.2 给指针变量赋值
19.5 地址解析 及其操作符 *
19.6 上机实验一 指向普通变量的指针和指针之间的互相赋值
19.7 上机实验二:改变指针所指变量的值,改变指针的指向
19.8 指针的加减操作
19.8.1 指向数组的指针
19.8.2 上机实验三:指向数组的指针
19.8.3 偏移指针
19.8.4 上机实验四:指针的最小移动单位
19.8.5 指针的 += 、 -= 、++、 -- 操作
19.8.6 上机实验五:指针的前置++与后置++的区别
19.8.7 * (地址解析符)与 ++ 的优先级
19.8.8 上机实验六:指针的 ++与--操作
19.9 小结
第二十章 指针 二 为指针分配和释放空间
20.1 理解指针的两种“改变”
20.1.1 改变指针的值
20.1.2 改变指针所指的变量的值
20.1.3 两种改变?一种改变?
20.2 C++ 方式的内存分配与释放 new 和 delete
20.2.1 new
20.2.2 在new 时初始化内存的值
20.2.3 delete
20.2.4 实验: new 和 delete
20.2.5 new 和 delete 的关系
20.3 new [] 和 delete []
20.3.1 new[] / delete[] 基本用法
20.3.2 new []/ delete[] 示例
20.3.3 详解指向连续空间的指针
20.4 delete/delete[] 的两个注意点
20.4.1 一个指针被删除时,应指向最初的地址
20.4.2 已释放的空间,不可重复释放
20.5 C 方式的内存管理
20.5.1 分配内存 malloc 函数
20.5.2 释放内存 free 函数
20.5.3 重调空间的大小: realloc 函数
20.5.4 malloc、realloc、free的例子
第二十一章 指针 三 实例演练与提高
21.1 简单变量、数组、指针
21.2 小王成绩管理系统V2.0的问题
21.2.1 软件升级历史
21.3 指针的最常用用法
21.3.1 分配内存
21.3.2 访问指针指向的内存
21.4 小王成绩管理系统 V3.0
21.5 字符串指针
21.5.1 为字符串分配指定大小的空间
21.5.2 字符串常用函数
21.6 指针数组
21.6.1 什么叫“指针数组”?
21.6.2 指针数组实例一
21.6.3 指针数组实例二
21.6.4 字符串指针数组
第二十二章  结构
第二十三章  类/class (一) 封装
23.1 从“我吃饭”开始
23.2 从“结构”到“类”
23.3 类的成员数据与成员函数
23.3.1 成员数据初始化的疑问
23.3.2 成员函数的实现
23.4 封装
23.4.1 私有成员/private member
23.4.2 保护成员/protected member
23.4.3 公有成员/public member
23.4.4 “封装”的作用
23.5 作业
第一章 程序漫谈 1.1 硬件、软件、程序 1.2 计算机语言 1.3 语言和实现语言的工具 1.3.1 机器语言 1.3.2 汇编语言 1.3.3 高级语言 1.3.4 语言实现工具 1.3.4.1 C++ Builder 的基本功能 1.3.4.2 VCL vs. MFC 1.1 硬件、软件、程序 对于计算机,也许你是老鸟,也许你是菜鸟…… 但不管怎样,如果你此时此地你要学习编程,那么你应该多多少少知道点什么叫 硬件什么叫软件——反正我不管你懂不懂,为了面子,我很不乐意你问我什么叫硬 件什么叫软件——我做在这凳子半个小时了,一直想不出如何给二者下个定义。 美国一个电脑神童说:“凡是摔到地上会坏的就是硬件。”我深感不妥,众所周知, 如果把硬盘摔到地上,那么硬盘坏了,里头的那些数据——都是软件——也一样地 坏得让你我心疼。 倘若按字面上理解,那就更加的矛盾重重:硬盘硬是硬件;软盘软也是硬件。 还一种说法是:看得见摸得着的为硬件,看不见摸不着的为软件。刚觉得它说得不 错,但马上我就发觉了它的破绽:我现在用的 Word2000,它就在屏幕上,界面美观, 操作方便…… 无奈之下,我搬出金山词霸,它说:“硬件:计算机及其它直接参与数据运算 或信息交流的物理设备”。挺好。硬件就是设备。平常我们生活中的各种设备,洗 衣机,冰箱,电视,还有螺丝刀,钳子,都是硬件。 软件呢?“软件:控制计算机硬件功能及其运行的指令、例行程序和符号语言”。 指令、程序和符号语言是什么且不说,至少我们得知:软件是用来控制硬件的运行 的。 这就好办点。我们可以打比方:譬如汽车,其本身自然是硬件,但关于驾驶车 的那一套技术,及有关交通规则,我们可称为软件,因为后者控制了前者的运行方 式。 (一般不传之秘笈:如果你英语一般,学习编程时,别忘装上金山词霸。并且 装上后立即上网升级词霸) - 1 -
现在来谈“指令、程序、和符号语言”。我想交通方面的“软件”确实就是这些 东西。我不会驾车,但曾多次看到警察在我上班坐的班车前用指头一指,就令我们 的司机脸色发青。之后,一套既定的处罚程序被执行。很快,听说我们的司机又在 学习那些用来表示“单行”、“只许右拐”、“不许停车”、“禁鸣”等奇奇怪怪 的符号语言了…… 事实上,说软件看不见摸不着其实也正确。因为它们是思想,精神,规则,逻 辑。本身是抽象的,确实不可触及。但软件总是要有载体来存放,要有表达或表现 方式,这些使得它们变得形象具体起来。在此意义上,说软件是摔在地上坏不了的 东西,也相当行得通,神童毕竟是神童。 最后,什么是程序?我决定斗胆来给它下个定义: 程序是一组按照一定的逻辑的进行组合的指令。 因此,在以后的学习过程上,很多时候,我们会觉得程序就是指令;同样很多 时候,我们会觉得程序就是逻辑。 当然,更多的时候,我们并不区分程序和软件二者。也许前者更趋于抽象,而 后者趋于具体。比如我们在写那些表达我们的思想逻辑时,我们喜欢说“写程序”; 而当程序完成,可以待价而沽时,我们称它为软件产品。 1.2 计算机语言 程序用计算机语言写成。编程的实质就是你用计算机语言来表达你解决问题的逻 辑。 那么,什么叫计算机语言? 先不必去解释。因为,计算机是机器,机器不是生物,它怎么能有语言?小猫 小狗有语言我尚可相信,机器也有语言,还要我们去学习,这似乎有渎人类之尊严。 如果我不把这个结解开,可能部分特别在意人类尊严的学生对学习编程从此产生 心理障碍,无法继续学习…… 狭义上,我们讲的语言,汉语英语广东话,它是语言,有声音。小鸟之间吱吱 喳喳,大抵也是语言。但其实语言二字虽都带口,却不是说非得有声才称为语言: 哑语无声,但它也是语言。广义上讲,语言是沟通、交流的一种手段。基于此,我 们认为所有的机器或工具,也就包括计算机,都有它们自己的语言。比如锤子,它 的语言是敲打;比如螺丝刀,它的语言是拧,如果你非要拧锤子,非要敲打螺丝刀, 那么结果就像你用法语和广东佬交谈,用粤语和法国佬说话一样莫名其妙。 一般地,越复杂的机器,人类与其沟通的语言也越复杂。譬如汽车,你想驾驭 它,你就必须去驾校参加学习。想一想,开车的时候,我们的确是在和车进行沟通。 如果你俩之间的沟通出现差错——你心里右转,手却一个劲向左转方向盘,向机器 发出了错误的命令——这将多么可怕! - 2 -
至此,我们的心理障碍可以消除了。小猫小狗有语言是因为它们聪明,而机器有 语言却是因为它们的笨:它们笨,没办法像动物一样可以通过培训来理会人类的意 愿,所以,让人类来反过来为它们定一套沟通的规则,然后人自己去学会这些语言, 从而可以方便控制机器。 再所以,我们推论,凡是机器语言都是笨笨的语言。机器语言可以分低级语言 和高级语言,但无论何者,都是笨得可爱——学得越多你就会越发现它的笨和可爱。 另外,当我说越复杂的机器,其语言也越复杂时,我用“一般地”加以修饰。这是 因为,发明和发展机器的智者们会为机器制造出越来越高级的语言,这些高级语言, 最终越来越接近人类的自然语言。就像计算机,我们有信心相信,终有一天,它能 听懂我们的语言——这就是流传在程序员中的一个梦。当程序员熬红眼敲打数万行 代码时,他们便会想起这个梦:闭上双眼,伸腰,对 PC 说:“BEGIN……”;深呼 吸一次,然后说:“END”。张眼时发现计算机已完成了所有工作…… (一般不传之秘笈:程序员必备之工具:日产乐敦牌眼药水一瓶,用于预防角 膜炎;韩产 777 牌指甲刀一枚,用于铰除因击键刺激而疯长的指甲;国产肛泰若干, 治疗因长期坐姿不当而导致的痔疮) 回到计算机。它是机器,也是人类有史以来,继发明使用火、电、电子这些改善 人类生活的工具后,最为重要,最为先进,最为广泛使用的工具。它的机器语言之 复杂程度可想而知,已经复杂到必须成为一门大学的专业课程。然而别忘了我们前 面的结论,语言只是沟通的手段。在这个意义上,当你用鼠标或键盘在计算机上进 行输入时,只要你输入的是正确操作,我们都认为你在使用计算机语言,因为你确 实是在用一种特定的方式或动作,进行和计算机的交流。 当然,这里的课程并不特意教你任何有关计算机的基本操作。计算机的基本操 作主要是指如何使用计算机内已有的软件产品,比如 Windows 本身(操作系统是软 件,称为系统软件);比如办公系统 MS Office 或 WPS Office(这些实现工作生活 中具体应用需求的称为应用软件);比如游戏(一种特定的,只拿来玩的应用,称 为游戏软件)。但我们不同,我们学的是如何编写软件。也就是说,我们将是发明 人,设计师,创造者;而他们(到今天仍拒不学习编程的家伙)都只是使用者。(我 突然有些不安:这么说其实纯属煽情。公平地讲,任何人的任凭创造都是别人的劳 动成果之上,任何人也都在创造自己的杰作) 程序(或软件)是用计算机语言写出来的。  写一个程序,大致是这么一个过程:  人有一个问题或需求,想用计算机解决……  人想出解决问题或实现需求的思路……  人将思路抽象成数学方法和逻辑表达或某种流程的模式……  程序员将数学方法,逻辑表达中的数据和流程用计算机语言表达,称为代码…… - 3 -
用计算机高级语言写成的代码被语言的实现工具(VC,VB,Delphi,或 C++ Builder)转换成计算机的最低级机器语言。这就完成了人与机器在程序制定上的 最后沟通。 可见,你的思路是先用人类自己的语言思考,然后用一门计算机语言写成代码, 最终,需要一个语言工具来将它转换成机器可以理解的机器语言。我们要学的就是 一门承上启下的计算机语言。这样语言有很多:BASIC,Pascal ,C, C++, Java, C#……我们学 C 和 C++。它是使用最多的语言。有关 C,C++的更多特点,我们将在 下一节谈到。 尽管你完全可以直接用最低级的计算机语言——机器语言——来写代码,那样 就不需要语言工具了,但在这里你要弄清了,我们不是教机器语言。下一节,你会 明白用机器直接能懂的语言——不妨称之为原始的机器语言——写软件,在今天是 多么的不现实。 1.3 语言和实现语言的工具 1.3.1 机器语言 你知道香蕉叫什么吗?就叫香蕉?叫 banana? 错,都错。 香蕉叫“牙牙”。 这是一个 baby 的语言,一个婴儿还没学会人类的主要语言,所以面对喜欢的 东西总是发出咿咿呀呀的声音,也许你听不懂,但这是她的语言。符合小孩特点的 语言。 计算机的机器语言也一样,必须符合计算机的硬件特点。而痛苦就在这里,越 符合机器的特点,同时也就越不符合人类的特点。 计算机,全称电子计算机,20 世纪 40 年代,无线电技术和无线电工业的的发 展为电子计算机的研制准备了物质基础。1943 年~1946 年美国宾夕法尼亚大学研制 的电子数字积分和计算机 ENIAC(Electroic Numerical Integrator And Computer) 是世界上第一台电子计算机。ENIAC 计算机共用了 18000 多个电子管,15000 个继 电器,占地 170 m2 …… 这是计算机的始祖,一堆电子管。随后,电子计算机进入第二时期,小巧的晶 体管取代了电子管;再后,集成电路又取代晶体管,电子计算机进入第三时期。 但无论是哪一时期(以后也许不是),计算机始终采用电子器件作为其基本器 件,因此,电子器件的特点,就是计算机的特点。 为什么使要电子?为什么木头不能做计算机——还真别说不能,您也应该知 道,最早出现的用于计算的机器,真是木头的。你用过计算尺吗?算了,这玩意儿 太简单。以前有人用木头作成齿轮,经过设计,当表示个位数的齿轮转动一圈时, - 4 -
就会带动表示十位数上的齿轮转动 1 格。以此原理,只要你转动转轴,木头机器就 会算出 123+456 = 579…… 电子元件没有齿轮,但它们的特点是它们有两种很稳定的状态:导电或不导电, 假如用不通电时表示 0,通电时表示 1,再通过集成电路实现进位的机制。于是, 计数功能就有了基础。我们用图表示: 我们生活中常用的数逢十进一,称为 10 进制。而计算机,由于其电子元件的 特点,它是二进制数。这里简单地对比一下这两种进制造成的区别,以帮助你更容 易看明白上图。 十进制数:最低位称为个位,高一位称为十位,再高一位称为百位。为什么这 样称呼?因为在个位上,0 表示 0,1 表示 1,2 表示 2,3 表示 3……;在十位上, 0 表示 0,1 表示 10,2 表示 20,3 表示 30……总之,每高一位长十倍,为十进制。 二进制数:最低位仍可称为个位,但这里称为 1 位。1 位上,0 表示 0,1 表示 1,2 呢?没有 2,因为逢 2 就得进 1(后面同)。高一位称为 2 位,0 表示 0,1 表 示 2,再高一位称为 4 位,0 表示 0,1 表示 4。可以看出,每高一位长 2 倍,为二 进制。 现在看上面的图,00,01,10,是三个二进制数。根据上面的进位方法,你可以 算出它位分别表示十进制数的 0,1,2 来吗?如果你算得出来,不错,值得表扬。 算不出来,别急,我来告诉你。首先,当你面对二进制数时,先要扳过来它们从低 到高(从右到左)的位依次不再是个位十位百位,而是:1 位,2 位和 4 位。 00:都是 0,所以它就是 0; 01:2 位为 0,1 位为 1,表示 0 个 2 和 1 个 1,所以是 1; 10:2 位为 1,1 位为 0,表示 1 个 2 和 0 个 1,所以是 2。 计算机的机器语言正是由这些 0 和 1 组成。事实上,计算机里的所有数据,无 论是一个程序,一篇文稿,一张照片,一首 MP3,最终都是 0 和 1。 世界就是这样奇妙。万事万物五彩缤纷,但进了计算机,却只是个 0 和 1 的组 合。不由得你会想起道教的古老玄机:“无极生太极,太极生两仪,两仪生四象, 四象生八卦,八卦生十六爻” 严重跑题。 机器语言尽是 0 和 1,于是我们可以想像当时(还没有其它语言时)的程序员 是如何编写程序的。他们写程序不用坐在计算机前,而在家里或什么地方,拿笔在 纸上画圈,一圈两圈三圈(感觉有点象阿 Q?),圈够了就给专门的打孔小姐照着 在纸带上打成孔。最后这些纸带被计算机“吃”进去并读懂,然后执行。 来看一眼侏罗纪的程序吧: (如用孔表示 1,则左图表示三行数 110,011,101) - 5 -
面对这样的“程序”你是否表示狐疑?别以为我瞎说,也许你的电脑很先进, 是 P4 吧?但在你的电脑上,仍有那种程序历史遗迹:软驱是也。如果有软驱,那 你应该能找到一张软盘。知道软盘有写保护吗?仔细看看那个写保护的开关——就 是一个方孔——打开,告诉软驱本张软盘不能进行写操作,关闭,告诉软驱本张软 盘可以进行写操作。 1.3.2 汇编语言 前面说机器语言尽是 0 和 1,那么是不是可以随便写一串 0 和 1 就算是程序呢? 不是。就像汉语是由汉字组成,可我要是说下面这一串汉字: 天爱我京门北安 你觉得我是在说人话吗? 机器也有自己固定词汇,在机器语言里,称为机器指令,程序是由指令及数据 组成。这些指令是一些固定的 0 和 1 的组合(不同产商不同型号的机器,其指令又 有不同)。作为程序员,就得将这些指令一次次正确地用 0 和 1 拼写出来。 你决不会将“我爱北京天安门”说成上面的话,但你极有可能将 10101101 写 成 10010101,对不?所以很自然地,出现了用符号来表示这些固定的二进制指令 的语言,这就是汇编语言。 下面是一段我从 C++ Builder 的 CPU 调试窗口摘出的代码,它实现的功能是: 已知 b 等于 1; c 等于 2; 然后计算 b + c 值,并将该值赋给 a 。 把这段代码的机器语言(左)和汇编语言(右)进行对照,你可看出二者各自特 点。 10001010 01010101 11000100 mov edx,[ebp-0x3c] 00000011 01010101 11000000 add edx,[ebp-0x40] 10001001 01010101 11001000 mov [ebp-0x38],edx 汇编语言仅是机器语言的一种助记符,没有本质的区别,所以很多时候,我们把 二者等同视之。 无论是机器还是汇编语言,都让人看了头痛,好在我们并不去学它们。 1.3.3 高级语言 汇编语言和机器语言虽然很难记难写,但它们的代码效率高,占用内存少,这相 当符合当时计算机的存储器昂贵,处理器功能有限等硬件特点。 众所周知,计算机的硬件发展飞速,功能越来越强大。一方面,它有能力,人 们也要求它能处理越来越复杂或庞大数据量的计算功能,机器/汇编语言已经无法 胜任实现这些需求;另一方面,硬件的发展和关键元件价格的降低,使得程序员不 需要在程序的降低内存占用,运算时间上花太多的精力, 这样,各门高级语言便 接二连三地出现了。 - 6 -
那么,高级语言“高级”在何处呢?前面我们说过,一门计算机语言“越符合 机器的特点,同时也就越不符合人类的特点” 。人类总是希望凡事能舒服点就舒 服点,于是某一天,先知先觉们一声怒吼“是该到让计算机语言接近人类的时候了!” 从此冒出了 Pascal,冒出了 C,C++,BASIC 语言等数百种高级语言,现在又有 Java, C#等等。高级语言高级在哪里呢?就高级在它总是尽量接近“高级动物”的自然语 言和思维方式。 那么多高级语言,我们为什么挑了 C++呢? 向来头痛这种问题,其实无论是 Pascal, BASIC,还是 C++,甚至 C 和 C++相比, 每一种语言都有极大的相通之处,又都有各自的独到之处。我大致鼓吹一下 C++吧。] 首先,这是全世界用得最多的计算机程序语言。 其次,C/C++语言既有高级语言的优点,又在很多方面保留了低级语言速度快, 可进行很多具有可直接映射硬件结构的操作的长处,我们无时不用的 Windows 等操 作系统,就是用 C 和汇编写成。事实上很多人称它为中级语言,这样两头俱备的语 言,当然值得学。 再次,C 语言本身,只有 32 个关键字(固定词),C++也只是进行了有限的扩 展。另外,C/C++语言是众多语言中最简洁,紧凑,灵活的语言,学得易,用得爽! 再再次,由于前面所说的,C/C++是中级语言,它所生成的机器代码自然更接 近于直接用汇编所写(和其它语言相比),所以,同样的程序,用 C/C++写,代码 小却跑得快。 再再再次,C/C++语言是少见的,不专属于(因为版权或龚断)某一家公司或 组织,你完全不必担心你只是学了某门某户的 C 或 C++,到别的地儿全玩不转。C/C++ 有美国国家标准协会制定语言标准。事实上,你就是到 UNIX,Linux 上写点 C/C++ 代码,也能跑。 最后,一门语言再好,如果没有其实现工具(语言本身只是一种规范,必须有 编译器可以实现它),那么又不成了屠龙之技,C/C++,你可能用微软的 VC,也可 以用我们推荐的 Borland C++ Builder,二者都相当优秀。 1.3.4 语言实现工具 1.3.4.1 C++ Builder 的基本功能 我们用高级语言写程序,我们很得意,因为高级语言比较接近人类的语言,我们 用起来得心应手,所以我们当然得意。但我们更得意的一定是让程序代码赶快变成 可执行文件。 无论是在写代码的过程,还是最后要编译成可执行文件,都需要有一个工具存 在。这一具一般成为编程集成环境(IDE)。之所以称为集成,是因为从写代码到 最后软件的出炉,我们需要它的地方实在太多了。这里列出其中最重要的功能项。 - 7 -
1、 代码编辑 方便的代码编辑功能。尽管你可以使用记事本、Word 或其它任 何文本编辑器来写代码,但除非特殊需要,否则那将是极为低效的方法。相反,现 在的编程集成环境,都相当的智能,举例如代码自动功能,可以很多情况下自动完 成我们所需的代码,既准确还迅速。Borland 公司出品的编程集成环境不仅有常见 的关键字高亮等功能,还支持代码模板,支持键盘宏,同样支持高级的脚本插件功 能。 2、 界面设计 可视化的程序界面设计功能。你所要产生的窗口,在设计期间 就真实地出现,包括字体,颜色,定位,比如,你不仅可以插入 falsh 的动画,而 且无需运行,就直接可以在你的界面上看到该动画的演播,这是别的编程环境不能 做到的。 3、 程序编译 这更是编程工具的主要功能。前面已讲过,我们写的代码,在 成为机器能懂的可执行程序时,必须通过编译。 4、 程序调试 如何尽量减少你的程序的 BUG?没有编程集成环境都提供的强大 调试功能,我们做的程序将毫无质量保证。 5、 代码优化 Borland 提供的编译器不仅在编译速度一直在美国屡获大奖, 而且其代码自动优化功能一直领先对手几近一个时代。使用编程集成环境,我们可 以轻松获得更快更优的最终可执行程序文件。 6、 辅助程序安装 程序的安装已属于另外一种工具的范畴,但我们仍可以通 过编程集成环境来决定最终生成单一可执行文件,还是带有其它动态库。如果是后 者,我们还可以通过集成环境来检查程序运行时调用了哪些动态库文件。 C++ Builder 提供的功能远不止我上面所说的,并不是因为我嘴笨,而是我认为对 一个工具,你只有动手使用,才会真正了解它。 C++是一门语言,而 Borland C++ Builder 则是语言实现工具。作为一个编程 工具,CB 提供以上功能正是份内之事。在这个意义上,你可以认为 CB 是 Word2000, 而 C++则是英语或汉语。正如我们用英语或汉语在 Word2000 上写出优美文章,编程 可说为:我们用 C++语言在 CB 上编写出优美的程序。 1.3.4.2 VCL vs. MFC 在作为一种编程工具的意义上,我们认为 C++ Builder 和你也许常听的 VC (Visual C++)没有什么本质的区别。就像 Word2000 和 WPS2000 在本质都是字处理 软件。但现在我们要从另外一个角度讨论 C++ Builder 这个编程工具。 这个角度,就是“封装”——面向对象编程思想中的最重要也是最基础的概念。 一个要学习编程的人,可能从 C 开始学起。学 C 时,我们没有接触那些挺玄的 概念,到了 C++,一切就来了,什么面向对象,什么封装、继承、多态……于是我 们兴奋起来,努力去理解,掌握,运用这些概念所代表的技术,在掌握这些别人暂 - 8 -
分享到:
收藏