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》

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

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

相关文章

基于Vue3+ElementPlus项目,复制文字到剪贴板功能实践指南,揭秘使用js-tool-big-box工具库的核心优势

在前端开发项目中&#xff0c;很多时候有那么一个场景&#xff0c;就是要求将一段文案复制下来&#xff0c;这段文案可能是一串很长的id&#xff0c;可能是一条命令语句&#xff0c;可能是一小段文案&#xff0c;复制到剪贴板上。这样有利于用户复制到其他地方去&#xff0c;使…

微软必应bing国内官方代理商,广告账户如何开户?

微软必应Bing作为全球知名的搜索引擎之一&#xff0c;其广告平台为众多企业提供了广阔的市场空间和精准的推广机会。对于中国内地的企业而言&#xff0c;通过必应Bing开展国内广告推广不仅能够触及更广泛的潜在客户群体&#xff0c;还能有效提升品牌影响力。通过微软必应Bing国…

搜索引擎的设计与实现(三)

目录 5 系统详细实现 5.1实现环境配置 5.2功能实现 5.2.1 建立索引 5.2.2 文件搜索实现 5.2.3 数据库的连接配置 5.2.4 数据库搜索实现 5.2.5 后台数据编辑实现 前面内容请移步 搜索引擎的设计与实现&#xff08;二&#xff09; 免费源代码&毕业设计论文 搜索…

git-删除workspace.xml的跟踪

问题描述 .gitignore 文件内容如下&#xff1a; .pyc *.pyc user_files/ .vscode/ __pycache__//.idea/misc.xml /.idea/modules.xml /.idea/inspectionProfiles/profiles_settings.xml /.idea/inspectionProfiles/Project_Default.xml /.idea/batrp_webbackend-server-dev.i…

NARUTO 复现记录

1 环境配置 下载项目&#xff0c;一定要 git 下载全项目&#xff0c;下载完后要检查third_parities 里面的coslam和neural_slam_eval 文件全不全。 git clone --recursive https://github.com/oppo-us-research/NARUTO.git 环境配置 注意 bash scripts/installation/conda…

番外篇 | 利用PyQt5+YOLOv5来搭建目标检测系统(附可视化界面+功能介绍+源代码)

前言:Hello大家好,我是小哥谈。PyQt5是一个Python绑定的Qt库,是用于创建图形用户界面(GUI)和其他应用程序组件的工具包。PyQt5提供了许多GUI元素,如按钮、文本框、标签等,也提供了许多Qt的功能,如网络、数据库、XML等。通过PyQt5可以在Python中使用Qt的丰富功能和强大的工…

克服亏损的负面影响 学学现货白银止损的方法

一个多月以前&#xff0c;现货黄金的上涨还十分强劲&#xff0c;一度还逼近历史的高位30大关。但是我们看近半个月以来&#xff0c;现货白银价格出现了调整。很多在高位买入的投资者都承受了较大的亏损&#xff0c;这时候就凸显出了现货白银止损的作用。如果投资者能够通过近期…

Git 基础使用(2) 分支管理

文章目录 分支概念分支使用查看分支分支创建分支切换分支合并合并冲突分支删除 分支管理快进模式分支策略内容保存错误处理 分支概念 &#xff08;1&#xff09;分支概念 Git分支是指在版本控制系统Git中&#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…

【数据结构】二叉树(Binary Tree)

文章目录 一、树的概念及结构二、二叉树的概念及结构1.二叉树的概念2.特殊的二叉树3.二叉树的性质 三、二叉树的存储顺序存储链式存储 四、二叉树的实现1.创建二叉树2.二叉树的遍历前序遍历中序遍历后序遍历层序遍历根据遍历顺序创建二叉树 3.二叉树的基本操作1.总结点个数2.二…

ctfshow之_萌新web9至web10

一、访问在线靶场ctfshow 1、web9 如下图所示&#xff0c;进入_萌新赛的web9问题&#xff0c;题目提醒flag在config.php中&#xff1a; 如上图所示&#xff0c;可以get传参&#xff0c;且传入的参数需要正则匹配system、exec、highlight&#xff0c;且不区分大小写&#xff0…

C++设计模式|创建型 5.原型模式

1.什么是原型模式&#xff1f; 原型模式⼀种创建型设计模式&#xff0c;该模式的核⼼思想是基于现有的对象创建新的对象&#xff0c;⽽不是从头开始创建。 在原型模式中&#xff0c;通常有⼀个原型对象&#xff0c;它被⽤作创建新对象的模板。新对象通过复制原型对象的属性和状…

Mac IDEA 自动补全mybatis sql语句

导航 Mac IDEA 自动补全mybatis sql语句一、点击IDEA 右侧Database选项二、选择添加对应数据库三、输入数据库信息和方案四、输入数据库信息和方案五、成功 Mac IDEA 自动补全mybatis sql语句 背景&#xff1a; 想在Mapper中&#xff0c;能够实现自动检索数据库表和对应的字段…

web前端之sass中的颜色函数、active按钮激活、hover鼠标悬浮、disabled禁用、scss循环、css

MENU 效果图htmlsassscss编译后的css页面css 效果图 注意查看蓝色按钮。 html <div class"box"><button class"btn type_1">按钮</button><button class"btn type_2">按钮</button><button class"btn ty…

一文读懂通用漏洞评分系统CVSS4.0:顺带理清CVE、CWE及其与CVSS之间的关系

事件响应和安全团队论坛 (FIRST&#xff0c;Forum of Incident Response and Security Teams) 于 2023 年 11 月 1 日正式推出第四版通用漏洞评分系统 (CVSS 4.0&#xff0c;Common Vulnerability Scoring System version 4.0)。CVSS 4.0 是评估计算机系统安全漏洞严重性的行业…

C++ 多态性

一 多态性的分类 编译时的多态 函数重载 运算符重载 运行时的多态 虚函数 1 运算符重载的引入 使用C编写程序时&#xff0c;我们不仅要使用基本数据类型&#xff0c;还要设计新的数据类型-------类类型。 一般情况下&#xff0c;基本数据类型的运算都是运算符来表达&#x…

【C++】详解C++的模板

目录 概念 ​编辑 语法 函数模板 类模板 非类型模板参数 模板的特化 函数模板特化 类模板特化 全特化 偏特化 分离编译 概念 模板是C中非常厉害的设计&#xff0c;模板把通用的逻辑剥离出来&#xff0c;让不同的数据类型可以复用同一种模板的逻辑&#xff0c;甚至可以…

PHP黑魔法之md5绕过

php本身是一种弱语言,这个特性决定了它的两个特点: 输入的参数都是当作字符串处理变量类型不需要声明,大部分时候都是通过函数进行类型转化php中的判断有两种: 松散比较:只需要值相同即可,类型不必相同,不通类型比较会先转化为同类型,比如全数字字符串和数字比较,会比…

凸优化理论学习三|凸优化问题(一)

系列文章目录 凸优化理论学习一|最优化及凸集的基本概念 凸优化理论学习二|凸函数及其相关概念 文章目录 系列文章目录一、优化问题&#xff08;一&#xff09;标准形式的优化问题&#xff08;二&#xff09;可行点和最优点&#xff08;三&#xff09;局部最优点&#xff08;四…

《Python编程从入门到实践》day28

# 昨日知识点回顾 安装Matplotlib 绘制简单的折线图 # 今日知识点学习 15.2.1 修改标签文字和线条粗细 # module backend_interagg has no attribute FigureCanvas. Did you mean: FigureCanvasAgg? # 解决办法&#xff1a;matplotlib切换图形界面显示终端TkAgg。 #…