//
一、C++发展
C++语言由C语言发展而来,是以面向对象为主要特征的语言。它是20世纪80年代初由贝尔实验室的BjarenStroustrup博士发明的,最初称为“带类的C”,1983年正式命名为C++。有一个关于C++名字的笑话是,当你使用后缀++时,附加只发生在运算之后(因此,它应该是++C,而不是C++,这个笑话是说时下某些程序员还在以使用C的方式使用C++,这通常被一些权威著作认为是不正确的)。
C++语言发展大概可以分为三个阶段:第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;第二阶段从1995年到2000年,这一阶段由于标准模板库和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重。同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;第三阶段从2000年至今,由于以Loki、MPL(Boost)等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。
1983年,C with Classes改命名为C++(++是C语言中的自增操作符)。加入了新的特性,其中包括虚函数、函数名和运算符重载、参考、常量、用户可控制的自由空间存储区控制、改良的类型检查,并恢复了双斜线(//)单行注释(之后C99也支持了这种注释)。
1985年,发布第一版《C++程序设计语言》,提供一个重点的语言参考,至此还不是官方标准。
1989年,发布了Release 2.0。引入了多重继承、抽象类别、静态成员函数、常量成员函数,以及成员保护。1990年,出版了《The Annotated C++ Reference Manual》。这本书后来成为标准化的基础。稍后还引入了模板、异常处理、名字空间、新的强制类型转换,以及布尔类型。
随着C++语言的演变,也逐渐演化出相应的标准程序库。最先加进C++标准库的是流I/O库,其用以取代传统的C函数,如printf和scanf。随后所引入的程序库中最重要的便是标准模板库,简称STL。
多年后,ISO委员会于1998年对C++标准化。在官方发布1998标准的若干年后,委员会处理缺陷报告,并于2003年发布一个C++标准的修正版本。2005年,一份名为《Library Technical Report 1》的技术报告发布。虽然还不是官方标准的一部分,不过它所提供的几个扩展可望成为下一版C++标准的一部分。
目前最新的C++标准是2020年12月发布的ISO/IEC 14882:2020[5],又称C++20。
原来版本中来不及引入的内容,以及语言机制中发现的一些缺陷,都在新的版本中得以弥补和发展。新版标准中引入了无序容器,以及弥补原版标准中对hash容器的缺漏:新版标准支持移动构造函数和移动赋值运算符,以减小特定场景下对象拷贝的性能开销。新版本标准不仅在语法上增加了大量的特性,而且在标准库里也引入大量设施,使得标准库对于C++语言的重要性远超从前。学习新的C++风格,不是一朝一夕,熟练掌握rvalue reference、move 语义,了解unique_ptr、shared_ptr和weak_ptr的完整用法,明智的使用function/bind和lambda机制,学习C++ Concurrency的新技术,对于初学者的话更不简单。
二、经验浅谈
我们再来说说C++的应用领域,目前有三大类∶
第一类就是我们目前见到的各种桌面应用平尤其 Windows桌面软件,如QQ、安全类杀毒类软件、各种浏览器等;
另外就是一些基础软件和高级语言的运行时环境,如大型数据库软件、Java虚拟机、C#的CLR、Python编译器和运行时环境等;
第三类就是一些业务型应用软件的后台,像游戏的服务器后台,如魔兽世界的服务和一些企业内部的应用系统。
说的比较抽象,我们举个例子,要开发一个类似电驴的软件,软件界面如下图:
操作系统选择Windows,使用语言C++,这款产品的实现技术分为UI和网络通信部分。
(1)UI部分:需要对Windows的窗口、对话框、消息产生、派发与处理机制进行学习了解,根据上图的软件功能,大致分为三大模块,即资源、下载和分享。这三大块可以使用Windows Tab控件去组织。
(2)网络通信部分:有两大块,第一个是程序启动时与服务器交互;第二个是文件下载与分享的P2P网络。
同学们面临的的一个重要任务就是快速掌握新的C++风格和工具。C++同时支持4种不同的编程风格:面向过程、基于对象、面向对象和泛型编程,还可以加上一种“基于组件”的风格,这么多的风格共存于一种语言就是其强大抽象机制的证明。
在实践中,不必全面地使用C++语言的各种特性,而应根据工程项目的实际情况,比如动态类型信息、虚拟继承、异常等特性的使用有待商榷。通常使用C++语言的一个子集就够了。尽管在工程中使用C++子集,但全面地学习C++语言还是有必要的,毕竟C++语言是一个整体,并且C++标准库自身全面地使用了C++语言的各种特性。
最后说下面试问题,如果你是想进入大型互联网公司的应届生,应该优先好好准备算法和数据结构以应对面试,这是大型互联网公司面试频率最高的考察范围;如果是社会人士参加C++职位的面试,如果是大型互联网公司,虽然社招问的更多的是项目经验,但适当准备一些基础的算法和数据结构知识也是非常有用的。
Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5,京公海网安备11010802025203号