C++学习指南(送2本C++之父的书)

程序视界2019-06-07 00:56:22

C++ 是一门古老而复杂的语言,绝不是一门可以速成的语言,学习它需要有意识的刻意练习和长时间的持续不断的磨练。而大多数人不太能耐得住寂寞,喜欢速成,所以像《 21 天学通 C++ 》这种书就比较受欢迎,卖得很好。通常那些干了一两年就说自己熟悉(甚至精通) C++ 的程序员只能算是轻浮的。

Linux 之父 Linus 就曾说:“ C++ 是一门很恐怖的语言,而比它更恐怖的是很多不合格的程序员在使用着它”。

所以,要学习 C++ 并打算将其作为自己的首选编程语言,就要做好吃十年寒窗苦的准备,要耐得住寂寞,经得起考验,最终才能举重若轻,有所成就。

也正因为此,很多人不大愿意学习 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++ 语言

  • 系统调用

  • 第三方类库

简要来说说吧。

>> 1. IDE 选择

我比较喜欢的选择是 Qt Creator(注意下载 Qt SDK 时选择 mingw 版本,其中自带 gcc 编译工具链)。而且这个选择是跨平台的,也可以在 Linux 、 Mac OS X上使用。

Windows 下还有一个不错的选择—— VS 2013或更高版本,对 C++11 支持还算不错(不如 gcc )。

>> 2. C++ 语言的学习

结合 C++ 的知识图谱,对 C++ 语言的学习,建议顺序是这样的:

  1. 基础语言

  2. 类与面向对象

  3. 输入输出

  4. 字符串处理(类库和正则表达式)

  5. 容器类库

  6. 泛型算法

  7. 多线程

  8. 原子操作

大概过一下知识点,具体可以参考知识图谱。孟岩有一篇名为“快速掌握一个语言最常用的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 ,就可以完成线程间的资源同步与保护,棒极了。

>> 3. 系统调用

C++ 语言本身只能完成独立于系统的工作,实际的产品往往是与系统紧密相关的,因此必须熟悉系统调用。常见的系统调用,有 socket ,窗口管理系统(GUI)、文件操作等等。推荐我认为经典的几本书,可以帮助我们系统学习。

Windows 下推荐两本书,《Windows 程序设计》和《Windows 核心编程》,应用开发的话,基本有这两本就够了。Unix/Linux下也推荐两本书,《Unix 高级环境编程》和《Unix 网络编程卷1,套接字》、《Unix网络编程卷2,进程间通信》。前面我们提到 socket ,其实是属于网络编程的一部分,《Unix 网络编程》讲到的东西,Windows 和 Unix/Linux 都能用。

>> 4. 第三方库类库

开始学习一门语言时,造轮子可以让我们快速进步,然而一旦你入了门,开始做实际的产品开发时,在稳定性、可维护性和交付期的压力下,就需要合理的利用第三方类库。

围绕 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型人才”,里面有详细介绍和实例):

  1. 基础开发,主要是了解API、基于API完成应用

  2. 熟悉内核及原理,主要是了解框架的设计原理,阅读源码,洞悉内在机理

  3. 优化框架,主要是针对框架的已有功能的不足进行完善、优化,或者使用框架提供的机制扩展框架功能,或者对框架进行定制,让它适合特定情境

有些类库功能非常丰富,比如 Qt 、 MFC 、 Cocos2d-x 等,单单一个类库就可以让人钻研几个月到几年,实际使用时,应当根据实际工作需要,先解决眼前的开发任务,然后设定目标、合理利用时间,沿着上面三个阶段来深入学习,培育自己的竞争力。

总结

C++ 语言是一门复杂的语言,学习难度较高,学习时应当快速掌握基本知识,然后不断在项目中练习,以点带面扩展学习范围,闲暇时间有计划的在深度和广度两方面持续学习和积累。一旦形成了这样的良性循环,就可以熟练掌握 C++ 语言及相关的类库,不断精进。




相关阅读

  • 10157:两招让你成为牛X的T型人才

  • 10071:怎样新学一门技术

  • 10059:给新程序员的10条建议

阅读原文,到分答问我,我们一起赚冰棍消消暑~


>> 福利,送书


这次送的书是C++ 之父 Bjarne Stroustrup 亲自撰写的 《The C++ Programming Language (4th Edition)》,上下两册哦送书规则(必须同时满足哦):

  1. 本人在本文后留言

  2. 邀请朋友在本文后按照【支持-你的昵称】的格式留言,比如你的昵称是叶良辰,别人要支持你,需要留言【支持-叶良辰】。截止7月9日早上7点,支持者最多且超过15的两位朋友获得赠书。支持者最多的,获得上册(1到3部分),次多的,获得下册(第4部分)。


注意,我会在7月9日发文时公布活动结果。获得赠书的朋友到时请加我微信a316576715,提供快递地址和联系方式,我会快递书给你。


号外:凡是有人支持的朋友,都会获得我收藏的6本经典电子书,加我微信留下邮箱,活动结束后统一发邮件。