谈谈我对C++的认识

点击打开链接

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++语言及相关的类库,不断精进。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值