《2008版 白话C++》
------------------------
(消息:本书已经和出版社签定出书合同。出书时间:2009年9月)
网站: www.d2school.com
另,为了和网上流传的所有旧版 《白话C++》区别,有利于大家搜索,暂时加上前缀“2008版”。
------------------------
第1章 启蒙
"在成为真正的程序员之前,我们需要接受一场洗礼。"
1.1.开始
学习编程不是一件容易的事——其实,我多么希望在您读完本书之后,能把书,与及书的作者当成朋友,而不是敌人——所以,我应该坦诚地说:学习编程是一件很难的事,而学习C++编程,就更难了……
1.2 什么是计算机
据说,一部《红楼梦》,经学家看见“易”,道学家看见“淫”,才子看见“缠绵”,革命家看见“排满”,而流言家看见宫闱秘事……。同样是计算机,一个程序员和一个非程序员,看到的会有什么不?
1.3 什么是硬件、软件
一个好的驾驶员,主要掌握的是“驾驶技术”。当然一般他也会懂一些汽车的硬件知识。掌握好汽车的硬件知识,不仅在车出现小故障时可以应急维修一下,更重要的是它有利于促进驾驶员的驾驶技术。
一个好的程序员,主要掌握的是“编程技术”。当然一般他也会懂一些电脑的硬件知识。掌握好电脑的硬件知识,不仅在电脑出现小故障时可以应急维修一下,更重要的是它有利于程序员的编程技术。
1.4 什么是程序
让我们来想象一个游戏——游戏中有两个人,其中一个被布蒙上双眼。另一个人是你。场地中混乱地摆上许多啤酒瓶。游戏任务是由你发号施令,指挥被蒙眼者从场地一端穿越到另一端,其间不允许碰倒任意一个啤酒瓶。
1.5什么是编程语言
……等等,机器,没有生命的东西!小猫小狗有语言倒可以接受,机器也有语言,还要我们去学习,这似乎有点亵渎人类的尊严。得把这个结解开,不然部分自尊心特别的学生,可能从此产生心理障碍,无法继续学习编程。
----------辅助教程-------------------
Code::Blocks如何设置热键动画教程
Code::Blocks + wxWidgets 写图形界面(GUI)程序
-----------------------------------------
1.6.什么是集成开发环境
“集成开发环境”当然不是指“国家政策”、“环球经济”之类的环境。“集成开发环境”其实就是一款软件。
第2章 准备
"决定你能否成为程序员,不在于你的计算机基础,在于你是否有足够的耐心。"
2.1. 准备的准备
2.2.安装IDE——Code::Blocks
2.3. 安装msys
2.4.安装wxWidgets
2.5.安装boost
2.6.安装iconv、iconvpp
2.7.安装MySQL、MySQL GUI Tools
2.8 安装 MySQL++
2.9.安装xerces-c
2.10.安装 xsd
2.11安装 deelx
2.12.安装gSOAP
2.13.安装SDL
2.14.Code::Blocks配置——全局路径变量
Hello world!,Hello C++,我们来了!
--------------感受“面向过程”的开始-------------------
3.1. Hello world 经典版
毫无疑义,一个真正的程序员,总是愿意把自己的第一次——我是说“感受”——献给是“Hello world”。
3.2. Hello world 中文版
一个西方程序员,也许到今天仍然可以傲慢地不去理解“编码、字符集”,但一个真正的中国程序员,必须面对这个问题。
3.3. Hello world 函数版
想象某个阳光明媚的清晨,你走进公司的大楼,心情很好,看到同事小A,你微笑点头:“Hello!”;看到小B,你微笑点头:“Hello!”;看到小C,你微笑点头:“Hello!”……你脖子有些酸了。广告词出现“这时,您需要一个Hello函数”!
3.4. Hello world 交互版
在“函数版”中,我向小A和老板问好。你呢?小伙子把自己关在家里苦学C++编程,精神可嘉!但我还是要非常“恶意”地推测,你写的代码是这样的:
Hello( "志玲" );
Hello( "小翠" );
3.5. Hello world 分支版
……新的需求产生了!程序可不可以区分一下,当遇上志玲时,我们需要稍微有点的不同问候方式——至少和碰上BOSS的状况相比。
3.6. Hello world 循环版
分支程序中,每次运行程序,我们只能“遇”见两个人,如上例运行结果中的“志玲”和“丁小聪”。
循环版的任务,就是……
--------------感受“面向对象”的开始-------------------
3.7. Hello object 生死版
虽然用“恐猪”来表示一个崭新的人造物种,那是相当的直观,但在代码中炫耀自己的渊博的生物知识——尤其是科幻片中听来的——永远不是一个程序员所应该做的。所以我们还是老老实实地,使用“Object”这个词吧
3.8. Hello object 成员版
……于是,这个类型的对象拥有自定义的“生”与“死”的过程,然而,光光讨论对象的“生”与“死”,未免太形而上,太哲学,我们要考虑如何从“抽象”过渡到“具体”……读者有没有玩过电脑游戏……
3.9. Hello object 派生版
我听到很多读者在喊“志玲!志玲!”。是啊,有人对我用xiaoA和xiaoB这样两个没有创意的人物来演绎“Hello Object 成员版”表示抗议:“志玲上哪儿去了呢?” 关键是,如果让“志玲”上场,那么我们就需要开始面对一个问题:既然,我们对“志玲”的问好都要与众不同,那么,她的自我介绍,难道就不能来点变化?
3.10. Hello object 多态版
公元前209年,7月。秦朝著名的两位民工,陈胜、吴广说了一句话:“将相王候,宁有种乎?”。他们在表达一种不满:难道那些有钱人或当官人,天生就和我们有不同人种吗?
我们的例子程序似乎也有这个问题。
3.11. Hello object 封装版
那时——医生把长长的胃镜导管强行从我嘴里,我眼泪一下子哗哗下来——就在那时,我突然意识到,胃应是人类的私有数据,只不过在医生面前,它被暴力破解了。 C++也一样,当你只为图一时方便,想把本应private的数据设置成public时,你应该去医院感受一下胃镜。
3.12. Hello STL 向量篇
“ 好消息!第XXX届国际美女大赛即将在中国举行,届时将有2999名来自世界各地的美女参赛。最新消息表明,本次大赛将对所有数据统一采用专业软件进行管理。另据IT界知情人士透露……”
3.13. Hello STL 列表篇
我不耻地骂了一声:“虚伪!”。丁家老婆腼腆地冲我家一笑,盖上了纸盒。我才发现纸盒上写了几行字:
产地:C++标准委员会
结构:std::list 类型: std::list<存款单>
3.14. Hello STL 算法篇
你肯定知道“我吃饭”中的动词“吃”,是一个“谓语”;但我要特别提醒:“我是一个男人”中的“是”,也是一个谓语。同样,C++中的“谓语/predicate”通常是用来做一个“是什么吗?”的判断,比如:“是大于number吗”,或“是等于number吗”。
3.14. Hello STL 文件篇
(未完待续 2008年11月25日)
4.1. Hello GUI 基础篇
我们回到了一个原点,准备再次写一个“Hello world”,但这一次,我们将和“Hello world”重逢于“GUI”的平台。
我们采用支持跨平台的wxWidgets C++图形界面库,在学习本节课程之前,您需要确信已经完成《第2章 准备》所提及的,有关wxWidgets的编译、及配置工作。
4.2. Hello GUI 布局篇(1)
无论是C++,还是其它语言的GUI库,只要支持跨平台,则其最主要的布局方法,都不约而同的采用了另外一种方法——“相对定位法”——比如采用“百分比”来定位。
4.3. Hello GUI 布局篇(2)
本小节,我们身负双重责任:其一、通过设计一个真实应用的界面, 进一步熟悉wxSmith的使用方法。其二、本节的设计成果,将成为本章后续“Hello Database GUI版”所需要的窗口界面。
4.4. Hello Internet
本节我们将使用wxWidgets库的网络功能,访问www.d2school.com 提供的网络资源。过程是:在窗口的编辑框内输入姓名,点击既定按钮,程序通过wxWidgets提供的组件,访问“第二学堂”预设的网络链接,获得一句来自互联网的问候语。
4.5. Hello Database 准备
我们将通过三个小节的内容,来完成“Hello Database”的学习。首先是本节的“准备篇”,用以完成以下四个任务:
了解数据库应用编程(“客户/服务”二层结构)的基本概念;
- 在Code::Blocks中配置和“Hello Database”项目有几个C++扩展库的全局路径变量;
- 了解 “Hello Database”项目的基本需求;
- 准备“Hello Database”所需要的数据。
4.6. Hello Database 控制台版
建立连接之后,我们就可以开始查询了。类似打通电话,你就可以来一句:“喂,给我5公斤大米!”。哈哈,大米不可能顺着电话线过来,但对于“数据库连接”,只要客户端说对了话(正确的SQL),所要的数据就会迅速从连接上传回来。
4.7. Hello Database GUI版
2008年北京奥运会,我们当然是获得金牌最多的国家!从这个意义上讲,我们的金牌数很多很多。不过如果从数据库的存储量来看,51条记录那可一点不多。因此,本例如果一次将所有备注与图片数据都查回,并且同样保存在内存中,对于流行的个人电脑配置,并不是很大的压力。
第五章 基础
“总有一些知识,要在多年以后,我们才能感受得到它的力量。”
5.1. 从代码程序
这是一行代码: cout 《 "Hello world!" 《 endl;它是如何变成一段程序,从而在屏幕上打出“Hello world”呢?
5.2. 构建C++程序
谈到链接,首先会有困惑:“都已经编译成机器语言了,不就完事了吗?链接干什么?”
5.3. C++项目组成
首先我们知道了,写一个C++程序,可能需要多个源文件,比如a.cpp、b.cpp。有没有可能只用一个源文件呢?似乎是可以的,比如我们之前写的 “Hello world”经典版等项目,不就只有一个main.cpp吗。其实,就算是“Hello world”经典版这样一个小程序,我们也要支付链接器同志的出场
5.4. 进程与内存
当程序安静地躺在硬盘上时,它是一个“文件”,非要给点区别的话,它是一个“可执行文件”;而当程序运行起来,它就从硬盘上一跃进入内存,这时它就被叫做一个“进程/process”了。
5.7. 进制.1
我女儿读幼儿园时,我就开始关心起她的算术能力。于是我了解到,她在小班的时候,就会个位数的加法,但一晃两年,到大班要结束了,才见她拿着算盘在那里炫她的百位数以内加减。
5.8. 进制.2
说到十六进制,首先会问:总共只有10个阿拉伯数字:0、1、2、3、4、5、6、7、8、9,如何表达“逢16进1”的概念呢?方法是用英文字母(大小 写均可):A、B、C、D、E、F表达10~15。所以,如果我告诉你:这是一个数:“17FCA0”,你肯定能猜到它是一个十六进制的数,不过如果我说 的是:“12390”,就不好区分是什么进制了。