编辑推荐

作者以讲故事的形式展开教学,内容生动有趣,简单易懂。书中源码全可下载,方便读者学习。

内容简介

《白话C++》分“练功”和“练武”两册。“练功”主讲编程基础知识、C++语言语法(含C++11、14等)及多种编程范式。具体包括:大白话讲解计算机架构、进程、内存、二进制等编程概念;手把手教复杂编程环境的安装应用;快速感受C++语言概貌及图形界面、数据库、网络、多线程等功能库;深入浅出地讲解C++语法、标准库常用组件及面向过程、基于对象、面向对象、泛型等四种编程范式的演化与对比。

白话C++之练功》借助生活概念帮助用户理解编程,巧妙安排知识交叉,让读者不受限于常见的控制台下编程,快速感受C++编程的乐趣,提升学习动力。《白话C++之练功》适合作为零基础C++编程学习从入门到深造的课程教材。《白话C++之练功》也是《白话C++之练武》的学习基础。“练武”的重点内容有:标准库(STL)、准标库(boost)、图形界面库编程(wxWidgets)、数据库编程、缓存系统编程、网络库编程和多媒体游戏编程等。

作者简介

庄严,笔名南郁;20年IT从业经历,从一线研发人员到企业副总工、技术总监。虽然不同岗位有不同职责,但从未放弃过编程。编写过嵌入式、字处理软件、语言解释器、手机应用、大型分布式网络服务和互联网商城等软件系统。

现为程知信息公司创始人,致力于将自身的技术、学习过程、成长历程、对内对外的技术培训、大学院校培训课程以及常年参与技术员面试的心得体会、经验教训形成相关课程。

目录

第1章启蒙1

1.1开始1

1.2什么是计算机4

1.3什么是硬件、软件6

1.4什么是程序7

1.5什么是编程语言9

1.6什么是IDE15

1.7你是程序员17

1.8出发赠言19

第2章准备20

2.1基础知识20

2.2安装IDE——Code::Blocks23

2.3系统编译环境变量29

2.4安装wxWidgets30

2.5安装boost33

2.6安装MySQL35

2.7安装MySQL++39

2.8配置Code::Blocks全局变量41

第3章感受(一)45

3.1Helloworld经典版45

3.2Helloworld中文版56

3.3Helloworld函数版58

3.4Helloworld交互版61

3.5Helloworld分支版65

3.6Helloworld循环版68

3.7HelloObject生死版70

3.8HelloObject成员版81

3.9HelloObject派生版86

3.10HelloObject多态版92

3.11HelloObject封装版99

3.12HelloSTL向量篇110

3.13HelloSTL链表篇123

3.14HelloSTL算法篇137

3.15HelloSTL文件篇160

第4章感受(二)170

4.1HelloGUI基础篇170

4.2HelloGUI布局篇175

4.3HelloInternet184

4.4HelloDatabase188

第5章基础198

5.1从代码到程序198

5.2构建C++程序202

5.3项目/Project209

5.4进程与内存216

5.5内存分段220

5.6CPU、寄存器225

5.7线程227

5.8数据与内存230

5.9进制(一)258

5.10进制(二)263

第6章IDE——Code::Blocks271

6.1窗口布局271

6.2环境设置273

6.3编辑器设置279

6.4编译器全局设置287

6.5调试器全局设置288

6.6全局路径变量289

6.7项目管理290

6.8项目构建选项294

6.9项目属性300

6.10项目实践303

6.11调试307

第7章语言313

7.1字面量313

7.2类型327

7.3类型基础行为345

7.4变量和常量385

7.5引用388

7.6指针401

7.7数组409

7.8STL常用类型420

7.9生存期、作用域、可见性、访问限定451

7.10函数477

7.11Lambda函数519

7.12操作符与表达式527

7.13语句与流程544

7.14模板580

7.15异常593

7.16并行流程615

第8章面向对象634

8.1抽象634

8.2封装643

8.3派生735

8.4基于对象例程759

8.5多态779

8.6OO设计原则792

8.7综合练习815

第9章泛型820

9.1泛型概念820

9.2基础回顾820

9.3模板实例化825

9.4泛型应用实例838

9.5泛型特化872

参考文献881

前言/序言

(一)

2000年的时候我开始写《白话C++》。那时候流行个人主页,就在搜狐网站上申请了一个域名:mywlbcyl,取“没有弯路,编程摇篮”的拼音首字母,主要发表自己写的C++入门课程。

然后,就走了10多年的弯路,当年要有摇篮里的宝宝跟我学C++,现在都该读大学了。现实比这更残酷,跟着我的课程学习的人,当年多数是风华正茂的小鲜肉,现在都成大叔了。就说和我签订出书合同的胡编辑,转眼成了两个娃的爹。

可我的书还一直在“摇篮”里。

所以我肯定是一个“拖延症”加“完美臆想症”的严重综合患者,但我还是想找客观原因:C++的教程真的好难写,特别是结合我的想法和目标时。

(二)

十几年写一《白话C++之练功》,要说是好事也可以。比如这十几年来,无论是C++还是我,都成熟了好多。

先说C++。新标准的制定与出台,各家编译器的进化,越来越多的开源C++项目、基于C++新标准的优秀书籍的出现,都是C++长足发展的标志。还有一点,那就是人,当然我想特指中国人,前面提到的标准、编译器的实现、开源项目等,都有越来越多的中国C++程序员参与其中。从人的因素出发很容易又能发现:C++编程的氛围也在变好。想当年有一个奇怪的氛围:说到C++就是VC,说VC就是MFC。2000年前后我曾在某论坛上发表了有关MFC设计不足之处的一些浅见,立刻淹没在一大波网友唾弃的口水中。现在,尽管C++早已不是编程语言上的“一哥”,但受益于多本经典C++书籍的流行,以及发达的网络和时间的沉淀,甚至也受益于更多其他编程语言的流行,使用者对这门语言的认识越趋成熟了(相信对其他语言也是)。

再说说我的成长。从二十多岁到四十多岁;从写几万行C++代码到几十万行代码;从只玩C/C++到在工作中用PHP、Java、C#、Delphi和Python,还学习了D语言、Go语言和JavaScript(Node)等;从嵌入式工控程序到Office桌面软件;从C/S结构到B/S结构,甚至偶尔充当“全栈工程师”。大约就是,周一写JavaScript+HTML+CSS,周二写后台分布式服务,周三改数据库结构,周四换了一套相对整洁的衣服去拜访客户、讲PPT,周五人事和我说:“帮忙面试个人吧?”周末?就像今天一样,白天补觉,晚上改《白话C++》书稿。

东忙西忙的日子里,我偶尔也回想起大学毕业刚走上社会的那几年,觉得自己懂人生、懂社会、也懂编程,现在才发现这三样我哪样都没能参透。所以我觉得自己应该是成熟了一些,并且觉得幸亏因为拖延症或者就是懒惰,没有在10年或更早前写完《白话C++之练功》。《白话C++》的目的是帮助他人学习C++,而那时我对目标中的“帮助”“他人”“学习”和“C++”的理解都流于浅显粗鄙,这样子写出来的书对读者真有帮助吗?

(三)

十数年过去了,中间有近一年的时间,我安排自己到培训机构兼职教C++编程,非常辛苦也没什么钱可赚。学习上,我自己买的以C++为主的编程书籍近百本,阅读网络下载几十个开源C/C++项目源代码;实践上,我在许多软件项目中掉进去、爬出来的坑,大大小小感觉像是青春期永不消停的痘,有一天突然全被填平了。不管怎样,根据一项技能你学习5000(或者更多点,8000)小时就能成为业界专家的“定律”,我觉得自己对程序员、对编程技术以及程序员怎么学习和应用编程技术的认识,都上了新的台阶。我慢慢地将这些认识写进这《白话C++之练功》里,一稿、二稿、三稿不断兴奋地写下,又不断沮丧地推翻;大家百度“白话C++”,应该可以找到数个版本。

在反复改写的过程中,最重要的一个认识是:学习C++应该既练功又练武。没错,我把学习C++语言分成“练功”和“练武”两件事。

习武之人说的“武功”,“功”通常是身体素质、内气外力;而“武”是“招式”(可以外延到“十八般武艺”)。关于这二者,有句老话叫“练武不练功,到老一场空”,意思是光练把式,不练气力,就容易止于花拳绣腿,一生难成高手。但在另外一个方向上,我记得霍元甲在创建迷踪拳时曾经说(电视里的):“练功不练武,都是白辛苦。”说的是另一个极端:你苦练内功,马步一扎特别稳实,却什么拳法招式都不练,什么兵器也不学,就会变成空有一身力气使不出来,白辛苦。转了个笑话加深大家对这种尴尬局面的理解,说是一个练“铁布衫”的和一个练“金钟罩”的比武,两人都一动不动地呈现“入定”状态,裁判在边上哭着说,“你俩扛得住,我扛不住啊!”

那么编程行业中,什么是“功”呢?广义上讲,计算机原理、网络协议、算法、语言语法、编译原理、设计模式都可以归为“功”。而类似“如何创建一个窗口”“如何提交一个网页的表单”“网页局部刷新的AJAX技术怎么用”“某某语言解析XML用哪个类”“怎么实现JSON和对象的互换”“如何访问MySQL数据库”“如何在数据链路上加入缓存”“哪家的短信服务器好用又便宜”“安卓系统如何实现消息推送”以及“Linux下的进程挂掉时怎么快速重启”等这些问题的答案,统统是“武”。

再进一步限定范围到“编程新人如何学习C++”,我将“功”限定在C++语言语法和编程范式(面向过程、基于对象、面向对象、泛型编程)等基础知识上,但凡对C++有一定了解的人,都清楚这已经可以写成厚厚的一《白话C++之练功》了。以语言为主要教学内容的《C++Primer》或《C++程序设计语言》的厚度便是佐证。“武”的方面则挑选来自标准库STL及“准标准库”boost中的常用工具,桌面GUI编程、并发编程、数据库(MySQL)访问、缓存(Redis)访问、网络编程以及仅限于自娱自乐的简单多媒体游戏编程等。

“武”强“功”弱的C++工程师,通常解决实际问题的能力还不弱。项目要用到网络,就找个网络框架照着搭起来;项目要用到视频处理就找些视频代码改改用。C++语言的特点是一方面很复杂很庞大,一方面只需学习一小部分(比如“带类的C语言”)就可以写程序,甚至可以“一招鲜、走遍天”。这就造成部分人在学习阶段就急于动手出成绩甚至上岗赚钱。如此情况下,当他们面对复杂问题时,往往采用堆砌代码等方式完成,一个人做到底看似很快,想要在团队分工中让别人看懂他的代码就很困难了。并且所写的代码往往缺少合理的设计,在需求变化几次之后,整个代码就膨胀得像生气的河豚。

再说说那些“练功不练武,都是白辛苦”的同学。C++语言还有个特点,就是它的标准库仅为有高度共性、高度抽象的逻辑提供功能,许多实际项目经常用到的业务功能统统没有。想象丁小明(《白话C++之练功》中的重要人物)捧了一本厚厚的C++书籍辛苦学了一年,上班时才发现老板是这么要求的:“听说QQ是C++写的,你来写个类似的窗口。”“听说C++写的程序性能好,你写个网络服务端,要求不高,1秒钟撑1万次访问就好。”“听说游戏引擎基本是C++写的,你开发个万人在线游戏吧。”“听说Photoshop也是C++写的,你写个程序批量美化下公司年会上的照片吧。”难吗?不好说,只是丁小明清楚地记得学习所用的那本C++书籍快1000页了,但从头到尾没出现过网络、窗口创建、游戏和图片处理等。丁小明很郁闷。

白话C++之练功》是《白话C++》上册,重点负责“功”的部分。讲C++基本语法也讲二进制,讲编程环境如何搭建也讲“面向过程”“基于过程”和“面向对象”等编程范式,等等。下册负责“武”,讲解如何用C++写窗口图形界面程序、多线程并发程序、网络通信程序、数据库程序和小游戏程序等具体技能。

(四)

关于如何学习C++,我的第二个认识是:你没办法学一遍就能精通C++。事实上学习再多遍恐怕也精通不了,但请相信:刚开始学习时,通读一遍,练习一遍,再回头重新学习一遍,会比一节节死抠过去,结果一年时间未能读完一册的效果要好。C++中有许多知识点是交叉的,比如“指针”和“数组”,指针可以指向数组,数组的元素可以是指针,数组作为函数入参时会退化成指针。因此二者谁放前谁放后都有合理之处,学习完前面的有利于学习后面的,但学习了后面的同样有利于进一步理解前面的。拉长镜头看《白话C++》,许多篇章之间,甚至跨越上下册之间,都存在后面内容对前面内容进行验证或补充的安排。另一方面,许多复杂的知识,在靠前的章节就简略提及,这是刻意地对知识点做交叉学习的安排。最典型的如下册中的许多内容,在上册一开始就会有“不求甚解”的快速涉猎,让学习者感受C++的“能量”,避免一直埋头在黑乎乎的控制台窗口,误以为自己只能用C++写一些“玩具”代码。

以30天背30个英语单词为例,若一天就背30个,连续背30天;其效果通常要比第一天背第1个,第二天背第2个,一直背到第30个要好。机械记忆尚且如此,更何况是充满有机关联的编程语言呢?

作为一个极端的反例,学习编程语言一定不要过早追求100%精确,更不要沉迷于当“语言律师”。网上流传一个小视频,说是一位幼儿园老师想教会小朋友关于“小鸟听到枪声会受惊吓飞走”的知识,于是设计了一个问题:“树上停着七只鸟,猎人打了一枪后,树上剩下几只鸟?”没想到所有小朋友都很冷静,第一个问:“有没有耳聋的鸟?”第二个问:“有没有胆子大、神经大条的鸟?”第三个问:“有没有哪只鸟和死去的那只鸟的感情深厚,坚决要留下殉情的?”好嘛,为了回答老师那个看似简单的问题,这一下涉及到生理、心理和鸟类感情等方方面面的知识,这样的教学还如何进行呢?

《白话C++》第一章为读者圈出学习的最低起点,书的课程以该起点逐步推演。因此,许多知识点会反复出现,而且在不同的出现阶段会有不同的解释。靠后的解释相对全面、规范、简洁、深刻;靠前的解释就难免片面、粗浅、啰嗦甚至牵强——很可能低于您已有的水平,此时请各位一笑而过。

当然,以上有关“不求甚解”的说法,并非鼓励大家蜻蜓点水、囫囵吞枣般地学习。正确的方法应当是:遇上问题,加以思考;一时思考不出答案,应善于上网搜索;勤于编写程序测试或验证结果以及与人交流请教;如果还是不能解疑,也没必要卡在原地,可以做上标记,继续往下学习。

(五)

书中除了普通正文之外,还设置了“课堂作业”“小提示”“重要”“危险”和“轻松一刻”等小段落。各自的作用和学习的要点如下:

“课程作业”:一定要“现场”做,所谓“现场”就是不往后看新内容,立马做。出于排版需求,有一些作业并未单独成段,而是直接写在普通段落中。另外,更为重要的是,只要课程中出现示例代码,基本上要求读者亲自动手写程序并编译、测试通过。

“小提示”:和当前课程内容有一定的相关性,用于辅助解释当前课程的部分内容。碰上时能看懂最好,但如果个别无法理解也不用放在心上,通常并不影响继续阅读后文。

“重要”:长远看都是重要的知识点,虽然现在一时读不懂不会影响继续学习,但长远看会影响关键知识的运用。因此应努力阅读,如果不懂应做标记,以期下一次阅读能理解、掌握。

“危险”:如果现在搞不懂,很可能往下(特别是需要写代码时)没多长时间就要出问题的知识点。

“轻松一刻”:主要用于调节学习氛围,让大家偶尔放松,但也存在部分内容同时发挥“小提示”的作用,可当成相对有趣的“小提示”来看。当然出于行文的需要,也有大量轻松一刻的内容会以更加一本正经的方式躲在正文中。

(六)

希望《白话C++》能帮到正在或正要学习C++的广大读者。感谢购买《白话C++之练功》。限于个人能力,加上篇幅大,前后反复修改大,请读者多提宝贵意见,以期持续改进。

感谢一直信任我,也一直在为《白话C++之练功》努力的编辑。

感谢我的父母。未能在我的父亲离世之前完稿,是我今生至憾。感谢我的妻女,是你们一直在鞭策和鼓励我。我一直以为《白话C++》会是我的二女儿,可是书还没面市,家里二宝出生了,都上幼儿园了,这书要屈居老三。

帮助我完成《白话C++之练功》的还有我的同事、朋友、同行、老师以及学生,一并感谢。以下是致谢名单:涂祺招、刘弘钊、胡海、王嫣琪、卢淼先、吴宸勖、颜闽辉、肖华、林起柄、揭英杰、陈婷婷、张晓晓、陈晓锋、白伟能、林柏年、卢毅、杨文、罗海翔、庄渊、赖锦波、潘代淦。

请在北京航空航天大学出版社官网的“下载专区”或者在第2学堂网下载《白话C++之练功》源码。


其他推荐