C++学习

一、C++基本介绍


1.1 C++是什么


C++是一种通用的、高级的编程语言,它是C语言的扩展和改进版本。C++由Bjarne Stroustrup博士在20世纪80年代初开发,旨在为程序员提供更多的功能和工具,以便更轻松地编写复杂的软件程序。
拜一拜祖师爷,保佑在学习C++的路上少写bug
C++支持面向对象编程。面向对象编程是一种编程范式,通过将数据和操作封装在对象中,可以更好地组织和管理代码。这使得C++能够创建模块化、可重用和易于维护的程序。

此外,C++还提供了许多其他功能和特性,如模板、异常处理、多态等。这些功能使得C++成为一门功能强大且灵活的编程语言,被广泛应用于各个领域。

C++与C语言是有一定的渊源的,但是C#的C++并没有很大关系。C#是早期微软为了对标Java而问世的一款编程语言。

C++是在C语言的基础上补充拓展出来的,就好比是一个妈生的亲兄弟(姐妹)。而Java“借鉴”了C++的一些特性,然后在此基础上做出一些改变,自立门户,C++和Java就好比是堂兄弟(姐妹)。C#又“借鉴”了Java一些特性和概念,然后又在此基础上做出一些改变Java和C#也是属于堂兄弟(姐妹)关系。

1.2 C++发展史


C++的发展史可以追溯到1979年,贝尔实验室的本贾尼等人试图分析Unix内核的时候,试图将内核模块化,于是在C 语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with classes。随着时间的推移,这种新的语言逐渐发展壮大,并在1983年正式被命名为C++。C++继承了C语言的基本语法和功能,并引入了面向对象编程的特性,如类、继承和多态性。

C++历史版本:

目前C++23还在定制中,这从侧面也能看出来C++还是有一定的局限性的。
Java相比C++,有一个“氪金”的公司(Oracle),大概每半年就更新一次,这样的好处就是Java后期的生态可能会比C++好一点,但是这也对学习Java的人来说,是一个头疼的问题,因为更新太快了,可能学着学着,版本就换了。

C++现在虽然还是在发展,但是市面上主流使用的还是C++98和C++11,这些也够我们掉头发了,所以我们也不必担心,能把现有的玩明白,就很厉害啦。由于C++是从C语言里面生长出来的,所以C++是兼容C语言的。

C++
C++23 将会是 C++20 后的下一个 C++ 标准。这个新标准对 C++ 进行了大幅改进,但其影响力却不如 C++98、C++11 或 C++20 那样翻天覆地。C++23 更像是 C++17 的传统延续。

为了理解 C++ 的这一进化步骤,让我们将 C++ 标准放在历史背景中来看看。

1、C++ 标准
C++ 已有超过 40 年的历史了。那么,在这些年里,C++ 都经历了什么变化呢?以下是一个简要的回答,一直延续到 C++23。

C++98
在 20 世纪 80 年代末,Bjarne Stroustrup 和 Margaret A. Ellis 合著了他们的著名书籍 Annotated C++ Reference Manual(注释版 C++ 参考手册,简称 ARM)。这些书有两个目的。首先,那时存在许多独立的 C++ 实现。因此,ARM 定义了 C++ 的功能。其次,ARM 是第一个 C++ 标准 C++98(ISO/IEC 14882)的基础。C++98 有几个关键特性:模板、包含容器和算法的标准模板库(STL)、字符串和 IO 流。
C++03
随着 C++03(14882:2003),C++98 得到了一项微小的技术修正,小到在我的时间线上都没有容身之地。在社区中,包括 C++98 在内的 C++03 被称为传统的 C++。最早的C++标准版本,包含了面向对象编程的基本特性、模板和STL(标准库)等功能。
TR1
2005 年,发生了一件令人非常兴奋的事情。这一年,发布了所谓的技术报告 1(Technical Report 1,简称 TR1)。TR1 是向着 C++11,因此向着现代 C++ 的一大步。TR1(TR 19768)是基于 C++ 标准化委员会成员创立的 boost 项目。TR1 有 13 个库,这些库也成为下一个 C++ 标准的一部分。例如,库对应到正则表达式库、随机数库、智能指针如 std::shared_ptr,以及哈希表。只有所谓的特殊数学函数需要等到 C++17 才能使用。

C++11
C++11 是下一个 C++ 标准,但我们通常称之为现代 C++。现代 C++ 也包括了 C++14 和 C++17。C++11 拥有许多特性,这些特性从根本上改变了我们编写 C++ 程序的方式。例如,C++11 引入了 TR1 的组件,还有移动语义、完美转发、变长模板或 `constexpr,还有其他诸多特性。随着 C++11 的到来,我们还得到了一个内存模型作为基础的线程模型,以及一个线程 API。如果你感到好奇,这里有我关于内存模型和多线程的一些基本文章。

C++14
C++14 是一个小型的 C++ 标准。对C++11进行了一些修订和改进,引入了读写锁,增加了一些新特性和语法,如泛型lambda表达式、constexpr函数、二进制文字等。

C++17
C++17 有两个显著的特性:并行 STL 和标准化的文件系统。大约 80 个 STL 算法可以使用所谓的执行策略进行执行。这意味着 std::sort(std::execute::par, vec.begin(), vec.end()) 对 C++ 实现的排序容器 vec 是一个并行处理的提示。此外,你还可以指定排序应按顺序执行(std::execution::seq)或向量化执行(std::execution::par_unseq)。就像 C++11 一样,boost 对 C++17 也产生了深远影响。我们从 boost 获取了文件系统以及三种新的数据类型:std::optional、std::variant 和 std::any。

C++20
C++20 的变革对我们编写 C++ 程序的方式产生了根本性的影响,其程度不亚于 C++11。特别是以下四个重要特性:Ranges(范围库),Coroutines(协程),Concepts(概念),以及 Modules(模块)。
新的 Ranges 库让我们可以直接在容器上表达算法,使用管道符组合算法,并将它们应用于无限数据流。
多亏了 Coroutines,异步编程在 C++ 中可能会成为主流。协程是协作任务、事件循环、无限数据流或管道的基础。
Concepts 将改变我们对模板的思考和编程方式。它们是有效模板参数的语义类别。它们让你能够直接在类型系统中表达你的意图。如果出了什么问题,你会收到简洁的错误信息。
Modules 将克服头文件的限制。它们带来了很多好处。例如,预处理器将变得不再需要。最终,我们还将拥有更快的构建时间,更简单的包构建方式。
关于 Ranges、Coroutines、Concepts、Modules 和 C++20 的文章可以参见链接。(链接见文底)

C++23
现在(2023年11月),C++23 已经完成,并进入了最终投票阶段。
C++23 提供了一种小巧但影响深远的核心语言特性——this 的推导。这种特性允许你,类似于 Python,在成员函数定义中明确地传递隐式传递的 this 指针。引入 this 的推导后,一些 C++ 中复杂的技术,例如 CRTP (奇异递归模板模式) 或者 Overload Pattern(过载模式),将变得轻而易举。
C++23 库还将新增很多有意思的特性。你可以直接使用 import std; 导入标准库,或者在 std::print 和 std::println 中应用 C++20 的格式字符串。此外,我们将出于性能考虑,获得如 std::flat_map 这样的扁平化关联容器,这些容器在时间和空间复杂度上做了一个平衡。std::flap_map 可取代 std::map 。std::optional 的接口将扩展为具有组合性的单子接口。新的数据类型 std::expected 已经具有可组合的接口,可以用于错误处理,存储预期值或非预期值。多亏了 std::mdspan,我们可以创建和操作多维数组。最后,std::generator 是第一个用于创建数字流的具体的协程。std::generator 是 Ranges 库的一部分,该库也将在 C++23 中得到增强。

1.3 c++23详述

1.3.1、c++23的目标和延革


c++的标准发展速度在经过c++11的近乎可以称革新的变化之后,开始步入了快车道。有的人在网上说,c++11后的c++语言和c++11以前的c++语言不是一个语言,这有点夸张了。但不可否认,其内容确实变化非常大。很多人可能都没有感觉到c++新标准的变化,毕竟国内的应用还是比较浅的。可是,c++14和c++17又快速推出,还没等c++开发人员缓过神儿来,c++20又迫不及待的出现了。快吗?不快。这不,c++23的标准,现在基本也算敲定的差不多了。
而c++26也会在今年开始启动标准的制定,而c++29也已经开始规划。
从过去的发展到未来的规划,排除特殊情况(covid-19对c++23是有影响的)可以基本看清楚,c++的新标准是呈现大小大小这种波浪式的渐进过程,可以理解为出现一次大的标准改进,就会在后续一个版本进行完善和迭代扩展;然后再进行一次大的标准的改进,再一次完善,如此反复。
实际情况中,c++11的对c++语言的改变可以说令人耳目一新,而c++14就相对来说比较小了,几乎没有推出什么新的东西,c++17虽然有所突破,但仍然保持一个中型向上的扩展态势,直到c++20推出了概念等四大新特性。c++23其实更接近于c++17的变化,但由于一些特殊的情况导致一些细节可能最终无法完成,所以说c++26可能会相对偏大一些,但真正的大变化可能会在c++29产生。当然,前面的是已经成为的事实,而后面是一种规划,还要看最终的结果。
对于c++标准的制定,大概分为两部分,一部分是c++语言特性本身的制定;另外一个就是c++标准库特性的制定。
可以显而易见的是,前者的的难度比后者要大的得多。
至于标准更改中涉及到的相关标准提案,有兴趣可以去网上查找,特别去标准的网站上可以看到相关的T0,T0.5,T1,T2,T3等分类的方式和应用划分的条件。

1.3.2、c++23的新特性


c++23的新特性就从两个方面来介绍,即语言本身和STL特性两个方面。
A、语言特性
1、显示的this
2、多维数组的支持operator[]
3、size_t的字面量支持
4、浮点字面量
5、假定表达式
6、新的预处理指令
7、Lambda的简化
8、UNICODE转义字符的增强
9、显示的Move
10、CATD的增强
这是看上去相对来说比较明确的新的语言特性,其实还有一些,但最终有多少还要看最终标准的尘埃落定。

B、标准库特性
1、stl的import应用
2、异常和格式化输出
3、协程的std::generator
4、mdspan多数据视图
5、平坦容器
6、堆栈信息库
7、zip系列
8、异质容器成员
9、大量的库的细节的完善和更新以及BUG的FIX

国内的书籍跟进太慢,而且国内的相关文章也比较少,建议还是多看一外文书籍(当然前提是得能看),象最新的c++模板编程就大量使用了新的c++标准,还有c++20的相关书籍,国内很少。当然这也是国内的环境使然,毕竟c++在国内是一门已经不太受欢迎的语言,即使现在有些重新发光的样子,但还得再看看。
后面的文章会对其中的一些特性进行分析说明,这里不再展开说明了。


1.3.3、网友网友对 C++23 讨论


很多网友对 C++23 的改进展开了广泛讨论,
很多网友对此次更新并没有感到那么兴奋。有网友表示很高兴看到 C++23 将带来 C++ 可用性的提升,但和 Python 还差很远。有网友对此甚至表示失望,他认为 C++23 和 C++ 98 相比,并没什么革命性的特性,居然还有人会为此感到兴奋。
有的网友则愿意给 C++23 一个机会。他很久以来一直用 C++,但是他对 C++ 的复杂性感到不满,所以他主要用 C++11。他说现在 C++ 有了模块、概念等新特性,他开始考虑 C++23 是否值得用于新项目。他原本想用 Rust 代替 C++,但是现在他可能会给 C++23 一个机会。有网友认为 C++ 的复杂性是因为它承诺永远能够兼容旧的代码造成的。
还很多网友在评论区对各种编程语言进行了讨论。有网友认为,问题并不是出在语言本身,而取决于你用它来实现什么样的功能。例如,如果你想使用虚幻引擎或编写音频插件,就学习 C++。如果你想玩机器学习,就学好Python。如果你想制作移动应用程序,就学习 Swift 或 Kotlin。

1.3.4、总结


在c++23中大家比较期待的其实是对c++20的一些新标准的完善和最终应用,重点就是协程在STL的应用,标准库的Modules应用,Executors和网络库。不过目前来看,后两个比较麻烦,原来还认为Executors应该是比较容易的。不过,最终结果不出来,还是不敢明确说。标准不断迭代,是个好事情,谁也不愿意看着一幅老面孔不变。
标准制定出来,编译器和IDE的跟进估计会晚上半年到一年,也就是说,真正要用(非试用)得明年了。不过好多编译器会对一些自己的提案中的相关部分或一些有兴趣的部分有支持,这个可以试试,但也是只是试试吧,在实际工程里风险有点大。

二、 C++的优势


2.1 语言的使用广泛度

从排行榜可以看出来,C++依然是属于大头,对于学习C++来说还是有很大的优势。
C++兼容C,学一门等于学两门,不亏;
C++让你成为“黑客”,C++给予了程序员极大的控制力,允许直接操作内存和底层资源。在合法和道德的前提下,C++让你成为一个技术高手,能够创造出令人瞩目的产品(如:Linux操作系统、英雄联盟、浏览器、PS…哪些知名的软件是c++写的?)。
C++学习十分有成就感!
虽然这些都不是很着调,但我们在学习之前,肯定要给自己打气,“工欲善其事必先稳心态”(原句:工欲善其事,必先利其器),人家“王婆婆”卖瓜之前还得先夸夸自己的瓜呢,更何况C++确实是个“好东西”。
C++具体的优势和特性,还得在今后的学习中,慢慢领悟。

2.2 C++的应用领域


游戏开发:著名的游戏引擎Unity3D使用C++作为其核心引擎的开发语言。另外,著名的游戏《英雄联盟》和《CS》也是使用C++进行开发的。
嵌入式系统:无人机制造商DJI的飞控系统是用C++编写的。汽车电子领域中,自动驾驶系统和车载娱乐系统通常也使用C++进行开发。
科学计算和数值分析:开源库Eigen是一个用于线性代数计算的C++库,被广泛用于科学计算和数值分析任务。另外,CERN的粒子物理研究中使用的ROOT数据分析框架也是用C++编写的。
金融和高频交易:高频交易公司使用C++来开发快速而高效的交易系统。例如,金融公司Jane Street就是使用C++作为其主要交易系统的开发语言之一。
图形界面和桌面应用:跨平台的应用开发框架Qt是用C++编写的。许多知名的软件,如Adobe Photoshop、Autodesk Maya和Microsoft Office套件,也使用C++进行桌面应用程序的开发。
数据库系统:开源关系型数据库管理系统MySQL使用C++编写。另外,PostgreSQL、Oracle数据库等也在其代码中使用了C++。

三、 C++学习计划


网上常听闻C++是最难学的语言之一,这是属实的。《程序员》期刊2010年8期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)Effective C++》、《(More)Exceptional C++》、《Effective STL》及《C++编程规范》等,才适宜踏入专业C++开发之路;
第三层次,深入了解C++:关于全局问题可读《深入探索C++对象模型》、《Imperfect C++》、《C++沉思录》、《STL源码剖析》,要挑战智商,可看关于模版及模版元编程的书籍如《C++ Templates》、《C++设计新思维》、《C++模版元编程》;
第四层次,研究C++:阅读《C++语言的设计和演化》、《编程的本质》(含STL设计背后的数学根基)、C++标准文件《ISO/IEC 14882:2003》、C++标准委员会的提案书和报告书、关于C++的学术文献。
就本人现阶段而言,要是能学到第二层次,就已经很不错了。

现在市面上有很多公开的课程,找到适合自己口味的,跟着这些免费课程入门,在这期间加上一定的练习,多多总结,积极学习、消极学习、持续学习。不可操之过急,C++这门语言肯定是需要一定的积累的,不能被网上的“21天”系列迷惑。在有一定基础之后,可以看一些技术书籍,进一步提升自己的水平。

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

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

相关文章

左移测试,如何确保安全合规还能实现高度自动化?

「云原生安全既是一种全新安全理念,也是实现云战略的前提。 基于蚂蚁集团内部多年实践,云原生PaaS平台SOFAStack发布完整的软件供应链安全产品及解决方案,包括静态代码扫描Pinpoint,软件成分分析SCA,交互式安全测试IA…

二、GRE VPN

GRE VPN 1、GRE介绍2、GRE基本原理3、GRE报文格式4、报文在GRE中传输过程5、价值6、Keepalive检测7、GRE应用8、配置GRE隧道8.1、配置绑定GRE协议的接口8.2、配置Tunnel接口8.3、配置Tunnel路由 9、GRE配置举例9.1、GRE静态路由示例9.1.1、路由器运行动态路由协议实现互通9.1.2…

NEFU数字图像处理(3)图像分割

一、图像分割的基本概念 1.1专有名词 前景和背景 在图像分割中,我们通常需要将图像分为前景和背景两个部分。前景是指图像中我们感兴趣、要分割出来的部分,背景是指和前景不相关的部分。例如,对于一张人物照片,人物就是前景&…

mysql迁移data目录(Linux-Centos)

随着时间的推移,mysql的数据量越越大,使用yum默认安装的目录为系统盘 /var/lib/mysql,现重新挂载了一个硬盘,需要做数据目录的迁移到 /mnt/data/。以解决占用系统盘过高情况。 1.强烈建议这种操作。镜像一个一样的Centos系统&…

系统架构设计师-第18章-安全架构设计理论与实践-软考学习笔记

安全架构概述 信息的可用性、元略性、机密性、可控性和不可抵赖性等安全保障显得尤为重要,而满足这些诉求,离不开好的架构设计. 信息安全面临的威胁 常见的安全威胁有以下几种. (1)信息泄露 (2) 破坏信息的元整性: 数据被非授极地进行增删、修改成破坏…

MyBatis无法读取XML中的Method的乌龙事件

事件背景 同事反馈,相同的jar包,在多人本地的电脑、多台服务器中,都是可以正常启动的,只有在其中一台服务器,简称它为A,无法启动,因为启动后的初始化操作中有一个调用mybatis方法的操作&#x…

11.Linux系统:定时任务备份mysql数据库为文件并传输到其他服务器

1. 创建脚本 mysql_dumps.sh内容如下: #!/bin/bash # 查找名称为“mysql_mysql”的容器id CONTAINER_IDdocker ps -a | grep "mysql_mysql" | awk {print $1} | head -n 1 MYSQL_USERNAME"root" MYSQL_PASSWORD"root" FILENAME_SU…

【CSDN 每日一练 ★★☆】【动态规划】最小路径和

【CSDN 每日一练 ★★☆】【动态规划】最小路径和 动态规划 题目 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 示例 1&#x…

我的云栖大会之旅:见证云计算创新的15年

云栖大会,曾经是一次不可思议的科技之旅,却如今已见证了我对云计算世界的15年关注和发展。第一次踏上云栖大会之旅,我记得是在2009年。那时的云计算还是一个新生事物,而云栖大会正是其中的奠基石。 我清楚地记得那个炎热的夏天&am…

ant-design-vue select选择框无法显示placehoder

将绑定的对应值设置成undefined <a-selectv-model:value"formState.classification"option-filter-prop"children"allow-clearplaceholder"商户分类"><a-select-optionv-for"item of Object.values(Const.POINTMERCHNANDISE.TYPE…

R -- 体验 stringdist

文章目录 安装使用stringdist :返回列表example stringdistmatrix &#xff1a;返回矩阵example amatch & ain延伸&#xff1a;距离计算公式Hamming distanceLongest Common Substring distanceLevenshtein distance (weighted)The optimal string alignment distance dosa…

“解耦表示学习”+“交互作用(效应)+权衡 (Trade-off)”是什么?

一、解耦表示学习 一个例子说明问题&#xff1a; 假设我们有一组人脸图像。图像中的每张人脸都可能由多种因子组成&#xff0c;如面部表情、发型、眼镜、性别等。解耦表示学习的目标是找到一种表示方法&#xff0c;其中每一部分的表示只对应于一个因子&#xff0c;如一个特征…

UDP服务端和客户端通信代码开发流程

一、UDP通信 TCP&#xff1a;传输控制协议&#xff0c;面向连接的&#xff0c;稳定的&#xff0c;可靠的&#xff0c;安全的数据集流传递 稳定和可靠:丢包重传 数据有序:序号和确认序号 流量控制:稳定窗口 UDP&#xff1a;用户数据报协议 面向无连接的,不稳定的,不可靠,不安…

JMeter的使用,傻瓜式学习【上】

目录 前言 1、JMeter元件及基本使用作用域&#xff08;简述&#xff09; 1.1、基本元件 1.2、作用域的原则 1.3、元件执行顺序 2、JMeter三个重要组件 2.1、线程组 案例&#xff1a; 2.2、HTTP请求 2.3、查看结果树 响应体中&#xff0c;中文乱码解决方案&#xff1…

docker部署Jenkins(Jenkins+Gitlab+Maven实现CI/CD)

GitLab介绍 GitLab是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务&#xff0c;可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能&#xff0c;能够浏览源代码&#xff0c;管理缺陷和注释。…

学习笔记三十一:k8s安全管理:认证、授权、准入控制概述SA介绍

K8S安全实战篇之RBAC认证授权-v1 k8s安全管理&#xff1a;认证、授权、准入控制概述认证k8s客户端访问apiserver的几种认证方式客户端认证&#xff1a;BearertokenServiceaccountkubeconfig文件 授权Kubernetes的授权是基于插件形成的&#xff0c;其常用的授权插件有以下几种&a…

家庭互动新维度:TikTok的亲子体验

在数字时代&#xff0c;家庭互动的方式正在发生翻天覆地的改变。社交媒体平台TikTok崭露头角&#xff0c;不仅在年轻用户中广受欢迎&#xff0c;还为家庭带来了全新的互动维度。本文将深入探讨TikTok如何成为家庭互动的新元素&#xff0c;以及它如何改变亲子体验。 TikTok&…

“连续的数据类型”与“非连续的数据类型”是什么?

今天读到“不同于以往基于微分的优化思路&#xff0c;基于差分的零阶优化算法更加适合于处理非连续的数据类型&#xff0c;像化学分子的SMILES表示或者多肽的序列表示就是这样的类型。” 特此记录下来 一、连续的数据类型 连续数据类型指的是在其值域内可以任意细分&#xff…

后端神器!代码写完直接调试!

Apipost推出IDEA插件非常省时高效&#xff0c;写完代码直接可以进行调试&#xff0c;而且支持生成接口文档&#xff0c;真是后端神器啊&#xff01; 可以点击下方链接安装更新或在插件商店中搜索安装 下载链接&#xff1a;https://plugins.jetbrains.com/plugin/22676-apipos…

python飞书群机器人通过webhook发送消息

python飞书群机器人通过webhook发送消息 import json import loggingimport requestslogger logging.getLogger(__name__) logging.basicConfig(levellogging.DEBUG)class FeishuTalk:"""飞书群机器人通过webhook发送消息"""def __init__(self…