【C++】—— 初识C++
一、什么是 C++
C语言 是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言 则不合适。为了解决软件危机, 20 世纪 80 年代, 计算机界提出了 OOP(objectoriented programming:面向对象) 思想,支持面向对象的程序设计语言应运而生.
1982年,Bjarne Stroustrup 博士 在 C语言 的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与 C语言 的渊源关系,命名为 C++。因此:C++ 是基于 C语言 而产生的,它既可以进行 C语言 的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。
二、C++ 的发展历史
C++ 的起源可以追溯到 1979 年,当时 Bjarne Stroustrup(本贾尼·斯特劳斯特卢普,这个翻译的名字不同的地⽅可能有差异) 在贝尔实验室从事计算机科学和软件工程的研究工作。面对项目中复杂的软件开发任务,特别是模拟和操作系方面⽅⾯的不⾜。
1983 年,Bjarne Stroustrup 在 C语言 的基础上添加了吗面向对象编程的特性,设计出了 C++ 语言的雏形,此时的 C++ 已经有了类、封装、继承等核心概念,为后来的⾯向对象编程奠定了基础。这⼀年该语言被正式命名为 C++。
在随后的几年中,C++ 在学术界和⼯业界的应用逐渐增多。⼀些⼤学和研究所开始将C++作为教学和研究的⾸选语言,而⼀些公司也开始在产品开发中尝试使用 C++。这⼀时期,C++ 的标准库和模板等特性也得到了进⼀步的完善和发展。
C++ 的标准化工作于 1989 年开始,并成立了⼀个 ANSI 和 ISO (International Standards Organization)国际标准化组织的联合标准化委员会。1994 年标准化委员会提出了第⼀个标准化草案。在该草案中,委员会在保持斯特劳斯特卢普最初定义的所有特征的同时,还增加了部分新特征。
在完成 C++ 标准化的第⼀个草案后不久,STL(Standard Template Library)是惠普实验室开发的⼀系列软件的统称。它是由 Alexander Stepanov、Meng Lee 和 David R Musser 在惠普实验室⼯作时所开发出来的。在通过了标准化第⼀个草案之后,联合标准化委员会投票并通过了将 STL 包含到 C++ 标准中的提议。STL 对 C++ 的扩展超出 C++ 的最初定义范围。虽然在标准中增加 STL 是个很重要的决定,但也因此延缓了 C++ 标准化的进程。
1997年11⽉14⽇,联合标准化委员会通过了该标准的最终草案。1998年,C++ 的 ANSI / IS0 标准被投⼊使⽤。
三、C++ 版本更新
阶段 | 内容 |
---|---|
C with classes | 类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符重载等 |
C++1.0 | 添加虚函数概念,函数和运算符重载,引用、常量等 |
C++2.0 | 更加完善支持面向对象,新增保护成员、多重继承、对象的初始化、抽象类、静态成员以及const成员函数 |
C++3.0 | 进一步完善,引入模板,解决多重继承产生的二义性问题和相应构造和析构的处理 |
C++98 | C++标准第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美国标准化协会认可,以模板方式重写C++标准库,引入了STL(标准模板库) |
C++03 | C++标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性 |
C++05 | C++标准委员会发布了一份计数报告(Technical Report,TR1),正式更名C++0x,即:计划在本世纪第一个10年的某个时间发布 |
C++11 | 增加了许多特性,使得C++更像一种新语言,比如:正则表达式、基于范围for循环、auto关键字、新容器、列表初始化、标准线程库等 |
C++14 | 对C++11的扩展,主要是修复C++11中漏洞以及改进,比如:泛型的lambda表达式,auto的返回值类型推导,二进制字面常量等 |
C++17 | 在C++11上做了一些小幅改进,增加了19个新特性,比如:static_assert()的文本信息可选,Fold表达式用于可变的模板,if和switch语句中的初始化器 |
C++20 | 自C++11以来最大的发行版,引入了许多新的特性,比如:模块(Modules)、协程(Coroutines)、范围(Ranges)、概念(Constraints)等重大特性,还有对已有特性的更新:比如Lambda支持模板、范围for支持初始化等 |
C++23 | C++23是一个小版本的更新,进一步完善和改进现有特性,增加了 if consteval、falt_map、import std导入标准库等 |
C++26 | 制定中 |
现如今,大部分公司 C++ 所使用的版本是 98 和 11
四、C++ 的重要性
截止至2024 年 6 月,C++ 在 TIOBE 编程语言社区一直稳居前三的位置。虽然语言排名并不能衡量一种语言的优劣,但是一门受众广的语言自然有良好的发展前景。
TIOBE 排行榜是根据互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube和 Baidu(百度)统计出排名数据,只是反映某个编程语言的热门程度,并不能说明⼀门编程语言好不好,或者⼀门语言所编写的代码数量多少。
五、C++ 在工作领域中的运用
C++ 的应用领域服务器端、游戏(引擎)、机器学习引擎、⾳视频处理、嵌入式软件、电信设备、金融应用、基础库、操作系统、编译器、基础架构、基础工具、硬件交互等很多方面都有。
- 大型系统软件开发。如编译器、数据库、操作系统、浏览器等等
- 音视频处理。常见的音视频开源库和方案有 FFmpeg、WebRTC、Mediasoup、ijkplayer,音视频开发最主要的技术栈就是 C++。
- PC客户端开发。⼀般是开发 Windows 上的桌⾯软件,比如 WPS 之类的,技术栈的话⼀般是 C++ 和 QT,QT 是⼀个跨平台的 C++ 图形用户界面(Graphical User Interface,GUI)程序。
- 服务端开发。各种大型应用网络连接的高并发后台服务。这块 Java 也比较多,C++ 主要⽤于⼀些对性能要求比较高的地方。如:游戏服务、流媒体服务、量化高频交易服务等
- 游戏引擎开发。很多游戏引擎就都是使用 C++ 开发的,游戏开发要掌握 C++ 基础和数据结构,学习图形学知识,掌握游戏引擎和框架,了解引擎实现,引擎源代码可以学习 UE4、Cocos2d-x 等开源引擎实现
- 嵌入式开发。嵌⼊式把具有计算能力的主控板嵌入到机器装置或者电⼦装置的内部,通过软件能够控制这些装置。比如:智能⼿环、摄像头、扫地机器人、智能音响、门禁系统、车载系统等等,粗略⼀点,嵌入式开发主要分为嵌⼊式应用和嵌入式驱动开发。
- 机器学习引擎。机器学习底层的很多算法都是用 C++ 实现的,上层用 python 封装起来。如果你只想准备数据训练模型,那么学会 Python 基本上就够了,如果你想做机器学习系统的开发,那么需要学会 C++。
- 测试开发/测试。每个公司研发团队,有研发就有测试,测试主要分为测试开发和功能测试,测试开发⼀般是使用⼀些测试工具 (selenium、Jmeter等) ,设计测试用例,然后写⼀些脚本进行自动化测试,性能测试等,有些还需要自行开发⼀些测试⽤具。功能测试主要是根据产品的功能,设计测试用例,然后手动的方式进行测试
六、C++ 书籍推荐:
- C++ Primer:主要讲解语法,经典的语法书籍,在学习 C++ 的前后中期都可以看,前期如果自学看可能会有点晦涩难懂,到中后期作为语法字典,非常用。
- STL源码剖析:主要从底层实现的⻆度结合 STL 源码,庖丁解⽜式剖析 STL 的实现,是侯捷老的经典之作。可以很好的帮助我们学习别人用语法是如何实现出高效简洁的数据结构和算法代码,如何使用泛型封装等。让我们不再坐井观天,闭门造车,本书推荐 C++ 学习到中后期可以看。
- Effctive C++:本书也是侯捷老师翻译的,本书有的⼀句评价,把 C++ 程序员分为看过此书的和没看过此书的。本书主要讲了 55 个如何正确高效使用 C++ 的条款,建议中后期可以看⼀遍,工作 1-2 年后再看⼀遍,相信会有不⼀样的收获。