业余时间里逐渐开始将学习重点移到c++领域,之前虽然读书时用MFC做过gis,工作中也用纯c++做过etl,但始终不属于产品级的正规军开发,还是属于游击性质的小打小闹,涉水不深。
重新拿起c++,基础知识一点点看起来这还不是什么大问题,毕竟毕业之前就读完了深入c++对象模型,effective系列,c++ language programming这些书。
工作了几年之后,回头来重新拾起c++,另有一番体会:
1.语言远远不是c++的全部
我们其实无需选择c++众多晦涩的语法和奇淫技巧,单以开发应用系统来说,在基础的语言层面看完类似c++ language programming或者prime c++已经足够,剩下的只需要了解如何选择和使用stl库和极少的boost库,经过这个阶段,基本上可以做些单机上的小程序了。
之后可以慢慢学习各种图形库,网络库,gui框架,这些是构建大型系统的重点,尤其是图形库可以多花些功夫,对于科学计算和企业应用,熟悉掌握一两个图形库做可视化可以将系统的可用性提高一大截。而网络库相对来说其实花样不多,现存的很多实现大都是ACE设计模式的变种或是跨语言版本,ACE的3本书,目前只能在淘宝上买到复印版了。
Gui库是比较难选择的部分,目前来看,花时间在QT上面学习是比较保险的,跨平台很诱人,不过因为还完全没接触过QT,所以还是倾向MFC,例子文档都很完备,以前也做过。MSDN上面的很多demo很容易拼出一个非常像样的client应用。wxWidget看过段时间,感觉和MFC很像,被MFC和QT夹在中间,目前来看还太不具备学习价值。另一个比较重要的原因是skia对VS支持很好,在window上用VS编译skia的库和demo非常容易,这样在window平台上,用户界面和图形化都能用VS很好的解决,再去追求gui跨平台意义也就不大了,除非想搞移动领域的东西。
2.c++异常要谨慎对待
它的使用比java异常更复杂,而其机制的实现,在不同OS和不同编译器上差异很大,也没有提供那么完善的trace机制,这是要自己花功夫解决的问题。
看过不少blog的观点是,尽量不要用c++的excpetion,我还要多实践来验证这些观点。
3.工具链的合理使用可能比语言使用更重要
工作几年,语言已经不会是门槛,但工具链的使用却会成为使用这门语言的门槛,尤其是c++。
在不同平台c++的工具链大相径庭,相比Java,学习c++的工具链的使用显然重要很多。Java通过IDE和开发插件,屏蔽了很多对工具链的使用,也惯坏了开发者。
刚进入c++领域的java开发者通常会很不适应,编译一个hello world都要花上半天找资料查命令。
而随着使用的工具和库逐渐增多,还会遇到很多编译、链接冲突问题。在解决这些问题的过程中,会逐渐需要去学习工具链的各种细微用法以及链接、编译和脚本知识。
这些部分都是学习c++必要的潜在成本,而且比较头疼的是,通常这些部分还没有系统性的教程,网上资料也都非常零碎,还有不少误导性。
根据我的经历,这些潜在的学习成本其实会高于学习c++本身所花费的时间,工具链的使用技能是需要时间来沉淀的能力。
windbg,gdb是必须掌握的两大工具,也是工具链中最需要花时间学习的部分,而学习它的使用又必须结合调试知识、计算机原理还有一些语言规范的理解,这是将应用、语言、抽象层次硬件这几类知识穿起来的综合环节。
4.要学会使用编辑器
不管是目前依赖VS还是Eclipse,都应该开始强迫自己学习vim或者emacs。
这不是信仰或者装的问题,当需要在不同语言脚本间、不同系统间切换,这些编辑器能大幅提高你的效率,减少你的不适应。并且这些编辑器的设计的确是以编辑为主要目的,花些时间学会配置和习惯他们是项高收益的长远投资。
更重要的是,这些工具的使用需要你频繁和那些工具链直接打交道,而不像在VS或者eclipse上,IDE已经跟你打点了一切。
不要轻视这点,认为是这是自找麻烦。工具链的灵活使用我认为是c++开发里面最重要的内容之一,并且如果你不能很好的脱离IDE来运用那些工具链,那么也会很难构建、定制很多重要的库,因为往往这些库都只提供那些支持工具链的编译脚本,而不会提供支持某个IDE的project文件。
5.抓住算法、信息论和数学作为核心
现在使用c++的目的当然不是为了单纯的crud式的单纯企业应用,它的优势在于使用形形色色的图形库以及那些阳春白雪的学术性质很强的工程库以及和Matlab结合的天然优势。
算法、信息论和数学的理解才是一个计算机从业者的核心竞争力,任何高端的工程问题最终都会在这些领域交汇。
尽量尝试用数学的方式来思考现实世界的问题会是一个好习惯,我们可能会在将来极大的受益于此。
分享到:
相关推荐
C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++
在IT领域,图像处理是至关重要的一环,而“C++图像重采样构造影像金字塔”这一主题涉及到几个关键概念和技术。首先,让我们深入理解这些概念。 **图像重采样**是指改变图像的分辨率,即调整图像像素的数量。这通常...
本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流...
c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏...
c++编程-人生重开模拟器
《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和...
《C++编程实例100篇》是一本深入浅出的C++编程教程,它以实践为主导,通过丰富的实例帮助学习者掌握C++语言的基础和核心概念。这本书的每个实例都精心设计,旨在帮助初学者和有经验的开发者巩固和提升C++编程技能。 ...
4. **C++类库大全.chm**:这个文件可能是对各种C++类库的综合概述,可能包括STL之外的第三方库,如Boost、Qt、wxWidgets等,以及一些特定领域的库,如图形处理、数学计算、数据库连接等,对于扩展C++的功能和应用...
21天学通C++(第五版) vs2008程序打包 深入浅出MFC 浙大教材C++达内 C++ 华为C++培训资料 visual c++_MFC 资源内容: visual c++_MFC 达内 C++ C++课件.ppt c++源码 .rar Core C++ Programming_new.ppt Core C++ ...
### C++并发编程实践 #### 一、简介与并发编程基础 《C++并发编程实践》这本书由Anthony Williams编写,是一本深入讲解C++多线程编程技术的专业书籍。本书旨在帮助读者掌握C++中的并发编程技巧,并通过大量的示例...
这是我心仪已久的一本书我相信很多...C++语言这是我翻译过程中最为真切的体会它纠正了我过去对于C++语言的一些误解虽 然我从1993 年开始就一直在使用C++ 但是直到阅读了这本书之后我才从真正意义上全面 地认识了C++语言
通常,演示版本可能有一些限制,如转换文件的数量、大小或输出代码的完整度,鼓励用户购买完整版以解锁全部功能。 使用这样的工具时,开发者需要注意的是,虽然自动转换可以节省大量时间,但结果代码可能需要人工...
【标题】:“C++各种小游戏(我们老师的)” 在C++编程领域,开发小游戏是一种非常有效的学习实践方式,尤其对于初学者来说。本资源集合包含了我们老师精心制作的一系列C++小游戏,旨在帮助学生深入理解和掌握C++...
DevC++ 6.0 是一个轻量级的C/C++集成开发环境(IDE),尤其适合初学者入门学习这两种编程语言。它集成了编译器、调试器和其他必要的工具,为用户提供了便捷的代码编写、编译、调试一站式体验。 在C++编程中,DevC++...
然而,当涉及到C++动态链接库(DLL)中的类时,情况会变得稍微复杂一些。本文将详细介绍如何在C#中调用C++DLL中的类,以及如何在C#端重新封装这些类以便调用。 首先,理解C++DLL的导出类机制。在C++中,我们可以...
C++是一种强大的编程语言,它在C语言的基础上引入了面向对象的特性,使得程序设计更加模块化和可扩展。C++具有以下显著特点: 1. 面向对象:C++支持封装、继承和多态这三大面向对象的特性。封装意味着数据和操作...
C++ API涵盖了C++标准库中的各种功能,包括容器(如向量、列表、映射和集合)、算法(如排序和查找)、迭代器、智能指针、异常处理、输入/输出流(iostreams)、字符串处理、文件系统操作等。这些API为C++程序员提供...
在实际应用中,你可能还需要处理错误、重试机制、多线程和异步操作等问题。Eclipse Paho库提供了丰富的功能,使得C++开发人员能够轻松地集成MQTT通信到他们的物联网应用程序中。 总的来说,C++实现MQTT协议主要涉及...