白话白话白话白话 C++
☆☆☆☆ ToYang 网络文化出版社
网络文化出版社 ☆☆☆☆
网络文化出版社
网络文化出版社
2008 年年年年 12 月第月第月第月第 1 版版版版 2008 年年年年 12 月第月第月第月第 1 次印刷次印刷次印刷次印刷
定价定价定价定价::::99.80 元元元元
2
目目目目 录录录录
程序漫谈
第一章第一章第一章第一章 程序漫谈
程序漫谈程序漫谈
对于计算机,也许你是老鸟,也许你是菜鸟……
编程环境
第二章第二章第二章第二章 编程环境
编程环境编程环境
我们什么编程基础都还没有掌握,能驾驭好这个巨人吗?
计算机原理
第三章第三章第三章第三章 计算机原理
计算机原理
计算机原理
给你一个苹果你的处理是吃掉,而女友把她的手给你时她的意思是要你牵着,如果你把后者等同于前者…
数据类型
第四章第四章第四章第四章 数据类型
数据类型数据类型
这种游戏不会有分出胜负的结局,只会让你郁闷为什么就不能有个最大数让你说了以后,那家伙就再了无法往上加 1 了!
变量和常量
第五章第五章第五章第五章 变量和常量
变量和常量
变量和常量
故事是春秋时的公孙龙先生说的……
十六进制 (选修)
第六章第六章第六章第六章 二进制二进制二进制二进制、、、、八进制八进制八进制八进制、、、、十六进制
十六进制十六进制
如果我们的祖先始终没有摆脱手脚不分的境况,我想我们现在一定是在使用 20 进制。
第七章第七章第七章第七章 运算符运算符运算符运算符、、、、表达式表达式表达式表达式、、、、语句语句语句语句
……突然冒出一校监:“说!你俩什么关系?”果然不愧为计算机系的一对小情侣……
顺序流程
第八章第八章第八章第八章 顺序流程
顺序流程顺序流程
你喝一杯水,一般是这样:1, 往杯里倒满开水;2, 等开水冷却;3, 往嘴里倒。……如果你把第 2 步和第 3 步
调序,结局可能会很难受。
条件分支语句
第九章第九章第九章第九章 条件分支语句
条件分支语句
条件分支语句
痞子蔡说: “如果把整个太平洋的水倒出,也浇不熄我对你爱情的火”。 多么充满感情的话!当然,这一切仅仅是因
为你还没有学过编程。
循环语句
第十章第十章第十章第十章 循环语句
循环语句循环语句
生活中,需要反复的事情很多。譬如你我的整个人生,就是一个反复,反复每一天的生活,直到死,幸好,我们每
天的生活并不完全一个样。
第十一章 流程控制拾遗与混合训练
第十一章
流程控制拾遗与混合训练
第十一章第十一章
流程控制拾遗与混合训练
流程控制拾遗与混合训练
臭名昭著的 goto 出场了……在课程的最后,测一下自已的体重与“理想体重”的差距,是个不错的选择……
第十二章 函数函数函数函数(一一一一)
第十二章
第十二章第十二章
“电视呢?”他说。 “就是它”我指着家里的苏泊尔高压锅,“劳驾,把它修修,最近它总漏气。 “可是,我好象是
来修理电视的?”
3
第十三章 函数函数函数函数(二二二二)
第十三章
第十三章第十三章
某勤奋好学之大款看到这段教程,沉思片刻,转头对床上的“二奶”说:“终于明白你和街 上‘鸡’的区别了”。
程序的文件结构
第十四章 程序的文件结构
第十四章
第十四章第十四章
程序的文件结构
程序的文件结构
程序是由什么组成的? 学习到今天,我们至少有两个答案......今天我们又有一个新的回答。
可见性和生存期
存储类型、、、、作用域作用域作用域作用域、、、、可见性和生存期
第十五章 存储类型
第十五章
存储类型存储类型
第十五章第十五章
可见性和生存期
可见性和生存期
局部静态变量的特殊之处:尽管出了函数的作用域之后,变量已经不可见,并且也失去了作用。但是,它仍然存在着!
第十六章 数组数组数组数组(一一一一)
第十六章
第十六章第十六章
虽说是嚷嚷着要回到童年,可以看到输出结果后,我怎么觉得它有些“少儿不宜”呢?如果你有女朋友,把这个程序
寄给她吧。她一定会很开心。
第十七章 数组数组数组数组(二二二二)
第十七章
第十七章第十七章
系主任在使用你的这个程序时,十个指头一定在不停地颤抖……
第十八章 数组数组数组数组(三三三三) (选修)
第十八章
第十八章第十八章
知道的人明白我是在说“快速排序”,不知道的人还当我是在说小布和老萨扔板砖哪?
基本概念
第十九章 指针指针指针指针(一一一一) 基本概念
第十九章
第十九章第十九章
基本概念基本概念
有一天我们去人民路 108 号,今天纸条写着的地址是:“美眉街 8 号”,于是我们兴冲冲地去了……
为指针分配和释放内存
第二十章 指针指针指针指针(二二二二) 为指针分配和释放内存
第二十章
第二十章第二十章
为指针分配和释放内存
为指针分配和释放内存
昨天来时,美眉还住在这里一座别致小阁楼里,今日故地重游,这里竟成废墟一片
实例演练与提高
第二十一章 指针指针指针指针(三三三三) 实例演练与提高
第二十一章
第二十一章
第二十一章
实例演练与提高
实例演练与提高
简单变量是一间房屋…数组是房间数固定的一排房子…指针呢…它不是实际房子,而是设计纸上的房子。
第二十二章 结构结构结构结构
第二十二章
第二十二章
第二十二章
说了这么多,大家不要被“面向对象”吓坏了。今天我们所要学习的面向对象的设计方法,很简单:把同属于一个整
体的“数据”,归成一个新的类型去考虑,而不是分割成每一部分。
第二十三章
第二十三章 类类类类((((一一一一))))封装封装封装封装
第二十三章
第二十三章
从有了“类”开始,C++的世界越来越有趣了。前面说类就像一个家,家里有成员(数据或函数),现在,我们还要讲
“访问”类的成员……想像有个类叫“美女”。
4
第一章第一章第一章第一章 程序漫谈
程序漫谈
程序漫谈程序漫谈
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
1.1 硬件硬件硬件硬件、、、、软件软件软件软件、、、、程序程序程序程序
1.1 1.1
对于计算机,也许你是老鸟,也许你是菜鸟……
但不管怎样,如果你此时此地你要学习编程,那么你应该多多少少知道点什么叫硬件什么叫软件—
—反正我不管你懂不懂,为了面子,我很不乐意你问我什么叫硬件什么叫软件——我做在这凳子半个小
时了,一直想不出如何给二者下个定义。
美国一个电脑神童说:“凡是摔到地上会坏的就是硬件。”我深感不妥,众所周知,如果把硬盘摔到地
上,那么硬盘坏了,里头的那些数据——都是软件——也一样地坏得让你我心疼。
倘若按字面上理解,那就更加的矛盾重重:硬盘硬是硬件;软盘软也是硬件。
还一种说法是:看得见摸得着的为硬件,看不见摸不着的为软件。刚觉得它说得不错,但马上我就发觉
了它的破绽:我现在用的 Word2000,它就在屏幕上,界面美观,操作方便……
无奈之下,我搬出金山词霸,它说:“硬件:计算机及其它直接参与数据运算或信息交流的物理设备”。
挺好。硬件就是设备。平常我们生活中的各种设备,洗衣机,冰箱,电视,还有螺丝刀,钳子,都是硬件。
软件呢?“软件:控制计算机硬件功能及其运行的指令、例行程序和符号语言”。指令、程序和符
号语言是什么且不说,至少我们得知:软件是用来控制硬件的运行的。
这就好办点。我们可以打比方:譬如汽车,其本身自然是硬件,但关于驾驶车的那一套技术,及有
关交通规则,我们可称为软件,因为后者控制了前者的运行方式。
(不传之秘笈:如果你英语一般,学习编程时,别忘装上金山词霸。并且装上后立即上网升级)
现在来谈“指令、程序、和符号语言”。我想交通方面的“软件”确实就是这些东西。我不会驾车,
但曾多次看到警察在我上班坐的班车前用指头一指,就令我们的司机脸色发青。之后,一套既定的处罚
程序被执行。很快,听说我们的司机又在学习那些用来表示“单行”、“只许右拐”、“不许停车”、
“禁鸣”等奇奇怪怪的符号语言了……
事实上,说软件看不见摸不着其实也正确。因为它们是思想,精神,规则,逻辑。本身是抽象的,
确实不可触及。但软件总是要有载体来存放,要有表达或表现方式,这些使得它们变得形象具体起来。
在此意义上,说软件是摔在地上坏不了的东西,也相当行得通,神童毕竟是神童。
最后,什么是程序?我决定斗胆来给它下个定义:
程序是一组按照一定的逻辑的进行组合的指令。
因此,在以后的学习过程上,很多时候我们会觉得程序就是指令;同样很多时候,我们觉得程序就是逻辑。
当然,更多的时候,我们并不区分程序和软件二者。也许前者更趋于抽象,而后者趋于具体。比如
我们在写那些表达我们的思想逻辑时,我们喜欢说“写程序”;而当程序完成,可以待价而沽时,我们
称它为软件。
5
1.2 计算机语言
1.2
计算机语言
1.2 1.2
计算机语言
计算机语言
程序用计算机语言写成。编程的实质就是你用计算机语言来表达你解决问题的逻辑。
那么,什么叫计算机语言?
先不必去解释。因为,计算机是机器,机器不是生物,它怎么能有语言?小猫小狗有语言我尚可相
信,机器也有语言,还要我们去学习,这似乎有渎人类之尊严。
如果我不把这个结解开,可能部分特别在意人类尊严的学生对学习编程从此产生心理障碍,无法继
续学习……
狭义上,我们讲的语言,汉语英语广东话,它是语言,有声音。小鸟之间吱吱喳喳,大抵也是语言。
但其实语言二字虽都带口,却不是说非得有声才称为语言:哑语无声,但它也是语言。广义上讲,语言
是沟通、交流的一种手段。基于此,我们认为所有的机器或工具,也就包括计算机,都有它们自己的语
言。比如锤子,它的语言是敲打;比如螺丝刀,它的语言是拧,如果你非要拧锤子,非要敲打螺丝刀,
那么结果就像你用法语和广东佬交谈,用粤语和法国佬说话一样莫名其妙。
一般地,越复杂的机器,人类与其沟通的语言也越复杂。譬如汽车,你想驾驭它,你就必须去驾校
参加学习。想一想,开车的时候,我们的确是在和车进行沟通。如果你俩之间的沟通出现差错——你心
里右转,手却一个劲向左转方向盘,向机器发出了错误的命令——这将多么可怕!
至此,我们的心理障碍可以消除了。小猫小狗有语言是因为它们聪明,而机器有语言却是因为它们
的笨:它们笨,没办法像动物一样可以通过培训来理会人类的意愿,所以,让人类来反过来为它们定一
套沟通的规则,然后人自己去学会这些语言,从而可以方便控制机器。
再所以,我们推论,凡是机器语言都是笨笨的语言。机器语言可以分低级语言和高级语言,但无论
何者,都是笨得可爱——学得越多你就会越发现它的笨和可爱。另外,当我说越复杂的机器,其语言也
越复杂时,我用“一般地”加以修饰。这是因为,发明和发展机器的智者们会为机器制造出越来越高级
的语言,这些高级语言,最终越来越接近人类的自然语言。就像计算机,我们有信心相信,终有一天,
它能听懂我们的语言——这就是流传在程序员中的一个梦。当程序员熬红眼敲打数万行代码时,他们便
会想起这个梦:闭上双眼,伸腰,对 PC 说:“BEGIN……”;深呼吸一次,然后说:“END”。张眼时
发现计算机已完成了所有工作……
(不传秘笈:程序员必备之工具:日产乐敦牌眼药水一瓶,用于预防角膜炎;韩产 777 牌指甲刀一
枚,用于铰除因击键刺激而疯长的指甲;国产肛泰若干,治疗因长期坐姿不当而导致的痔疮)
回到计算机。它是机器,也是人类有史以来,继发明使用火、电、电子这些改善人类生活的工具后,
最为重要,最为先进,最为广泛使用的工具。它的机器语言之复杂程度可想而知,已经复杂到必须成为
一门大学的专业课程。然而别忘了我们前面的结论,语言只是沟通的手段。在这个意义上,当你用鼠标
或键盘在计算机上进行输入时,只要你输入的是正确操作,我们都认为你在使用计算机语言,因为你确
实是在用一种特定的方式或动作,进行和计算机的交流。
当然,这里的课程并不特意教你任何有关计算机的基本操作。计算机的基本操作主要是指如何使用
计算机内已有的软件产品,比如 Windows 本身(操作系统是软件,称为系统软件);比如办公系统 MS Office
或 WPS Office(这些实现工作生活中具体应用需求的称为应用软件);比如游戏(一种特定的,只拿来
玩的应用,称为游戏软件)。但我们不同,我们学的是如何编写软件。也就是说,我们将是发明人,设
计师,创造者;而他们(到今天仍拒不学习编程的家伙)都只是使用者。(我突然有些不安:这么说其
实纯属煽情。公平地讲,任何人的任凭创造都是别人的劳动成果之上,任何人也都在创造自己的杰作)
程序(或软件)是用计算机语言写出来的。
• 写一个程序,大致是这么一个过程:
• 人有一个问题或需求,想用计算机解决……
6
• 人想出解决问题或实现需求的思路……
• 人将思路抽象成数学方法和逻辑表达或某种流程的模式……
• 程序员将数学方法,逻辑表达中的数据和流程用计算机语言表达,称为代码……
用计算机高级语言写成的代码被语言的实现工具(VC,VB,Delphi,或 C++ Builder)转换成计算
机的最低级机器语言。这就完成了人与机器在程序制定上的最后沟通。
可见,你的思路是先用人类自己的语言思考,然后用一门计算机语言写成代码,最终,需要一个语
言工具来将它转换成机器可以理解的机器语言。我们要学的就是一门承上启下的计算机语言。这样语言
有很多:BASIC,Pascal ,C, C++, Java, C#……我们学 C 和 C++。它是使用最多的语言。有关 C,C++
的更多特点,我们将在下一节谈到。
尽管你完全可以直接用最低级的计算机语言——机器语言——来写代码,那样就不需要语言工具了,
但在这里你要弄清了,我们不是教机器语言。下一节,你会明白用机器直接能懂的语言——不妨称之为
原始的机器语言——写软件,在今天是多么的不现实。
1.3 语言和实现语言的工具
1.3
语言和实现语言的工具
1.3 1.3
语言和实现语言的工具
语言和实现语言的工具
1.3.1 1 1 1 机器语言
1.3.
机器语言
1.3.1.3.
机器语言机器语言
你知道香蕉叫什么吗?就叫香蕉?叫 banana?
错,都错。
香蕉叫“牙牙”。
这是一个 baby 的语言,一个婴儿还没学会人类的主要语言,所以面对喜欢的东西总是发出咿咿呀呀
的声音,也许你听不懂,但这是她的语言。符合小孩特点的语言。
计算机的机器语言也一样,必须符合计算机的硬件特点。而痛苦就在这里,越符合机器的特点,同
时也就越不符合人类的特点。
计算机,全称电子计算机,20 世纪 40 年代,无线电技术和无线电工业的的发展为电子计算机的研制
准备了物质基础。1943 年~1946 年美国宾夕法尼亚大学研制的电子数字积分和计算机 ENIAC(Electroic
Numerical Integrator And Computer)是世界上第一台电子计算机。ENIAC 计算机共用了 18000 多个电
子管,15000 个继电器,占地 170 m2 ……
这是计算机的始祖,一堆电子管。随后,电子计算机进入第二时期,小巧的晶体管取代了电子管;
再后,集成电路又取代晶体管,电子计算机进入第三时期。
但无论是哪一时期(以后也许不是),计算机始终采用电子器件作为其基本器件,因此,电子器件的
特点,就是计算机的特点。
为什么使要电子?为什么木头不能做计算机——还真别说不能,您也应该知道,最早出现的用于计
算的机器,真是木头的。你用过计算尺吗?算了,这玩意儿太简单。以前有人用木头作成齿轮,经过设
计,当表示个位数的齿轮转动一圈时,就会带动表示十位数上的齿轮转动 1 格。以此原理,只要你转动
转轴,木头机器就会算出 123+456 = 579……
电子元件没有齿轮,但它们的特点是它们有两种很稳定的状态:导电或不导电,假如用不通电时表
示 0,通电时表示 1,再通过集成电路实现进位的机制。于是,计数功能就有了基础。我们用图表示:
我们生活中常用的数逢十进一,称为 10 进制。而计算机,由于其电子元件的特点,它是二进制数。
7
这里简单地对比一下这两种进制造成的区别,以帮助你更容易看明白上图。
十进制数:最低位称为个位,高一位称为十位,再高一位称为百位。为什么这样称呼?因为在个位
上,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)
面对这样的“程序”你是否表示狐疑?别以为我瞎说,也许你的电脑很先进,是 P4 吧?但在你的电
脑上,仍有那种程序历史遗迹:软驱是也。如果有软驱,那你应该能找到一张软盘。知道软盘有写保护
吗?仔细看看那个写保护的开关——就是一个方孔——打开,告诉软驱本张软盘不能进行写操作,关闭,
告诉软驱本张软盘可以进行写操作。
1.3.2 汇编语言
1.3.2
汇编语言
1.3.2
1.3.2
汇编语言汇编语言
前面说机器语言尽是 0 和 1,那么是不是可以随便写一串 0 和 1 就算是程序呢?不是。就像汉语是由
汉字组成,可我要是说下面这一串汉字: 天爱我京门北安
你觉得我是在说人话吗?
机器也有自己固定词汇,在机器语言里,称为机器指令,程序是由指令及数据组成。这些指令是一
些固定的 0 和 1 的组合(不同产商不同型号的机器,其指令又有不同)。作为程序员,就得将这些指令
一次次正确地用 0 和 1 拼写出来。
你决不会将“我爱北京天安门”说成上面的话,但你极有可能将 10101101 写成 10010101,对不?
所以很自然地,出现了用符号来表示这些固定的二进制指令的语言,这就是汇编语言。
8