C加加学习之路 1——开始
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——开始的更多相关文章
- jQuery延迟加载(懒加载)插件 – jquery.lazyload.js-Web前端(W3Cways.com) - Web前端学习之路
Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...
- .Net基础篇_学习笔记_第四天_加加减减
using System.Linq; using System.Text; using System.Threading.Tasks; namespace 第四天_加加减减 { class Progr ...
- 应用程序Cache对象到高性能Memcached学习之路
来源:微信公众号CodeL 以下是个人学习之路的简单分享,不足之处欢迎大神们批评指正! 在网站开发的初期,我们没有考虑更多的东西,也没有对缓存进行系统的设计,而是直接使用了应用程序缓存对象Cache, ...
- Webwork 学习之路【03】核心类 ServletDispatcher 的初始化
1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...
- spring源码学习之路---深入AOP(终)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章和各位一起看了一下sp ...
- python学习之路-day2-pyth基础2
一. 模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...
- 学习之路三十九:新手学习 - Windows API
来到了新公司,一开始就要做个程序去获取另外一个程序里的数据,哇,挑战性很大. 经过两周的学习,终于搞定,主要还是对Windows API有了更多的了解. 文中所有的消息常量,API,结构体都整理出来了 ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- OpenGL学习之路(一)
1 引子 虽然是计算机科班出身,但从小对几何方面的东西就不太感冒,空间想象能力也较差,所以从本科到研究生,基本没接触过<计算机图形学>.为什么说基本没学过呢?因为好奇(尤其是惊叹于三维游戏 ...
- 阿里封神谈hadoop学习之路
阿里封神谈hadoop学习之路 封神 2016-04-14 16:03:51 浏览3283 评论3 发表于: 阿里云E-MapReduce >> 开源大数据周刊 hadoop 学生 s ...
随机推荐
- 【转】在Linux下搭建Git服务器
在 Linux 下搭建 Git 服务器 环境: 服务器 CentOS6.6 + git(version 1.7.1)客户端 Windows10 + git(version 2.8.4.windows. ...
- Linux常用命令大全(全全全!!!)
Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短 ...
- CDH6.3.0 - Cloudera Enterprise 6 Release Guide 安装准备篇
一.安装之前 Cloudera管理器的存储空间规划 ClouderaManager跟踪许多后台流程中的服务.作业和应用程序的指标.所有这些指标都需要存储.根据组织的大小,此存储可以是本地的或远程的,基 ...
- js数组的增删改查
array 数组的增删改: push 从数组后面推入一个元素或多个元素 var arr = [1,2,3]; // 返回:修改后数组的长度 arr.push(4,5,6); pop 删除数组最后一 ...
- PSSH工具
目录 PSSH工具 参考 PSSH工具的介绍 PSSH工具的使用 PSSH工具
- python——成语接龙小游戏
小试牛刀的简易成语接龙. 思路—— 1.网上下载成语字典的txt版本 2.通过python进行处理得到格式化的成语,并整理成字典(python字典查找速度快) 3.python程序,查找 用户输入的最 ...
- MySQL8身份验证问题解决
开新项目.使用MySQL8,在经历过B级别的网速下载后,终于安装好了MySQL,虽然在终端上是可以直接登录的. 但是我使用Navicat就无法访问了,提示什么登录失败,还有乱码. 搜索了一下,发现是M ...
- Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用
多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程. 一.ThreadPoolTaskExecutor ...
- 两台CentOS6.5 在不同机器上互联
准备工作 1.安装vmware及虚拟机centos6.5: 2.将安装好的centos6.5复制一份,在另一台机器上拷贝. 要进行不同机器上虚拟机的互相通信,需要用桥接模式进行互联.如下图,对vmwa ...
- liunx下安装MySQL
1.安装依赖包:yum -y install gcc gcc-c++ ncurses ncurses-devel cmake bisonyum install -y perl-Module-Insta ...