C/C++ 其妙无穷,三点小东西
喜欢的可以收藏转发加关注
在大多数开发或者准开发人员的认识中,C/C++ 是一门非常难的编程语言,很多人知道它的强大,但因为认为“难”造成的恐惧让很多人放弃。
大多数人学生时代开始接触 C/C++,在我看来,C/C++ 一旦学成,其妙无穷,就像武侠小说中的“九阳神功”一样,有了这个基础,您可以快速学习任何语言和编程技术。
行文不易,新手上路,多多关注,这真的对我很重要,私信更有惊喜
C 语言目前主要用于像操作系统这样一类偏底层的的应用开发,包括像 Windows/linux等这样的大型商业操作系统,和嵌入式操作系统、嵌入式设备上的应用。还有一些开源的软件,也会选择C开发,这些系统主要优先考虑程序执行效率和生成的可执行文件的体积(C 代码生成的可执行文件体积相对更小),当然还有一些是历史技术选型问题,这类软件以 redis、libevent、nginx,目前像国内的电信服务商所使用的电话呼叫系统一般也是基于一款叫 freeswitch 的开源 C 程序做的二次开发。
C++ 的应用领域目前有三大类,第一类就是我们目前见到的各种桌面应用软件,尤其 Windows 上桌面软件,如 QQ、安全类杀毒类软件(如金山的安全卫士,已开源。各种浏览器等等;另外就是一些基础软件和高级语言的运行时环境,如大型数据库软件、Java 虚拟机、C# 的 CLR 运行时、python 编译器和运行时环境等等;第三类就是一些业务型应用软件的后台,如游戏的服务器后台,例如魔兽世界的服务器和一些企业内部的应用系统(交易系统和行情系统就是基于 C++ 开发的)。
C++ 开发者有个不成文的规定就是,即使您对 C++ 很熟悉,也不要在简历上写上您精通 C++,原因很简单—— C++ 这门语言包含的东西实在太多了,没有人能真正“精通”所有。C++ 既支持面向对象设计(OOP),也支持以模板语法为代表的泛型编程(GP)。而且新的 C++ 标准和遵循 C++ 新标准的编译器也参出不穷,这些年,C++ 变化越来越大,越来越快,从最初业界和开发者翘首以盼的 C++11 标准,历经 C++14、C++17 到今天的 C++20,这门语言与之前的版本差别越来越大,更多原来需要使用第三库的功能也被陆续添加到 C++ 标准库中。以致于C++之父 :
在 C++11 开始的基础建设尚未完成,而 C++17 基本没有在使基础更加稳固、规范和完整方面做出改善。相反,却增加了重要接口的复杂度,让人们需要学习的特性数量越来越多。C++ 可能在这种不成熟的提议的重压之下崩溃。我们不应该花费大量的时间为专家级用户们(比如我们自己)去创建越来越复杂的东西。(还要考虑普通用户的学习曲线,越复杂的东西越不易普及。当然,我们不用有这种担忧,毕竟我们既不是 C++ 标准委员会成员,也不是 C++ 编译器开发厂商。就我个人经验来说,对于 C++11、C++14、C++17 乃至 C++20,我们学习它们的准则应该是以实用为主,也就是说我们应该学习其实用的部分,至于新标准提到的一些高级特性和各种复杂的模板,我们大可不必去了解。我们并不是做学术研究,我们学习 C++ 是为了投入实际的生产开发,所以应该去学习 C++ 新标准中实用的语法和工具库。关于C++11常用一些知识点,这里也简单地给读者列举一下:
auto 关键字、for-each 循环、右值及移动构造函数 + std::forward + std::move + stl 容器新增的 emplace_back 方法、std::thread 库、std::chrono 库、智能指针系列(std::shared_ptr/std::unique_ptr/std::weak_ptr)(智能指针的实现原理一定要知道,最好是自己实现过)、线程库 std::thread + 线程同步技术库std::mutex/std::condition_variable/std::lock_guard 等、lamda 表达式(JAVA 中现在也常常考察 lamda 表达式的作用)、std::bind/std::function 库、其他的就是一些关键字的用法(override、final、delete),还有就是一些细节如可以像 JAVA 一样在类成员变量定义处给出初始化值。
如果是学生的话,有充裕的时间,建议除了把 C++ 语法学好,系统地多读一点基础的书籍,如操作系统原理、网络编程、数据结构与算法相关的各方各面的经典书籍。尽量做到等您毕业走出校园以后,至少熟悉一门编程语言和其相应的开发环境的,是一个基础扎实、理论清晰、编码能力强的求职者。可惜的是,从现在的各种招聘反馈来看,大多数学生在求职时,对相关开发工具和语言的陌生程度实在让人瞠目结舌,面试官在面试的时候会很纳闷:这位学生大学四年(或者七年)到底是否调试过程序?
社会人士由于已经走上工作岗位,家庭、工作的琐事繁多,没有太多的时间去系统地阅读一些相关基础书籍,如果您当前工作正好是从事 C/C++ 开发,那么请结合您当前的项目来学习,搞清楚项目的体系结构、吸收项目中优秀的实现细节,针对性地补充相关知识,这是进步最快的方式。但是实际情形中,很多人觉得公司的项目代码又烂又杂,不愿意去研究,这种思想千万不能有的,在您没有自己足够好的能力给公司提供更好的解决方案,请先学习和模仿,我们此时要保持“空杯”心态,公司的代码再烂,它也是公司的商业价值所在;即使是纯粹的业务代码,也有它的可取之处,择其善者而从之,其不善者而改之。尤其是开发者处于一些初中级的开发岗位时,可能接触不到公司核心框架的源码,此时千万不要盲目地去排斥。学业务,补基础,时刻意识清醒自己所需,明白自己想要学的东西。
如果从事的不是 C++ 相关的开发,那么可以挤出一些时间去学习一些开源的代码,在阅读开源代码的过程中,针对性地补缺补差。不建议系统地去看《C++ primer》《UNIX 环境高级编程》诸如此类的大部头书籍,实际开发中不需要太多的这类书中的细枝末节,阅读这类书往往只会事倍功半,甚至最后因书籍太厚、时间不够,最后坚持不下去,最终放弃。
当然,对于社会人士,当您有一定的时间的时候一定要去补充一些基础的、原理性的东西,千万不要沉溺于“面向搜索引擎编程”或者“面向工资编程”,有些问题虽然当时通过搜索引擎解决了,但如果想在技术或职业上有长足的发展,一定要系统地去读一些经典的、轻量级的书籍(如《C++ 对象模型》)。长期在网上的文章中寻章摘句,只会让您的知识结构碎片化、凌乱化,甚至混乱化。而且互联网上的技术文章质量良莠不齐,有时候也容易对自己形成误导和依赖。总而言之,作为技术开发人员,提高自己技术水平是改变现状、改善生活最直接的途径。
关于 C/C++,暂且就讨论这么多。最后再强调一遍,C++ 是一门讲究深度的语言,其“深度”不是体现在会多少 C++ 语法,而是能够洞察您所写的 C++ 代码背后的系统原理,这是需要长期不断的积累的,没有速成之法。反过来一旦学成,可以快速地学习其他语言和框架。个人觉得,如果自主创业或者想在二三线城市长期发展的读者,C/C++ 应该是优选语言,有了它作为基础,您可以跳出依赖各种环境和框架的窠臼,快速地学习和开发您想要的软件,完成您想要的业务产品。
请转发+私信学习即可免费领取C/C++学习资料