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.hqwc.cn/news/700804.html

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

相关文章

Echarts结课之小杨总结版

Echarts结课之小杨总结版 前言基础回顾框架sale框架代码&#xff1a; user框架基础代码&#xff1a; inventory框架基础代码&#xff1a; total框架基础代码&#xff1a; 基础设置1.标题(Title)2.图例(Legend)实现 3.工具提示(Tooltip)实现 4.X轴(X Axis) 和 Y轴(Y Axis)5.数据…

洗地机哪款好用?希亦、追觅、顺造、米家等高品质洗地机推荐

家用洗地机已经成为家庭清洁的重要利器&#xff0c;其多功能性能帮助您轻松应对各种清洁任务&#xff0c;从而保持家居环境的清洁整洁。然而&#xff0c;市场上品牌繁多、功能各异的洗地机让人眼花缭乱。为了帮助大家做出明智的选择&#xff0c;我们将在本文中提供全面的选购指…

linux安装Openresty

安装必要的依赖库 指定仓库地址 下载openresty 添加环境变量 vi /etc/profile i export NGINX_HOME/usr/local/openresty/nginx/ export PATH${NGINX_HOME}/sbin:$PATH esc :wq source /etc/profile #启动 nginx # 重启 nginx -s reload #关闭 nginx -s stop

vue获取路由的值

1&#xff0c;此方法获取到请求地址后面的值 如 /name123&age12 2&#xff0c;此方法获取到请地址&#xff1f;后面的值 例如?name123&age12 二者的区别&#xff0c;第一个是直接在路径后面拼接&#xff0c;第二种就是正规的http请求。 路径带&#xff1f;号的

sql实践

1.从excel导入数据 在excel导入数据时要先在数据库中创建对应的数据库表 CREATE TABLE your_table_name (crawl_datetime DATE,url CHAR(255),company_name CHAR(255),company_size CHAR(255),company_type CHAR(255),job_type CHAR(255),job_name CHAR(255),edu CHAR(255),e…

idea控制台日志控制

1.清除控制台log日志 测试的时候&#xff0c;控制台打印的日志比较多&#xff0c;速度有点慢而且不利于查看运行结果&#xff0c;所以接下来我们把这个日志处理下: 取消初始化spring日志打印&#xff0c;resources目录下添加logback.xml&#xff0c;名称固定&#xff0c;内容如…

springboot月度员工绩效考核管理系统

摘要 本月度员工绩效考核管理系统采用java语言做为代码编写工具&#xff0c;采用mysql数据库进行系统中信息的存储与处理。框架采用springboot。 本系统的功能分为管理员和员工两个角色&#xff0c;管理员的功能有&#xff1a; &#xff08;1&#xff09;个人中心管理功能&am…

平地惊雷,GPT-4o 凌晨震撼发布

GPT-4o 今日凌晨&#xff0c;OpenAI 2024 年春季发布会召开&#xff0c;OpenAI 通过短短 28 分钟的发布会&#xff0c;发布了「再次震惊世界」的 GPT-4o&#xff0c;其中 o 是指 omni&#xff08;全能&#xff09;的意思。 一款「全新交互&#xff08;支持 文本/音频/视频 组合…

PuLID: 图像背景、光线、风格等均保持高度一致图像生成工具,附本地一键包

PuLID是一种无需调优的ID定制方法。PuLID保持了高的ID保真度&#xff0c;同时有效地减少了对原始模型行为的干扰。 只需要提供一张照片&#xff0c;就可以生成高还原度的各种风格的图像。 使用方法&#xff1a;解压一键包&#xff0c;双击一键启动 点击ID图像&#xff08;主…

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

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

TikTok机房ip好还是住宅ip好?

住宅ip比较好&#xff0c;机房数据中心IP高效、低价&#xff0c;所以使用的人多且用处复杂&#xff0c;这类ip极大可能存在滥用的黑历史&#xff0c;通过此类ip访问tiktok&#xff0c;被禁止的可能性更高&#xff0c;更容易被拉入黑名单。所以我们推荐tiktok独享原生ip搭建节点…

Service Worker的生命周期和全局对象和API

Service Worker的生命周期和全局对象和API 当我们注册了Service Worker后&#xff0c;它会经历生命周期的各个阶段&#xff0c;同时会触发相应的事件。整个生命周期包括了&#xff1a;installing --> installed --> activating --> activated --> redundant。当Se…