前言
恭喜你,在众多的计算机编程语言中,选择了C/C++语言,一门业界公认的功能强大、性能极优但学习难度大的计算机编程语言。选择这门编程语言学习的读者通常是勇气和智慧兼具的人;能够把这门语言熟练掌握并灵活运用的人也通常是那些能够在编程道路上走得更扎实、更久远,基础和综合开发实力远超同龄者的人。
20多年前,从事IT行业的人还不多,当时优秀的程序员也比较少,学习编程知识的途径也非常匮乏。当今,浩如烟海的知识通过网络变得随手可得,人们不得不面对一个新问题:学什么以及跟谁学。
在C/C++语言的学习中,经常有许多人手捧着一些国外大师级的人所写的权威书艰难地阅读甚至反复地阅读。
在笔者看来,这种书并不适合初学者。一本好的编程书应该把最常用、最有用的知识以最通俗的语言和讲解传授给读者,为读者节约大量的阅读时间,并使读者达到事半功倍的学习效果。
笔者认为本书就是能让读者用少的时间掌握多且有用知识的书,笔者利用自己20多年一线开发的实践经验,把自己认为有用、重要的知识,以通俗的语言讲授给读者,让读者在短的时间内达到好的学习效果。
面向的读者
笔者在24年一线C++开发经验的基础之上,编写这本《C++新经典》,前后累计耗费将近10个月时间,夜以继日地工作,终于让它出现在你的手里。这是一本越看越精彩的C++书。
这是一本专门面向C/C++编程语言开发者的专业书籍,针对C/C++语言,以择业为导向,主要适合以下几类读者:
(1)C/C++语言初学者或者由其他计算机语言转到C/C++语言的程序员。
(2)从事C/C++开发多年的程序员,希望详细地复习基础的C/C++知识,把整个知识线串一串,形成一个比较完整的学习体系。
(3)已经掌握C++98标准,但是需要进一步学习C++11/14/17新标准的程序员。总之,不管读者是否有很丰富的C++编程经验,这本书都值得购买,当把这本书拿到手的时候,你就会知道,笔者没有言过其实。随着年龄的增加,人的记忆力会逐渐下降,任何人都不可能将书中的每个知识点全部记在脑海里,所以,没有比将一本适合自己的书放在身边,随时查阅更明智的选择了!
本书特色
(1)本书分三部分:第1部分是C/C++语言概述;第2部分是C语言;第3部分是C++语言。第2部分适合C语言初学者或是想往C++方向转的程序员,这部分内容也是第3部分内容的基础,对于没有基础的读者,千万不可跳过这部分内容,笔者这里所讲解的每一个知识点在第3部分学习C++时都有用。
(2)本书覆盖面广,讲解细致入微。
(3)讲解的手段非常全面:演示、调试、加断点、看变量、看内存都用上了。
(4)坑点会反复强调,理论与实战结合,举例恰到好处,通俗易懂。
C++开发的经典书不少,并且绝大部分经典书都出自外国人之手。许多读者在阅读这些书时,都会遇到读一遍完全没有读懂,只有反复阅读多遍,才能理解书中之意的情形,尤其是C++11新标准推出以来,增加太多新的晦涩的概念、术语和知识点,进一步加重了学习者的负担,甚至让很多学习者望而却步。
很多名气大的作者写的书让人非常难以读懂,是因为他们是在用专家思维写书,结果必然是难以让普通大众读懂。生活中这样的人有很多,例如他自己明白一些知识,但只要是讲给别人听,一定会把别人讲糊涂。所以,水平高、开发实力强并不代表能写出好书。当然,反过来说,如果水平很差,当然也不可能写出好书。
在笔者看来,一本能够称得上经典的好书应该是通俗易懂的,对于读者来讲,认真读一遍就应该能够读懂,而读多遍的目的应该是深入理解和加深印象。《C++新经典》正是一本认真读一遍就能读懂的书,书中笔者利用数十年一线开发所积累的丰富经验,配以大量精准到位的演示范例,把难以理解的内容通俗易懂地讲述明白,让读者收获满满。可以毫不夸张地说,这本书完全能够让读者感觉相见恨晚。读懂本书并认真实践书中的范例,至少相当于为读者增加了5年以上C++开发的功力,也就是说,至少为读者节省5年的学习时间。
笔者具有讲课天赋,笔者有信心让一个从未学过C/C++程序开发的读者通过本书的学习成为C/C++开发高手。所以,对于转行到C/C++语言开发程序的读者,完全不用担心看不懂本书。但是,对于学习知识这件事,笔者坚持认为:“扶上马,送一程”,让读者具备扎实的基础以及自我学习的能力是非常重要的。因此,要走得远,飞得高,最终还是要靠自己经年累月的不断努力和磨炼。
翻看本书的目录,读者不难发现本书的优秀和全面。除了C++基本理论知识,书中还详尽介绍了高级模板话题、智能指针、并发与多线程、内存高级话题、STL标准库,以及C++11新标准中万能引用、类型推断、引用折叠、完美转发、萃取技术等,这些知识,是真正成长为C++开发大师必知必会的知识。其实,书中很多内容的讲解已经超越了C++基础语言本身,迈向了更高的层次,让读者不但扎实地掌握基础,更有认知的大幅度提升。同时,书中的每个范例,都经过了笔者的深思熟虑,都会演示不同的知识点,所以每一个范例都重要,都不可错过。
在成书的过程中,笔者参考了大量C++经典著作并尽最大努力通过网络寻找一切对本书的写作有用的资料,尽量不遗漏任何重要的知识,笔者的心愿是通过自己的表达把这些知识更通俗地传授给读者,让读者只花费1/5甚至1/10的精力就能获得相同的知识,让读者能够凭借本书尽早地找到工作,获得一项谋生的本领。对于书中内容,笔者进行了大量资料的参考和整合,付出了数月的时间和极大的心血。在这里,笔者发自内心地感谢诸多C/C++前辈在这个行业中多年的耕耘及对知识的积累和传播的贡献。
C/C++语言博大精深,本书并不是C/C++语言语法大全,事实上,没有任何一本书可以事无巨细、面面俱到地把每个知识点都讲解到。同时,笔者是一个实用主义者,笔者认为,生命有限而学海无涯,相信对于绝大多数人,学习C/C++开发知识,目的是实实在在地赚钱养家,而不是为了搞学术研究。所以,虽然本书中知识覆盖面广,但绝对不是什么内容都往书中放。在C/C++庞大的知识体系中,相当一部分知识是很少用到的,花费大量篇幅去详细阐述无疑是事倍功半,这个时候,笔者丰富的一线开发经验就起到了极大的作用——凭借多年的实战经验,帮助读者甄别最重要的知识,尽量避免让读者浪费大量时间去学习那些很不常用的知识,保证读者在最短的时间内大幅度地提升自身的实力。
本书已经把C/C++语言开发中最常用功能的90%都介绍了,能够满足绝大多数读者日常工作所需,如果偶尔有遗漏的地方,读者完全可以通过自学来弥补。笔者深信,把这么多年工作中的所思、所想、所积累的有用知识点汇集在一本书中,该书的质量将超越绝大多数市面上的C/C++类书。
关于习题集
本书范例众多,因此笔者认为并不需要专门的习题集,或者可以说,这些范例本身就是绝好的习题。虽然笔者认为做大量的习题对实际工作的帮助并不大,但如果读者特别在意学后做题以巩固所学,比如学习了“构造函数”的概念之后,笔者建议,通过搜索引擎搜索“C++构造函数练习”这种关键词,能够搜索到大量相关的习题,通过完成这些习题,就可以验证自己的学习成果。
同时,笔者要指出,这些习题的完成,一般来讲,只代表在C/C++语言使用层面达到了一定的熟练度,具体在实际工作岗位上如何应用这些知识解决问题还需要在工作中去感受和体会。解决实际问题这件事,读者不要把它想得很难,其实它可能非常简单,人们往往都会对自己不熟悉的事物产生一些本能的畏惧,直接面对它,这种畏惧感自然消失。
如果真要做题,笔者建议读者学会整本书后一起做,从而综合地验证自己的学习成果。
阅读进度
不排除有基础和学习速度特别快的读者可以很快把本书的内容阅读完毕并掌握得很好,但通常来讲,笔者建议采取如下的阅读进度:
整本书大概有120节(比如1.1标题算一节),笔者建议读者每周平均学习2节。整本书后半部分内容比前半部分内容学习难度更大、篇幅更多,所以后半部分每节的学习时间要多,但是平均下来,笔者认为每周学习2节还是能够做到的,这意味着整本书大概需要花费400多天的学习时间,如果加快学习进度,读者可以力争在1年之内将本书学完。
在学习过程中,强烈推荐读者跟着笔者一起实践书中的每个范例,验证范例的正确性,实践是深化知识的一个极其重要的过程,这样学习效果将比只用耳朵听和用眼睛看强出3~5倍,千万不要偷懒,既然决定走程序开发这条路,现在的勤奋就是为了让自己以后少一些被动。若干年后,笔者不希望看到当年称自己一声老师的读者顶着生活的压力,还在费尽心力地调试Bug。笔者自己的成长经验是:尽心编程10年后,程序中出现Bug的概率就非常小了,当我达到15年编程经验,往20年跨越的时候,偶尔的小Bug基本都随时发现随时消灭,偶尔出现的问题可以立即解决。读者千万不要以为程序员写出Bug是家常便饭,更不要以改Bug为荣。
本书内容全是重点,建议读者将整本书仔细学完,一节都不要错过。通过这样仔细的学习,本书包含哪些内容,在读者心中就会有一个比较深刻的印象,此时,这本书就可以当作读者的贴身伙伴和工具书了——忘记了哪个知识点,或者想使用哪些编程技巧,随时翻开书查阅。
知识点千万不要死记硬背,随着读者学习知识的增多,会面临着学过的知识很快忘记的情形,这很正常,所以在大多数情况下,我们的头脑里往往只记录一个知识点的大概思路和解决方法的索引(位置),需要解决类似问题的时候能找到这个索引,翻阅资料来解决就非常好。
请记住,一个高级程序员甚至架构师的能力体现不在于记住多少高级复杂的代码(在笔者看来,能记住的复杂代码越多,往往意味着当下真正所掌握到的知识还太少),而在于把控项目的综合能力、解决问题时能够把所有细节、意外全部想到的缜密逻辑思维,而且实际动起手时很少犯错。这些,才是一个程序员的大成智慧,才是需要数年乃至数十年才能练就的。
另外,对于一个高级程序员来讲,一个知识点不会时,可以绕道而行或者研究明白这个知识点再使用,但绝不要滥用、瞎用导致产生Bug或使自己掉坑里去而影响整个团队甚至公司的运作。
运行环境
本书的范例全部在Windows下的Visual Studio 2019集成开发环境中调试通过。之所以选择这个平台,是因为它对开发者相当友好,开发和调试程序特别方便,尤其对初学者,极大降低了学习难度。
书中也详细阐述了在Windows下安装Visual Studio 2019的过程。因为书中讲解的内容涉及C++11及更新的C++标准语法,所以如果是在Windows操作系统下进行程序开发,建议读者使用Visual Studio集成开发环境并保证版本不低于Visual Studio 2017。
对于在Linux下从事C/C++开发的读者,只要C/C++编译器支持C++11及更新的C++标准语法,就完全没有问题,因为本书针对的是C/C++语言,所以本书中99.9%的范例都可以跨操作系统平台运行。
资料获取
本书有完整的配套学习资料(源码),读者可以免费获取。获取方法如下。
(1)查找并关注“程序员速成”微信公众号。
(2)在微信公众号中,输入“新经典”三个字,就可以获取配套学习资料下载链接。
读者评论
笔者在出版本书之前,有数月的时间,通过网络推出课程以教授C/C++开发知识,课程推出之后,收到了太多好评。这里摘录一部分评论:
· 现在别人追剧,我就追王老师的课,确实高校一些老师讲的C++跟王老师讲的根本不在一个水平线。
· 学历看学校,本领学王老师。
· 听王老师的课感觉自己智商变高了,原来自己看书看不懂的内容听王老师的课后发现自己能懂了。
· 从4月底无意中发现这门课程以来,历时半月,加上假期,终于把所有课程学完了,真正是欲罢不能,讲得实在是太棒了。条理清晰,例证丰富,最重要是把各种使用中将遇到的陷阱都讲得很到位。而且,本课程涵盖了C++系列版本的主要知识点,帮我完整梳理了C++的知识,真是感激不尽。最后一章的总结也非常精准到位,每一句都是金玉良言,饱含工作经验和人生体会。再次表示感谢,期待王老师的实战课程。谨祝王老师身体健康,工作顺利。
· 翔实、实用的举例,不多话,不废话。
· 非常好,老师绝对是经验丰富的大牛,讲课清楚并且逻辑强,王老师的课可以说是我听过的最好的C++课程了。
· 目前看过的所有C++课中,含金量最高的。相见恨晚,感谢老师。
· C++工作14年的老菜鸟来学艺,希望能得到质的飞跃!技术这东西不服牛人不行,有些地方自己自学不只是多走弯路的事儿,是根本入不了道。
· 感谢王老师,我之前买过其他C++课程,但是深度和您的课程无法相比。相信您的课程能改变我的命运,非常感谢王老师。我要好好努力。
· 老师我现在看了你的部分课程,觉得你讲得很细很好,你会出一本书把你讲的内容写上去吗?很期待啊,看老师的课程的进展快多了,很感谢老师出那么好的课程,帮我省去不少时间。
· 老师的C++讲得实在太好了,看了才体会到这是下了大功夫做的教程,比我之前看的教程高了一个档次。
· 我好喜欢老师讲的课啊,通俗易懂有意思,比××教育强太多了。
· 老师,真的很喜欢您的课程,能再多出几期课程吗?我还会买的。
· 谢谢老师,说真的,老师讲得真好,19岁开始学编程,先专升本再考研,2018年毕业。老师,是C++讲得很好的老师,尽管我学过十几种编程语言,但是跟着老师学,很轻松。老师讲得真棒。现在从事AI、图像处理的工作,公司用Python做的demo做好了,就是速度跟不上,看老师讲的C++,有种想哭的感觉,为什么不是在几年前看到这个课程,现在早就稳稳地掌握C++了,有点功利。感谢老师,分享自己的工作经验。
· 老师,你什么时候可以出一门有关C或C++的数据结构和算法的课程呢?很期待。自从听你的课!就已经是你的铁杆粉丝了!
· 真的讲得很仔细,对于不喜欢看书的人来说,王老师的课是福利,两年前出这个课程,我看我会飘的。
· 老师,在我上大学的时候怎么没出这个课程呢?
· 通俗易懂,幽默风趣,讲课方式独具一格。
· 很赞,很多平时没有注意到的细节都讲到了。
· 跟着老师的讲课做完的笔记,就是活字典啊,哪里忘了搜哪里。
· 不愧是老“司机”,用通俗易懂的方式讲解每一个知识点,简直就是讲活了书本啊。
· 老师讲得非常好,都是干货,没有废话,逻辑清楚,而且一听就是肚子里有东西。边讲,边写代码,更有助于学生理解和吸收知识。
· 好的老师,万事俱备,剩下的就剩你自己学不学了。
· 老师的课是我见过的C++讲得很好的,我非常开心也非常荣幸能买到老师的课程,等我学完老师所有课程后,如果老师不反对,我想拜老师为师,交学费给您,以后工作中有不懂的问题,多向您请教。
语言学习体会
学好一门计算机语言,有三个最关键的要素:
(1)有一本能够领着大家入门的好书,好书应该是出自好老师之手,而一个具有丰富的实战经验和讲课天赋的好老师,一定能让大家不踩坑,不浪费时间,至少眼下不必去掌握各种额外知识,节约大量学习时间,大幅度地加快学习速度。
(2)不停地努力是根本,也就是不断地学习,不断地实践,多看优秀的人写的代码,并且要自己多动手参与实际项目写大量代码。连续写10年代码,你的代码中就会很少出现Bug,连续开发项目15年,你大概就能掌握用最高的效率解决各种开发问题,连续开发20年基本就达到大神的级别了。大家可能觉得这个时间太长了,笔者其实蛮希望大家打破这个魔咒,用更短的时间进阶到大神级,有这个目标的同学就更要跟着笔者一起努力了。
(3)举一反三,任何书都不可能面面俱到地讲解每一个细节,否则会浪费大家很多时间,因为绝大部分知识在实际工作中是用不到的,所以大家一定要积极自学,善用搜索引擎,就可以很轻松地掌握很多新知识。
致谢
二十多年前,笔者写过一本《CrystalReports水晶报表设计与开发实务》,这本书的写作实在是太辛苦,每天大概要写到凌晨3点才能休息,熬了3个多月。书完成之后,整个人瘦了好几圈。
虽然书有一定的销量,但是跟付出感觉不成比例。所以,从那时候开始,笔者就暗下决心,从此以后再也不写书了。
“人算不如天算”,2018年下半年,笔者通过网络,逐步发布一些C/C++类网络课程,让人意外的是,这些课程获得了学员极好的口碑,大有超越市面绝大多数C/C++类课程之势,在这个时候,清华大学出版社电子信息教材事业部主任、首席策划盛东亮先生找到笔者,希望笔者能够写一本优质的C/C++类图书。
因为多年前出书的心理阴影,笔者当时本能地拒绝了,但在笔者的心里却从此埋下了写书的种子。
几个月之后,笔者终于想通了写C/C++类图书这件事,感觉有两点好处:
(1)帮助更多的读者迈入C/C++之门,也是为社会尽一点自己的微薄之力,做一个对社会有用的人。
(2)扩大自身的知名度,增加收入,毕竟笔者也需要养家,通过自己的劳动赚取收入,这是光荣的。
当笔者把出书的想法说给盛东亮先生听的时候,他非常高兴并与笔者做了深入的沟通,我们二人年纪相仿,聊得很投机,在写书这件事情上观点也非常一致——希望这是一本高质量的、经典的C++图书,是一本可以摆在书架上10年甚至20年的书,如果仅让读者选那么2~3本最好的C++图书时,希望本书是其中之一。
在本书写作、出版的交流过程中,盛东亮先生给予了笔者相当多的支持与鼓励,甚至可以说,如果不是盛东亮先生当初的接洽和后续顺畅愉快的交流,如果不是许多实际的工作都能在最短的时间敲定并逐一落实,这本书也许根本不会出现在读者面前。所以,这份感谢,笔者要送给你——盛东亮先生。
笔者另外一个要感谢的人是清华大学出版社的资深编辑钟志芳老师,在本书写作、出版的过程中,因笔者对出版社的体例格式比较陌生,对写书过程中许多书面用语把握得不够精准,在书稿中出现了不少的格式问题和用词问题,钟老师通过在文档中加入极细致的批注给予了相当专业的指导,即便苛刻的格式要求让笔者心生恐惧并多次抱怨,钟老师都能够宽容理解。所以,这份感谢,笔者要送给你——钟志芳老师。
最后
本书后记“IT职业发展的未来之路”,有笔者已经过半的人生——走过了24年开发之路后留下的一些人生感悟,强烈推荐读者率先阅读。
C++知识体系庞杂,虽然笔者非常尽心尽力,但限于水平,书中疏漏在所难免,恳请各位读者不吝指教。
王健伟
2020年5月