💞💞欢迎来到 Claffic 的博客 💞💞
👉专栏:《是C++,不是C艹》👈
前言:
我知道你急着学C++,但你先别急,薛之谦认识认识C++还是很有必要的。本期跟大家聊一聊C++的发展史,最后提一些学习建议~
注:
你最好是学完了C语言,并学过一些初阶的数据结构。
Part1:什么是C++
“C++是什么,能吃吗?” 这样想的童鞋先去找食堂阿姨盛两碗饭
1.区分几个带C的语言
我发现身边经常有小伙伴分不清C/C++,C#等语言,甚至把C/C++说成是一种语言,
额,我只能笑笑... ...
所以在这里区分几个语言还是挺有必要的:
C语言:1972年,贝尔实验室的丹尼斯·里奇在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。
C++:最早于1979年由本贾尼大佬在AT&T贝尔工作室研发,在C语言的基础上做了很大的改良,但语法绝大部分又是与C语言相通的,因此你会经常看到 C/C++ 这样的写法。
C#:2000年由微软公司发布,它在继承C和C++强大功能的同时去掉了一些它们的复杂特性,而且你发现没,#其实就是++++合并起来的。(奥对了,“C#”读作“C sharp”)
2.C++为何诞生
C 语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C 语言则不合适。为了解决软件危机, 20 世纪 80 年代, 计算机界提出了 OOP(object oriented programming :面向对象 ) 思想 ,支持面向对象的程序设计语言应运而生。
简单来说,随着计算机技术的发展,程序越来越复杂,对于复杂的程序,C语言不合适。
有一位大佬看到这种情况,就想:那我就创造一个可以适用于复杂程序的语言吧!
他就是 Bjarne Stroustrup ,本贾尼大佬:
感谢大佬能让我混口饭吃🤣
到这里,不妨让我们撇一眼隔壁Java之父:
左:Bjarne Stroustrup 右:James Gosling
果然大佬们都是有相似之处的,比如头顶... ... 😀
好了好了,回到C++:
1982 年, Bjarne Stroustrup 博士在 C 语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C 语言的渊源关系,命名为 C++ 。因此: C++ 是基于 C 语言而产生的,它既可以进行 C 语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程 序设计 。
到这里已经讲完了C++的诞生,下面看C++的发展史:
3.C++发展史
其实时间再向前推,起初的C++并不是叫做C++的:
1979 年,贝尔实验室的本贾尼等人试图分析 unix 内核的时候,试图将内核模块化,于是 在 C 语言的基础上进 行扩展,增加了类的机制 ,完成了一个可以运行的预处理程序,称之为 C with classes 。
看下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
|
制定ing
|
虽然C++在不断发展,但是公司主流使用还是C++98和C++11,所以在学习中以这两个标准为大方向即可。
4.C++重要性
下面是 TIOBE 编程语言社区排行:
只取前五
有童鞋看到:欸,排名不如Java阿,那它是不是不如Java呢?
这样想未免有些太简单,首先这个排名主要是以热度排的,热度高和重要性没有直接关系吧?
再者,排名并不能说明那个语言好,那个语言不好,每个语言都有自己最适合的应用场景。
况且在30多年的发展中,C/C++几乎一直稳居前5,还是很dio的。
那C++的应用场景有哪些呢?
那就多了去了,
先说你感兴趣的游戏吧:
游戏开发领域:
PC平台上的游戏:诸如传奇,CS,魔兽世界等;
包括游戏引擎:虚幻4,DirectX等;
三维游戏的计算量非常庞大,想要保证画面精美的同时又要保持流畅,C++无疑是最好的选择。
操作系统以及大型系统软件开发领域:
所有的操作系统几乎都是C/C++写的,如 Unix,Linux,Windows等;
许多大型软件也是C++写的,如 Photoshop,Office 等;
原因嘛,性能高,可直接操控硬件。
嵌入式和物联网领域:
嵌入式嘛,大家首先想到的就是 板子 (单片机) 吧,除此之外还包括系统层面,驱动层面等开发;
包括不久前提出的万物互联,这是一种新兴的趋势,未来可期。
人工智能领域:
一提到人工智能,大家首先想到的就是python,认为学习人工智能就只要学习python,这个是误区, python中库比较丰富,使用python可以快速搭建神经网络、填入参数导入数据就可以开始训练模型了。但人工智能背后深度学习算法等核心还是用C++写的。
Part2:如何学习C++
1.看看别人怎么学
• 第一个层次, C++ 基础 ( 平平常常 )挑选一本入门书籍,如 《 C++ Primer 》、《 C++ 大学教程》 或 Stroustrup 撰写的经典 《 C++ 程序设计语 言》 或他一年半前的新作 《 C++ 程序设计原理与实践》 ,而一般 C++ 课程也止于此,另外 《 C++ 标准程 序库》 及 《 The C++ Standard Library Extensions 》 可供参考 ;• 第二个层次,正确高效的使用C++ ( 驾轻就熟 )此层次开始必须自修,阅读过 《 (More)Effffective C++ 》、《 (More)Exceptional C++ 》、 《 Effffective STL 》 及 《 C++ 编程规范》 等,才适宜踏入专业 C++ 开发之路 ;• 第三个层次,深入解读C++ ( 出神入化 )关于全局问题可读 《深入探索 C++ 对象模型》、《 Imperfect C++ 》、《 C++ 沉思录》、《 STL 源码剖 析》 ,要挑战智商,可看关于模版及模版元编程的书籍如 《 C++Templates 》、《 C++ 设计新思维》 、 《 C++ 模版元编程》 ;• 第四个层次,研究C++ ( 返璞归真 )阅读 《 C++ 语言的设计和演化》、《编程的本质》 ( 含 STL 设计背后的数学根基 ) 、 C++ 标准文件 《 ISO/IEC 14882:2003 》、 C++ 标准委员会的提案书和报告书 、关于 C++ 的学术文献。由于我主要是应用C++ ,大约只停留于第二、三个层次。然而, C++ 只是软件开发的一环而已,单凭语言并不能应付业务和工程上的问题。建议读者不要强求几年内 “ 彻底学会 C++ 的知识 ” ,到达第二层左右便从工作实战中 汲取经验,有兴趣才慢慢继续学习更高层次的知识 。虽然学习 C++ 有难度,但也是相当有趣且有满足感的。
可见,C++是不能速成的,如《21天精通C++》这样的书完全是天方夜谭;
所以,C++的学习要靠扎实的基础学习,实战,读书,沉淀等;
2.自己怎么学
最终还是要回到自己身上,自己如何学习C++呢?
其实在我之前的一期 【带你入门】 从0开始学习C语言 篇末提到了一些学习方法,这些学习方法用在C++上也是适用的;
只不过,C++的学习过程中最好是买几本书来看:
如:
《Effective C++》 这个可以多读几遍
《C++ Primer》 主要起查阅作用
《STL 源码剖析》 STL是C++库的一种
讲到这里基本上就完结了,不知道你对C++的热情是否高涨了许多呢?
总结:
这篇博客没有硬知识,主要是对开始学习C++进行一个引导,方向的确定等,我毕竟还是个小小的学生,观点难免会有不成熟的地方,欢迎讨论~
码文不易
如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦 💗💗💗