【是C++,不是C艹】 什么是C++ | C++从哪来 | 学习建议

news2024/11/15 8:21:58

💞💞欢迎来到 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++98C++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++写的。

以上就是我提到的部分应用领域,其实C/C++的应用领域有很多,大家可以自行发现。 

 

Part2:如何学习C++

1.看看别人怎么学

以下引用自《程序员》刊登的拙文《C++强大背后》最后一段:
C++ 缺点之一,是相对许多语言复杂,而且难学难精。许多人说学习 C 语言只需一本 K&R C 程序设计语言》即可,但C++ 书籍却是多不胜数。我是从 C 进入 C++ ,皆是靠阅读自学。在此分享一点学习心得。个人认为, 学习C++ 可分为 4 个层次:

• 第一个层次, 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++进行一个引导,方向的确定等,我毕竟还是个小小的学生,观点难免会有不成熟的地方,欢迎讨论~

码文不易 

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件夹改名,如何在改名之后批量复制文件夹名称

在日常时候中会遇到给文件夹改名的时候,那么我们又如何在改名之后批量复制文件夹名称?今天就由小编来给大家分享一下操作办法。 首先第一步,我们要进入文件批量改名高手,并在板块栏里选择“文件夹批量改名”板块。 第二步&#xf…

SpringBoot 接入chatGPT API

SpringBoot 接入chatGPT API 一、准备工作二、补全接口示例三、申请API-KEY**四、JavaScript调用API**五、SpringBoot整合ChatGPT六、使用curl模拟请求ChatGPT平台已经为技术提供了一个入口了,作为一个Java程序员,我们第一时间想到的就是快速开发一个应用,接入ChatGPT的接口…

第十四天本地锁、Redis分布锁、Redisson锁三者的区别

一、为什么要有redis分布式锁,它解决了什么问题? 在传统单体架构的项目下,使用本地锁synchronized和lock锁就可以锁住当前进程,保证线程的安全性,但是本地锁解决不了分布式环境下多个服务资源共享的问题,而…

产品研发流程管理

先看一张图,该图适应绝大部分的产品的 研发流程 (需要的可以去下 产品研发流程| ProcessOn免费在线作图,在线流程图,在线思维导图) 该图详细描述了,不同阶段应该做什么,具体的来说,是确定了什么时候 “开会…

高精度人员定位系统源码,采用vue+spring boot框架,支持二次开发

智慧工厂人员定位系统源码,高精度人员定位系统源码,UWB定位技术 文末获取联系! 在工厂日常生产活动中,企业很难精准地掌握访客和承包商等各类人员的实际位置,且无法实时监控巡检人员的巡检路线,当厂区发生灾…

【Python】实战:生成无关联单选问卷 csv《精神状态评估表》

目录 一、适用场景 二、业务需求 三、Python 文件 (1)创建文件 (2)代码示例 四、csv 文件 一、适用场景 实战场景: 问卷全部为单选题问卷问题全部为必填问题之间无关联关系每个问题的答案分数不同根据问卷全部问…

使用pandas和seaborn绘图

使用pandas和seaborn绘图 matplotlib实际上是一种比较低级的工具。要绘制一张图表,你组装一些基本组件就行:数据展示 (即图表类型:线型图、柱状图、盒形图、散布图、等值线图等)、图例、标题、刻度标签以及其他注解型…

【远程开发】VSCode使用Remote SSH远程连接Linux服务器

文章目录 前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 转发自CSD…

【Unity】创建一个自己的可交互AR安卓程序

目录 1 创建一个AR场景2 配置AR Camera为前置摄像头3 配置打包场景4 下载官方提供的InteractiveFaceFilterAssets资源5 配置AR Face Manager6 创建眼镜预制件7 设置AR面部追踪8 测试效果8.1 在Unity中测试8.2 在安卓设备上测试 9 在该AR场景的基础上添加自己的想法9.1 改变眼镜…

【Java|golang】1042. 不邻接植花---邻接表着色

有 n 个花园,按从 1 到 n 标记。另有数组 paths ,其中 paths[i] [xi, yi] 描述了花园 xi 到花园 yi 的双向路径。在每个花园中,你打算种下四种花之一。 另外,所有花园 最多 有 3 条路径可以进入或离开. 你需要为每个花园选择一…

C++用户信息管理服务 Thrift框架 Mysql数据落地 Redis数据缓存 Kafka 消息队列 总结 附主要源码

不知不觉入职已经一个月了,近期提交了考核2,要求如下: 1、编写一个管理用户信息的服务,通过thrift的远程过程调用实现用户信息管理功能 2、用户信息至少包括 唯一ID、用户名、性别、年龄、手机号、邮箱地址、个人描述 3、提供创建…

PHP+Vue+java导师学生双选系统设计与实现springnboot+pyton

为了直观显示系统的功能,运用用例图这样的工具显示分析的结果。分析的管理员功能如下。管理员管理学员,导师,管理项目信息,管理项目提交,管理指导项目信息。运行环境:phpstudy/wamp/xammp等 卓越导师双选系统根据调研&…

GCC 常用命令

GCC 编译过程 一个 C/C文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)和链接(linking) 等 4 步才能变成可执行文件 (1) 预处理 C/C源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、…

系统集成项目管理工程师案例分析考点汇总(沟通/干系人、风险、合同等)

沟通及干系人管理常见考点1. 沟通管理计划的内容2. 项目绩效报告的主要内容3. 沟通中容易出现的问题4. 如何采取有效措施改进沟通5. 如何召开有效的会议 合同管理常见考点1. 合同签订时应注意的内容及条款2. 合同管理常见的问题3. 合同管理问题的应对措施 采购管理常见考点1. 采…

IntelliJ 上 Azure Event Hubs 全新支持来了!

大家好,欢迎来到 Java on Azure Tooling 的3月更新。在这次更新中,我们将介绍 Azure Event Hubs 支持、Azure Functions 的模板增强,以及在 IntelliJ IDEA 中部署 Azure Spring Apps 时的日志流改进。要使用这些新功能,请下载并安…

使用docker搭建Milvus向量数据库

Milvus向量数据库是什么? 官网是这样说的: Milvus创建于2019年,目标单一:存储、索引和管理由深度神经网络和其他机器学习(ML)模型生成的大量嵌入向量。 作为一个专门用于处理输入向量查询的数据库&#…

操作系统原理 —— 什么是系统调用?(五)

什么是系统调用? 有什么用作用? 我们想想怎么是系统调用呢? 系统调用 是操作系统提供给应用程序(程序员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务。…

编译原理复习(2023.4.25考试版本)

本次复习采用的是这本书,如有书写不当的地方,欢迎批评指正! 第一章 第二章 符号串的运算 相等:两个符号串一模一样的 长度:数他有几个就行了 连接:跟在后面直接写就行了 符号传串的逆:在符…

详解UDP协议与实现UDP版本字典翻译客户端与服务器

文章目录 前言1. UDP协议介绍2.UDP Socket的介绍3. UDP版本字典翻译服务器4. UDP版本字典翻译客户端 前言 UDP协议也是传输层的一种协议,上篇文章我们介绍了TCP协议可以参考我的另一篇博客详解TCP协议以及实现TCP版本的字典翻译服务器客户端,以下来介绍…

【k8s】Wordpress(PHP+nginx+mysql)迁移到k8s

一、迁移思路: 1、制作服务镜像; 1.1 挑选合适的基础镜像; 1.2 准备代码相关的文件; 1.3 通过dockerfile构建镜像;2、制作Kubernetes服务,并完成调度; 2.1确定服务运行的模式(内部运行or 对外提供); 2.2确定服务所使用的控制器; 2.3服务是否…