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天”系列迷惑。在有一定基础之后,可以看一些技术书籍,进一步提升自己的水平。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值