c++ 各版本特性介绍

news2024/11/18 1:27:52

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.coloradmin.cn/o/1676051.html

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

相关文章

Poe是什么?怎样订阅Poe?

Poe&#xff08;全称“开放探索平台”&#xff0c;Platform for Open Exploration&#xff09;是一款由Quora开发的移动应用程序&#xff0c;于2022年12月推出。该应用程序内置建基于AI技术的聊天机器人&#xff0c;可供用户向机器人询问专业知识、食谱、日常生活&#xff0c;甚…

智能AI数字人系统 打造无人直播间 主播形象任意选择!

系统概述 智能AI数字人系统是一种结合人工智能、计算机图形学、语音合成等技术的综合性系统。该系统能够模拟人类的外貌、行为和语言&#xff0c;为用户提供逼真的交互体验。在无人直播间场景下&#xff0c;智能AI数字人系统可以扮演主播角色&#xff0c;与观众进行实时互动&a…

Jenkins构建流程

Jenkins是DevOps【(Development和Operations的混成词&#xff09;是一种重视“软件开发人员&#xff08;Dev&#xff09;”和“IT运维技术人员&#xff08;Ops&#xff09;”之间沟通合作的文化、运动或惯例)】的重要一环&#xff0c;是一款开源的CI&CD软件。也就是持续集成…

MongoDB 推出新项目,助力企业构建生成式 AI 现代应用程序

MongoDB AI Applications Program可为组织提供战略路线图、行业专业知识及所需技术&#xff0c;加速从构思到大规模部署生成式 AI 应用程序 MongoDB (纳斯达克股票代码&#xff1a;MDB) 近日宣布推出 MongoDB AI Applications Program (MongoDB AI应用项目&#xff0c;简称&am…

【PostgreSQL支持中文的全文检索插件(zhparser)】

PostgreSQL本身是支持全文检索的&#xff0c;提供两个数据类型&#xff08;tsvector,tsquery&#xff09;&#xff0c;并且通过动态检索自然语言文档的集合&#xff0c;定位到最匹配的查询结果。其内置的默认的分词解析器采用空格进行分词&#xff0c;但是因为中文的词语之间没…

使用java.io库序列化Java对象

在我们使用诸如Redis这类缓存系统时&#xff0c;我们往往会存在如下需求&#xff1a;将Java对象保存到Redis缓存中&#xff0c;然后在其他机器上还原回来。 Json方案 我们可以引入Json库等方式&#xff0c;将Java对象序列化为Json字符串来实现这个目的&#xff0c;但是这样的…

【JS面试题】this

this取什么值&#xff0c;是在函数执行的时候确定的&#xff0c;不是在函数定义的时候确定的&#xff01; this的6种使用场景&#xff1a; ① 在普通函数中使用&#xff1a;返回window对象 ② 使用call apply bind 调用&#xff1a;绑定的是哪个对象就返回哪个对象 ③ 在对象…

IP应用场景查询API接口

IP应用场景查询API接口指的是输入IP地址&#xff0c;查询IP应用场景信息。那么IP地址应用场景查询接口如何对接呢&#xff1f; 首先我们找到一家有IP地址应用场景查询API的服务商数脉API,然后注册账号&#xff0c;购买免费套餐 接下来就需要技术同学把IP应用场景查询接口对接到…

【线性系统理论】笔记一

一&#xff1a;状态空间表达式 电路系统状态空间描述列写 1&#xff1a;选取状态变量 状态变量定义&#xff1a;线性无关极大组属性。 2&#xff1a;列出电路原始回路方程 ps&#xff1a;状态变量有两个&#xff0c;理论上需要列写2个方程 3&#xff1a;规范形势 4&#xf…

比大小(打擂台)(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明比较大小函数max; int max(int a, int b);int main() {//初始化变量值&#xff1b;int i, n, m, a[10];//填充数组&#xff1b;printf("请输入10个数…

注意力机制篇 | YOLOv8改进之在C2f模块引入反向残差注意力模块iRMB | CVPR 2023

前言:Hello大家好,我是小哥谈。反向残差注意力模块iRMB是一种用于图像分类和目标检测的深度学习模块。它结合了反向残差和注意力机制的优点,能够有效地提高模型的性能。在iRMB中,反向残差指的是将原始的残差块进行反转,即将卷积操作和批量归一化操作放在了后面。这样做的好…

一台linux通过另一台linux访问互联网-TinyProxy

参考&#xff1a; https://blog.csdn.net/weixin_41831919/article/details/113061317https://www.yuncongz.com/archives/1.htmlhttps://blog.csdn.net/aoc68397/article/details/101893369 环境&#xff1a;ubuntu 18.04 机器1: IP 219.216.65.252 (可以访问外网) 机器2: IP…

下单制造fpc的工艺参数

FPC工艺简介 - 百度文库 (baidu.com) FPC工艺参数 - 豆丁网 (docin.com) FPC柔性线路板的主要参数.ppt (book118.com) 捷多邦&#xff1a; 华秋&#xff1a; 背胶&#xff1a; FPC板背胶是可以粘接在光滑表面的一种薄型胶带&#xff0c;可以在狭小以及光滑的表面上用来提供高…

【IDE】com.intellij.debugger.engine.evaluation.EvaluateException

目录标题 报错重现代码分析解决方式 报错重现 Error during generated code invocation com.intellij.debugger.engine.evaluation.EvaluateException: Method threw java.lang.NullPointerException exception.代码分析 //ls来自上下文 ls.stream().map(m->m.getRewardTy…

搞懂Docker(十)- 优化创建镜像

获取示例程序 示例程序 或者 示例程序 获取示例程序程序结构如下├── getting-started-app/ │ ├── package.json │ ├── README.md │ ├── spec/ │ ├── src/ │ └── yarn.lock优化创建镜像 使用docker image history命令,可以查看创建镜像里的每一层的信息…

Java面试八股文(SpringCloud篇)

****************************************************

AI大模型日报#0514:OpenAI GPT-4o震撼发布、我是如何赢得GPT-4提示工程大赛冠军的

导读&#xff1a;欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了今日要点以及每条资讯的摘要。《AI大模型日报》今日要点&#xff1a;OpenAI在春季新品发布会上推出全能模型GPT-4o及桌面App&#xff0c;颠覆科技界。GPT-4o…

很难找到全的!150个软件测试领域专业术语汇总

1. 单元测试&#xff08;Unit Testing&#xff09;&#xff1a;对软件中的最小功能单元&#xff08;通常是函数或方法&#xff09;进行测试&#xff0c;以验证其是否按预期工作。 2. 集成测试&#xff08;Integration Testing&#xff09;&#xff1a;测试不同模块之间的交互…

Linux内核发送网络数据

前言 我们开始今天对 Linux 内核⽹络发送过程的深度剖析。还是按照我们之前的传统&#xff0c;先从⼀段代码作为切⼊。 上述代码中&#xff0c;调⽤ send 之后内核是怎么样把数据包发送出去的。本⽂基于Linux 3.10&#xff0c;⽹卡驱动采⽤Intel的igb举例。 基础框架 我们看…

汇聚荣科技:拼多多开店没有流量应该怎么办?

拼多多开店没有流量是一个常见的问题&#xff0c;许多新手商家都会遇到这样的困境。那么&#xff0c;如何解决这个问题呢?下面从四个方面进行详细阐述。 一、优化店铺和商品 首先&#xff0c;要确保店铺和商品的质量。店铺要有自己独特的风格和特色&#xff0c;商品要有高质量…