C++是一门古老而复杂的语言,绝不是一门可以速成的语言,学习它需要有意识的刻意练习和长时间的持续不断的磨练。而大多数人不太能耐得住寂寞,喜欢速成,所以像《21天学通C++》这种书就比较受欢迎,卖得很好。通常那些干了一两年就说自己熟悉(甚至精通) C++的程序员只能算是轻浮的。
Linux之父Linus就曾说:“C++是一门很恐怖的语言,而比它更恐怖的是很多不合格的程序员在使用着它”。
所以,要学习C++并打算将其作为自己的首选编程语言,就要做好吃十年寒窗苦的准备,要耐得住寂寞,经得起考验,最终才能举重若轻,有所成就。
也正因为此,很多人不大愿意学习C++,还会找一些理由,比如C++没落了、应用前景不广泛了作为理由。
其实C++仍然在不断发展,生命力依然旺盛,有大量的行业和不计其数的应用正在源源不断地引入C++语言,它的前景依然看好。
C++语言的现状
2015年TIOBE的编程语言排行榜,C++位列第三。
Stack Overflow 2015年的开发者调查结果中有一项是“最受欢迎的技术”,C++排名第七,而在最被爱的语言中,C++11排名第二(仅次于Swift)。
各种数据表明,C++语言依然广受欢迎和热爱。这就是它的现状。
有机构通过分析与C++语言相关的招聘信息得出的结果,使用C++语言的前三个行业是:金融、银行和游戏。接下来是Front Office、通信、电子、投行、市场、制造业、零售业。
如果你想成为开发工程师并喜欢上述行业,学习C++是不错的选择。
现在很多人还在使用C++98(这个标准距今20年了),而C++标准委员会已经在准备C++17。较新的标准C++11正在普及,主流的编译器如GCC、VS、Clang的最新版本也都较为完整的支持了C++11,加上追求卓越的C++程序员主动在产品开发中引入C++11, C++的潜能得到了很大的发挥。
如何学习C++语言
我始终认为要系统学习一门语言,最好是跟着一本书边学边练习,快速掌握这门语言的语法和基础特性,然后就可以找小项目练手,练一练再回头来看书,往复循环,不断加深理解,慢慢就能掌握到位。
学习C++语言最好的教程,是C++之父Bjarne Stroustrup亲自撰写的《The C++ Programming Language (4th Edition)》,支持C++11,机械工业出版社有英文原版,分两本,第一本讲1~3部分,C++语言的基础内容,第二本是专讲第4部分,C++标准库。
另外还有两本书,也是学习C++语言的很好选择,《C++ Primer Plus(6th Edition)》和《The C++ Standard Library: A Tutorial and Reference (2nd Edition)》,也都支持C++11 。
需要注意的是,选择(设计)练习项目时,最好能结合当前的学习进度,让自己能够完成,收获正向反馈,激励自己不断前进。只有持续的正向激励,才能让一个人顺畅的完成C++语言的学习。所以,一系列良好的练习项目很重要,既不能难度太低(没有成就感),也不可难度太高(会有挫败感),稍稍付出努力就能完成是最理想的。
一旦完成了基础语言的学习和一系列练习项目,对语言有了一些感知,就可以参与到复杂度较大的项目中来磨练自己。最好是能结合自己的工作与生活,做一些自己感兴趣的项目,兴趣是最好的老师和最强的动力,如果做的东西感兴趣,就很容易钻进去,学下来。
接下来我们聊聊成为一个能实战的C++程序员都会经历的那些事儿:
- IDE选择
- C++语言
- 系统调用
- 第三方类库
简要来说说吧。
IDE选择
我比较喜欢的选择是Qt Creator(注意下载Qt SDK时选择mingw版本,其中自带gcc编译工具链)。而且这个选择是跨平台的,也可以在Linux、Mac OS X上使用。
Windows下还有一个不错的选择—— VS 2013或更高版本,对C++11支持还算不错(不如 gcc)。
C++语言的学习
结合C++的知识图谱,对C++语言的学习,建议顺序是这样的:
- 基础语言
- 类与面向对象
- 输入输出
- 字符串处理(类库和正则表达式)
- 容器类库
- 泛型算法
- 多线程
- 原子操作
大概过一下知识点,具体可以参考知识图谱。孟岩有一篇名为“快速掌握一个语言最常用的50%”的文章,有很强的参考意义,值得一读。对于C++语言来讲,快速熟悉1、2、3、4、5这几部分,就可以动手做一些好玩的小程序了。
基础语言
这部分要了解C++语言的基本数据类型,比如int、char、bool、unsigned int、long、float、double、long long、enum、union等等。能理解指针、引用等概念。
掌握基本的编程语法,比如表达式、运算符、函数等。关于函数,多说两句,C++里有函数对象,在标准库里广泛应用,需要了解;另外C++11支持lambda表达式(匿名函数),威力强大,建议学习。不过这两点可以稍往后放放。
主要的语言结构,比如有if-else、for、switch-case、while、do-while等。
类与面向对象
了解class的概念,了解继承、虚函数、重载、重写、多态、纯虚函数、多重继承等概念,它们是面向对象编程在语言层面的基础。
面向对象更重要的是思想,很多C系程序员一直都在用类来写过程式程序。
输入输出
要做编程练习,了解基本的输入输出操作是必须的。
C++里输入输出分C和C++两部分。C风格的printf系列函数、FILE、fopen、fread、fwrite等等或C++风格的istream、ostream、iostream、ifstream、ofstream、fstream等都可以完成输入输出操作 。
字符串处理
字符串处理是我们编程时使用频率最高的,C++里有C风格的字符串库,比如strcmp、strcpy、strstr、strchr等函数,也有更为方便和智能的字符串类,如string、wstring等,看看API,练习一下就可以掌握。
C++11为了更方便字符串处理,提供了正则表达式类库,比如regex类,regex_match、regex_search、regex_replace等方法,以及regex_iterator这个迭代器类。用起来非常方便,功能也很强大。
容器类库
常见的容器,如vector、list、map、set、queue、stack、deque、multimap、multiset等,基本可以满足日常的开发需要。C++11引入了定长数组array,具有C风格数据的特性,更有C++的便利操作;还有unordered_set、unordered_map等新的非排序容器,可以适应不需要排序的场景。
泛型编程
C++里的泛型算法库,用起来非常方便,比如find、find_if、count、count_if、search、search_n、copy、copy_n、copy_if、sort、partial_sort、binary_search、stable_sort等等,功能非常强大。这些算法多数基于容器和迭代器,忽略具体数据类型,使用起来稍稍有些难度,不过掌握了容器、模板、迭代器等内容后,就可以很快应用起来。
多线程和原子操作
这些都是C++11引入的类库,从此以后,C++语言本身有了并发编程的能力,非常酷。一个 thread类,三五行代码,就可以启动一个线程,简单的使用mutex和lock_guard ,就可以完成线程间的资源同步与保护,棒极了。
系统调用
C++语言本身只能完成独立于系统的工作,实际的产品往往是与系统紧密相关的,因此必须熟悉系统调用。常见的系统调用,有socket,窗口管理系统(GUI)、文件操作等等。推荐我认为经典的几本书,可以帮助我们系统学习。
Windows下推荐两本书,《Windows 程序设计》和《Windows 核心编程》,应用开发的话,基本有这两本就够了。Unix/Linux下也推荐两本书,《Unix 高级环境编程》和《Unix 网络编程卷1,套接字》、《Unix网络编程卷2,进程间通信》。前面我们提到socket,其实是属于网络编程的一部分,《Unix网络编程》讲到的东西,Windows和Unix/Linux都能用。
第三方库类库
开始学习一门语言时,造轮子可以让我们快速进步,然而一旦你入了门,开始做实际的产品开发时,在稳定性、可维护性和交付期的压力下,就需要合理的利用第三方类库。
围绕C++语言的第三方类库非常多,简单列一下,仅供参考。
- GUI:Qt、MFC、WTL、wxWidgets、DirectUI;
- 网络:ACE、libevent、libuv、libev、 ASIO;
- 多媒体与游戏:Skia、Cairo、SDL、AV3D、OGRE 3D、Cocos2d-x、ffmpeg、OpenH264、VLC、CxImage、CImg;
- XML:Xerces-C++、CMarkup、libxml++、TinyXML;
- 科学计算:MTL、POOMA、Blitz++、CGAL。
学习和使用第三方类库,又分三个阶段(我的订阅号“程序视界”发布过一篇名为“两招让你成为牛X的T型人才”,里面有详细介绍和实例):
- 基础开发,主要是了解API、基于API完成应用。
- 熟悉内核及原理,主要是了解框架的设计原理,阅读源码,洞悉内在机理。
- 优化框架,主要是针对框架的已有功能的不足进行完善、优化,或者使用框架提供的机制扩展框架功能,或者对框架进行定制,让它适合特定情境。
有些类库功能非常丰富,比如Qt、MFC、Cocos2d-x等,单单一个类库就可以让人钻研几个月到几年,实际使用时,应当根据实际工作需要,先解决眼前的开发任务,然后设定目标、合理利用时间,沿着上面三个阶段来深入学习,培育自己的竞争力。
总结
C++语言是一门复杂的语言,学习难度较高,学习时应当快速掌握基本知识,然后不断在项目中练习,以点带面扩展学习范围,闲暇时间有计划的在深度和广度两方面持续学习和积累。一旦形成了这样的良性循环,就可以熟练掌握C++语言及相关的类库,不断精进。
更多内容请关注C++知识库。该知识库包含了专家精心绘制的C++知识图谱,及由特邀编辑(领域专家)从海量数据中层层筛选出的精华内容和资源(学习视频、实践Demo、图书)。扫描下方二维码,立即查看C++知识库精彩内容。