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。

学习和使用第三方类库,又分三个阶段(详见下一章):

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

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

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

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

总结

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

C加加学习之路 1——开始的更多相关文章

  1. jQuery延迟加载(懒加载)插件 – jquery.lazyload.js-Web前端(W3Cways.com) - Web前端学习之路

    Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...

  2. .Net基础篇_学习笔记_第四天_加加减减

    using System.Linq; using System.Text; using System.Threading.Tasks; namespace 第四天_加加减减 { class Progr ...

  3. 应用程序Cache对象到高性能Memcached学习之路

    来源:微信公众号CodeL 以下是个人学习之路的简单分享,不足之处欢迎大神们批评指正! 在网站开发的初期,我们没有考虑更多的东西,也没有对缓存进行系统的设计,而是直接使用了应用程序缓存对象Cache, ...

  4. Webwork 学习之路【03】核心类 ServletDispatcher 的初始化

    1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...

  5. spring源码学习之路---深入AOP(终)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章和各位一起看了一下sp ...

  6. python学习之路-day2-pyth基础2

    一.        模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...

  7. 学习之路三十九:新手学习 - Windows API

    来到了新公司,一开始就要做个程序去获取另外一个程序里的数据,哇,挑战性很大. 经过两周的学习,终于搞定,主要还是对Windows API有了更多的了解. 文中所有的消息常量,API,结构体都整理出来了 ...

  8. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. OpenGL学习之路(一)

    1 引子 虽然是计算机科班出身,但从小对几何方面的东西就不太感冒,空间想象能力也较差,所以从本科到研究生,基本没接触过<计算机图形学>.为什么说基本没学过呢?因为好奇(尤其是惊叹于三维游戏 ...

  10. 阿里封神谈hadoop学习之路

    阿里封神谈hadoop学习之路   封神 2016-04-14 16:03:51 浏览3283 评论3 发表于: 阿里云E-MapReduce >> 开源大数据周刊 hadoop 学生 s ...

随机推荐

  1. RxSwift 中的调度器

    与 ReactiveCocoa 相比,Rx 的一大优势就是更丰富的并发模型.提到并发,就不得不提多线程.在 RxSwift 中,与线程对应的概念就是调度器,本文就调度器做些介绍,包括并发调度器.串行调 ...

  2. Audio Bit Depth Super-Resolution with Neural Networks

    Audio Bit Depth Super-Resolution with Neural Networks 作者:Thomas Liu.Taylor Lundy.William Qi 摘要 Audio ...

  3. CentOS 7上编写自定义系统审计规则

    1)简介 Linux审计系统创建审计跟踪,这是一种跟踪系统上各种信息的方法.它可以记录大量数据,如事件类型,日期和时间,用户ID,系统调用,进程,使用的文件,SELinux上下文和敏感度级别.它可以跟 ...

  4. Janus安装教程,ubuntu18.04系统

    Janus安装教程,ubuntu18.04系统     本文介绍Jansu如何安装,操作系统为Ubuntu 18.04.    (1)安装git 执行命令:“sudo apt-get install ...

  5. JVM 调优 - jhat

    Java命令学习系列(五)——jhat 2016-01-21 分类:Java 阅读(8708) 评论(3) 阿里大牛珍藏架构资料,点击链接免费获取 jhat(Java Heap Analysis To ...

  6. 命名对象继承2-验证Open*命名对象安全属性的传递

    接上一篇 这次是验证Open*(本文使用OpenMutex函数)的命名对象在继承中安全属性的传递 SECURITY_ATTRIBUTES sa; //设置句柄安全性 sa.nLength = size ...

  7. WordPress新用户注册时提示“您的密码重设链接无效”

    在使用Wordpress密码找回功能及新用户注册邮件中的重置密码链接时,Wordpress提示“您的密码重设链接无效,请在下方请求新链接.”.“该key似乎无效”.“invalid key”. 这个其 ...

  8. windows下查看进程及结束进程命令

    windows下查看进程及结束进程命令 1)查看占用8080端口的进程号 >netstat –aon | findstr “8080” 结果:TCP    0.0.0.0:8080        ...

  9. Dockerfile 构建镜像

    一.使用dockerfile构建镜像 基本结构: a.设置基础镜像 当前镜像继承于的基础镜像 FROM centos:latest  b.设置维护者信息 没有固定格式  c.设置需要添加到容器中的文件 ...

  10. spring-boot-devtools 热部署

    一.简单介绍 spring-boot-devtools是一个为开发者服务的一个模块,其中最重要的功能就是修改代码后自动启动springboot服务,速度比手动停止后再启动要快,节省出来的并不是手工操作 ...