c++ 各版本特性介绍

c++

C++是一种高级编程语言,以其强大的功能、灵活性和高效性而闻名。它是由Bjarne Stroustrup在20世纪80年代初期在贝尔实验室开发的,作为C语言的一个扩展。C++不仅包含了C语言的所有特性,还引入了面向对象编程(OOP)的概念,包括类、继承、多态和封装。

C++的一些关键特点:

  • 面向对象编程:C++支持类和对象,允许程序员通过封装、继承和多态性来构建复杂的程序。

  • 泛型编程:通过模板,C++支持泛型编程,允许程序员编写与数据类型无关的代码。

  • 内存管理:C++提供了手动内存管理的能力,包括指针和动态内存分配。

  • 异常处理:C++支持异常处理机制,允许程序在遇到错误时以一种结构化的方式进行恢复。

  • 标准模板库(STL):C++的STL提供了一系列的数据结构和算法,如向量(vector)、列表(list)、映射(map)和排序(sort)等。

  • 函数重载:C++允许定义具有相同名称但参数不同的多个函数。

  • 运算符重载:C++允许程序员为用户定义的类型重新定义运算符的行为。

  • 多重继承:C++支持从多个基类继承,虽然这可能导致复杂的设计问题。

  • 模板:模板是C++的一个强大特性,允许程序员定义可以处理多种数据类型的类和函数。

  • 编译时多态:通过函数重载和模板,C++支持在编译时解决多态性。

  • 运行时多态:C++通过虚函数支持运行时多态性。

  • 性能:C++以其高性能而著称,通常用于需要快速执行和低级别硬件操作的应用程序。

  • 跨平台:C++可以在多种操作系统和硬件平台上编译和运行。

C++广泛应用于系统软件、游戏开发、嵌入式系统、实时系统、模拟科学计算、生物信息学、高频交易等领域。随着C++标准的不断更新,C++语言持续发展,引入了现代化的特性,如自动存储期管理、基于概念的模板编程、并发编程支持等,以适应现代软件开发的需求。

c++版本演变

在这里插入图片描述

c++各版本主要特点

c++03

  • 值初始化(Value-initialization):C++03引入了值初始化的概念,这是对对象进行初始化的一种方式,它使用默认值对对象进行初始化。

  • std::auto_ptr:虽然std::auto_ptr在C++98中已经存在,但C++03对其进行了改进,使其成为标准库的一部分。

  • 成员模板:C++03对成员模板的支持进行了改进,允许更灵活地使用模板类。

  • 命名空间别名:C++03允许使用namespace别名,使得使用长命名空间更为方便。

  • 类型转换运算符:C++03明确了static_cast、dynamic_cast、const_cast和reinterpret_cast的使用,这些在C++98中已经被引入,但在C++03中得到了进一步的明确和标准化。

  • bool类型:C++03继续支持bool类型,并对其进行了标准化。

  • 异常处理:C++03对异常处理机制进行了标准化,确保了不同平台上的一致性。

  • RTTI(运行时类型识别):C++03继续支持RTTI机制,并对其进行了标准化。

  • 标准库的改进:C++03对标准库进行了一些改进和扩展,提高了库的健壮性和可用性。

  • 多重继承:C++03继续支持多重继承,并对其进行了标准化。

c++11

  • 自动类型推导(auto):允许编译器自动推断变量类型,简化了模板编程和迭代器的使用。

  • 基于范围的for循环(Range-based for loop):提供了一种新的遍历容器和数组的方式,使代码更加简洁。

  • 统一的初始化(Uniform Initialization):使用花括号{}进行初始化,提供了一种一致的初始化语法,适用于基本类型、类类型、数组等。

  • nullptr:引入了一个新的字面量nullptr,用于表示空指针,提高了代码的类型安全性。

  • 智能指针(Smart Pointers):如std::unique_ptr、std::shared_ptr和std::weak_ptr,提供了自动内存管理,减少了内存泄漏的风险。

  • Lambda表达式:允许在代码中定义匿名函数,简化了对函数对象的使用,特别是在STL算法中的应用。

  • 右值引用(Right-Value References):使用&&引入了右值引用,支持移动语义(Move Semantics)和完美转发(Perfect Forwarding),提高了性能。

  • 变参模板(Variadic Templates):允许模板接受任意数量的模板参数,提供了更大的灵活性。

  • 类型别名(Type Alias):使用using关键字简化复杂的类型定义,提高代码的可读性。

  • constexpr函数:允许在编译时计算某些值,提高了程序的性能。

  • 显式虚函数重载(override)和final关键字:提供了更好的重写控制和类继承的终止声明。

  • 标准库增强:包括新的线程库、原子操作、条件变量、std::async、std::future等,为并发编程提供了更好的支持。

  • 正则表达式库:提供了对正则表达式的支持,使得字符串处理更加强大和灵活。

  • 用户定义字面量(User-Defined Literals):允许开发者定义自己的字面量后缀,扩展了语言的表达能力。

  • 强类型枚举(enum class):引入了作用域枚举,提高了枚举类型的类型安全性。

  • 委托构造函数(Delegating Constructors):允许一个构造函数调用同一个类中的另一个构造函数,减少了代码重复。

  • 继承构造函数:允许派生类直接使用基类的构造函数。

  • noexcept关键字:用于声明函数不会抛出异常,提高了代码的异常安全性。

  • std::move和std::forward:支持移动语义和完美转发,优化了临时对象的处理。

  • 静态断言(static_assert):在编译时进行断言检查,确保模板参数和常量表达式的正确性。

c++14

  • 变量模板(Variable Templates):允许模板定义不仅适用于函数和类,也适用于变量,从而在编译时提供更多灵活性。

  • 泛型Lambda表达式(Generic Lambdas):在Lambda表达式中可以使用auto关键字来推导参数类型,使得Lambda表达式更加通用。

  • Lambda表达式的初始化捕获:允许在Lambda表达式中初始化捕获的变量,例如 [&capture = expression] {}。

  • 函数返回类型推导(Auto Return Type Deduction):允许使用auto关键字自动推导函数的返回类型,简化了模板函数的声明。

  • 二进制字面量(Binary Literals):支持使用0b前缀表示二进制数值,例如0b1010。

  • 数字分隔符(Digit Separators):允许在数值字面量中使用单引号’作为分隔符,提高大数值的可读性,例如1’000’000。

  • constexpr的增强:放宽了对constexpr函数的限制,允许在其中使用循环和条件语句,使得更多的编译时计算成为可能。

  • std::make_unique和std::make_shared:新的标准库函数,提供了一种安全且方便的方法来创建std::unique_ptr和std::shared_ptr智能指针。

  • std::shared_timed_mutex和std::shared_lock:引入了新的互斥机制,允许多个线程同时读取,但在写入时需要独占访问。

  • std::quote:用于处理字符串转义的标准库组件。

  • [[deprecated]]属性:允许开发者标记某些函数或类为已弃用,编译器会在这些实体被使用时发出警告。

  • [[maybe_unused]]属性:用于标识可能未使用的变量或实体,以避免编译器警告。

  • std::exchange:一个新标准库函数,用于交换两个变量的值,并返回交换前的旧值。

  • 统一初始化(Uniform Initialization):使用花括号{}进行初始化的方式被统一应用于直接初始化、复制初始化和列表初始化。

c++17

  • 结构化绑定(Structured Bindings):允许从元组、对或类中绑定多个变量,简化了对复杂结构的访问。

  • if-initializer语句:在if语句中允许初始化变量,这使得代码更加紧凑并且作用域受限。

  • 内联变量(Inline Variables):允许在头文件中直接初始化一些变量,提高了代码的可维护性。

  • 折叠表达式(Fold Expressions):允许对参数包使用二元操作符进行折叠计算,简化了可变参数模板的使用。

  • 类模板参数推导(Class Template Argument Deduction):允许推导类模板的参数类型,使得模板类的使用更加方便。

  • constexpr lambda:允许在编译时执行lambda表达式,扩展了constexpr关键字的用途。

  • namespace嵌套定义:简化了嵌套namespace的使用,使得代码更加清晰。

  • __has_include预处理表达式:提供了一种检查特定头文件是否可用的方法。

  • lambda表达式捕获*this:允许lambda捕获对象的副本,而不是对象的引用,这在多线程环境中特别有用。

  • std::any, std::optional, std::variant:引入了新的标准库组件,提供了类型安全和更丰富的编程模型。

  • std::filesystem:提供了一套完整的文件系统操作库,简化了文件和目录的访问。

  • std::shared_mutex:引入了读写锁,增加了并发编程的选择。

  • 并行算法库:为标准库算法提供了并行执行的能力,提高了性能。

  • noexcept成为类型系统的一部分:增强了对异常安全性的控制。

  • [[nodiscard]]属性:用于标记函数,指示调用者应该检查函数的返回值。

  • maybe_unused属性:用于标识未使用的变量或实体,以避免编译器警告。

  • if constexpr:允许编译时根据条件包含或排除代码块,优化了模板编程。

  • std::string_view:提供了一种非拥有(non-owning)的字符串视图,用于避免不必要的字符串拷贝。

c++20

  • 概念(Concepts):允许在模板编程中定义和检查类型属性,使得模板的约束更加清晰和直观。

  • 协程(Coroutines):提供了一种异步编程模型,允许编写非阻塞的、基于生成器的代码,简化了异步编程的复杂性。

  • 范围(Ranges):提供了一种新的抽象,用于处理容器和迭代器之间的操作,简化了数据集合的遍历和处理。

  • 三向比较运算符(<=>):引入了新的比较运算符,用于比较两个对象的顺序关系,提供了一种统一的比较方法。

  • auto 作为函数参数类型:C++20 允许在函数声明中直接使用 auto 作为参数类型,简化了模板函数的定义。

  • 模块(Modules):C++20 引入了模块,这是一种新的编译单元,可以提高编译速度并改善代码的组织结构。

  • constexpr 变得更加强大:C++20 放宽了对 constexpr 函数的限制,允许更复杂的编译时计算。

  • 指定迭代范围的 for 循环:C++20 引入了指定范围的 for 循环语法,支持自定义的初始化列表。

  • 特性的枚举:C++17 支持对枚举成员进行特性声明,C++20 在 switch 枚举使做出了优化,可以通过 using enum 的方式简化枚举类型的声明。

  • 安全的联合体 std::variant:C++17 引入了 std::variant,提供类型安全的联合体,C++20 进一步优化了其使用。

  • 概念支持的配置:一些开发环境如 CLion 支持配置 Concepts 特性,以便开发者能够使用 C++20 的概念进行编程。

参考

  • 论文:《Thriving in a Crowded and Changing World: C++ 2006–2020》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TCP四次挥手——断开连接 滑动窗口-流量控制

四次挥手 在TCP的四次挥手中&#xff0c;其重要作用就是释放客户端和服务器的连接。 这里的一些参数非常重要&#xff0c;因为这些参数的作用是为了表达TCP四次挥手断开连接的过程。 其中的参数如下 1.FIN&#xff1a;FIN (Finish) 是TCP协议中的一个标志位&#xff0c;用于…

基于spingboot,vue线上辅导班系统

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 权限划分&#xff1a;用户&#xff0c;管理员 具有前后台展示&#xff0c;前台供用户使用&#xff1b;用户具有自己的后台&#xff0c;查看自己的老师课程等&#xff1b;管理员具有最大的权限后台。 用户&#xff1a…

76岁林子祥升级做爷爷,亲自为孙女取名

林子祥与前妻吴正元的儿子&#xff0c;现年39岁的林德信入行以来绯闻不少&#xff0c;自与圈外女友Candace拍拖后便修心养性&#xff0c;去年他已经低调与拍拖5年多Candace完婚&#xff0c;正式步入人生另一阶段。 昨日&#xff08;5月12日&#xff09;林德信借母亲节这个温馨日…

Linux - make与makefile

文章目录 什么是make和makefile如何使用依赖关系 和 依赖方法伪目标 写个程序-进度条换行和回车的区别 什么是make和makefile make是一个命令 makefile是一个文件 这就是make和makefile的本质 make和 ll , pwd ,su 一样都是命令 makefile和 test &#xff0c; test.c 一样都是…

vue2人力资源项目8员工详情

页面结构 <template><div class"dashboard-container"><div class"app-container"><div class"edit-form"><el-form ref"userForm" label-width"220px"><!-- 姓名 部门 --><el-row…

C#之如何判断数据类型

一、GetType方法 a.GetType()&#xff1a;获取当前变量的类型对象 string str "Hello World";Console.WriteLine(str.GetType()); 结果: 二、typeof方法 typeof(Int)&#xff1a;获取的是Int类型的类型对象 int num 10;Console.WriteLine(num.GetType() typeof(i…

常见磁盘分区问题

给磁盘分区有几个主要的原因&#xff1a; 组织和管理数据&#xff1a;分区可以帮助用户更好地组织和管理数据。例如&#xff0c;你可以在一个分区上安装操作系统&#xff0c;而在另一个分区上存储个人文件。这样&#xff0c;即使操作系统崩溃或需要重新安装&#xff0c;你的个…

【cmake】Windows 环境下编译第三方依赖源码(以编译Xerces库为例)

第三方依赖源码的编译分为两种&#xff0c;一种是使用 Configure 脚本编译&#xff0c;另一种是使用 CMakeLists.txt 编译。Xerces 3.2.3 的编译方式是 CMakeLists.txt 脚本编译。 必要软件&#xff1a; CMake &#xff08;CMake | Download&#xff09;Visual Studio 2019&a…

java版数据结构:堆,大根堆,小根堆

目录 堆的基本概念&#xff1a; 如何将一个二叉树调整成一个大根堆&#xff1a; 转成大根堆的时间复杂度 根堆中的插入&#xff0c;取出数据&#xff1a; 堆的基本概念&#xff1a; 堆是一种特殊的树形数据结构&#xff0c;它满足以下两个性质&#xff1a; 堆是一个完全二叉…

Mirror从入门到入神

Mirror从入门到成神 文章目录 Mirror从入门到成神简介NetworkClientRegisterPrefabConnect (string address)Disconnect ()activeactiveHost NetworkServerSpawn 简介 Mirror是一个unity网络同步框架&#xff0c;基于MonoBehaviour生命周期的回调的基础上进行数值的同步&#…

刷题之找到字符串所有字母异位词

找到字符串所有字母异位词 滑动窗口。滑动窗口大小为待比较数组的大小。 class Solution { public:vector<int> findAnagrams(string s, string p) {//滑动窗口vector<int>result;if(s.size()<p.size())return result;vector<int>pnum(26,0);//记录p的字…

[第五空间 2021]WebFTP

目录扫描git泄露phpinfo.php 一开始想到是sql注入&#xff0c;但是不行。目录扫描&#xff0c;发现 .git 和 phpinfo.php 访问phpinfo.php&#xff0c;ctrlf 搜索 flag&#xff0c;找到 flag。

【风变】Python爬虫精进复习-20240430

参考笔记 下面给出一个巨佬学习风变pyhton基础语法和爬虫精进的笔记&#xff08;链接&#xff09; 风变编程笔记(一)-Python基础语法 风变编程笔记(二)-Python爬虫精进 技术总结 request BeautifulSoup selenium BeautifulSoup 练习0-1&#xff1a;文章下载 import requ…

TypeScript学习日志-第二十六天(weakMap,weakSet,set,map)

weakMap,weakSet,set,map 一、set set 的基本用法如下&#xff1a; 二、map map 与 set 的 区别 就是 map 的 key 可以是引用类型 object array , map 的添加时使用 set 三、weakmap weakset weakmap和weakset 都是弱项 弱引用 其键必须是引用类型&#xff0c;不能是其它类…

【C/C++笔试练习】DNS劫持、三次握手、TCP协议、HTTPS、四次挥手、HTTP报文、拥塞窗口、POP3协议、UDP协议、收件人列表、养兔子

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;DNS劫持&#xff08;2&#xff09;三次握手&#xff08;3&#xff09;TCP协议&#xff08;4&#xff09;HTTPS&#xff08;5&#xff09;四次挥手&#xff08;6&#xff09;HTTP报文&#xff08;7&#xff09;拥塞窗口&a…

网优干货:ACP交付详解版(3)

1. 全局指标分析 点击GIS页面左侧的 按钮&#xff0c;展开指标树&#xff0c;可查看各项优化目标的当前值、预测值和差值。 拖动指标树中的某个指标到GIS页面&#xff0c;可呈现该指标的整体分布。GIS页面共有两个半屏&#xff0c;用户可以做优化前后相同指标的对比&#xff0c…

从CSDN搬家到微信公众号

博主将会在微信公众号里不断输出精品内容&#xff0c;陪伴大家共同成长。 如果你对博主的经历感兴趣&#xff0c;或者对博主的IT技术感兴趣&#xff0c;欢迎关注我的微信公众号&#xff0c;阅读我的技术文章&#xff0c;免费获取各种IT资源。也可以加我的微信成为我的好友&…

【Javaer学习Python】 1、Django安装

安装 Python 和 PyCharm 的方法就略过了&#xff0c;附一个有效激活PyCharm的链接&#xff1a;https://www.quanxiaoha.com/pycharm-pojie/pycharm-pojie-20241.html 1、安装Django # 安装Django pip install Django# 查看当前版本 python -m django --version 5.0.62、创建项…

ollama离线部署llama3(window系统)

首先介绍下ollama是什么&#xff1f;Ollama是一个开源的大型语言模型服务工具&#xff0c;旨在为用户提供本地化的运行环境&#xff0c;满足个性化的需求。具体来说&#xff0c;Ollama是一个功能强大的开源框架&#xff0c;可以简化在Docker容器中部署和管理大型语言模型&a…

24深圳杯C题18页高质量论文+可执行代码+图表

比赛题目的完整版思路可执行代码数据参考论文都会在第一时间更新上传的&#xff0c;大家可以参考我往期的资料&#xff0c;所有的资料数据以及到最后更新的参考论文都是一次付费后续免费的。注意&#xff1a;&#xff08;建议先下单占坑&#xff0c;因为随着后续我们更新资料数…