C++98
C++98,也被称为ISO/IEC 14882:1998,是C++语言的一个标准版本。它是C++标准的第一个版本,于1998年发布,包括了许多C++语言的特性和基础库的定义。
类和对象:C++98拓展了C语言,使其具有类和面向对象的特性。程序员可以使用类、构造函数和析构函数、继承、成员函数、访问控制等来设计和实现类和对象。
泛型编程:C++98提供了模板编程的支持,允许开发者写出可适用于多种类型的通用算法和数据结构。
异常处理:与C语言不同,C++98引入了异常处理机制,允许程序员在程序出现异常时终止程序并提供可读的错误信息。
标准模板库:C++98标准库是一个包含数据结构、容器、算法、迭代器等模板类和函数的库。其中,STL中的迭代器、容器、算法的概念成为了C++核心思想之一。
类型转换:C++98在类型系统方面有比C语言更加严格的控制。其中,包括隐式类型转换,如使用int数据类型的变量赋值给double类型的变量时会自动执行类型转换。
多线程:C++98没有对多线程提供原生支持,但是它提供了互斥量和条件变量等同步原语,可以帮助程序员手动实现多线程。
内存管理:C++98没有提供垃圾回收机制,而是让开发者自己管理内存。它提供了new和delete操作符等手动管理内存的方式。
C11
C11感觉是一门新语言,
C++11是C++语言的一次重大更新,它引入了许多新特性,旨在提高开发效率、增强语言的表达能力和改善程序性能。
1. nullptr:`nullptr`是用来替代NULL的新的空指针字面量,它类型安全,可以避免NULL和0之间的歧义。
2. 类型推导:C++11引入了`auto`关键字和`decltype`关键字,使得编译器能够自动推导变量的类型,简化了代码的编写。
3. 基于范围的for循环:这种新的for循环语法简化了容器和数组的遍历,使代码更加简洁和直观。
4. 初始化列表:C++11提供了初始化列表的统一初始化方式,允许使用花括号来初始化对象,这包括标准库容器、自定义类型等。
5. 模板增强:C++11对模板进行了增强,包括外部模板、尖括号`>>`的重载、类型别名模板和默认模板参数等,使得模板的使用更加灵活和方便。
6. 构造函数:C++11引入了委托构造函数和继承构造函数,使得构造函数的编写更加简洁,并且可以减少代码的重复。
7. Lambda表达式:Lambda表达式是C++11中引入的一种新的匿名函数对象,它允许在需要的地方定义函数,简化了函数对象的编写。
8. 新增容器:C++11标准库中增加了新的容器类型,如`std::array`、`std::forward_list`和无序容器`std::unordered_map`、`std::unordered_set`等。
9. 正则表达式:C++11引入了正则表达式库,提供了一套完整的正则表达式处理功能。
10. 语言级线程支持:C++11为多线程编程提供了语言级的支持,包括`std::thread`、`std::mutex`、`std::future`和`std::condition_variable`等。
11. 右值引用和move语义:C++11引入了右值引用和移动语义,允许更有效地处理临时对象,减少不必要的拷贝,提高程序性能。
12. std::bind函数:`std::bind`是一个函数适配器,它允许将函数和参数绑定,创建一个新的可调用对象。
13. std::function类模板:`std::function`是一个通用的多态函数封装,它可以存储、复制和调用任何可调用对象。
这些新特性使得C++11成为C++发展史上的一个重要里程碑,为C++程序员提供了更多的工具和能力来编写高效、现代的C++程序。
C17
C++17是C++语言的一个重要版本,它在C++11和C++14的基础上引入了许多新特性,旨在提高性能、可用性和安全性。以下是C++17的一些核心新特性:
-
并行算法:C++17引入了许多并行版本的标准库算法,允许算法并行执行,可能会在多核系统上带来显著的性能提升。
-
if 初始化器:C++17允许在if语句中直接初始化变量,这可以提高代码的可读性和简洁性。
-
类模板参数推导(CTAD):CTAD允许编译器从类参数中自动推导出模板参数,使得使用模板更加容易。
-
template <auto>:C++17允许使用非类型模板参数来声明变量,这在模板编程中非常有用。
-
std::optional 和 std::variant:这两个新类型提供了更安全的类型使用方式,解决了传统C++中常见的“空值”问题。
-
折叠表达式:C++17引入了折叠表达式,提供了一种简洁的方式来对参数包执行二元操作,使得代码更加简洁和表达力更强。
-
结构化绑定:允许将对象分解成其构成元素,类似于元组拆包,使得代码更加简洁。
-
模板模板参数:C++17允许模板接受模板作为参数,这在模板元编程中非常有用。
-
内联变量:C++17允许在类定义内部声明变量为内联的,有助于减小二进制大小并可能提高性能。
-
属性改进:C++17引入了新的属性,如
[[nodiscard]]
,允许开发人员为编译器提供更多的代码行为信息。 -
嵌套命名空间:C++17允许使用嵌套命名空间,提供了一种将代码层次化组织的方式。
-
字面量改进:C++17增强了字面量,包括对整数和浮点字面量的改进,以及对真和假字面量的支持。
-
constexpr Lambda:C++17允许lambda函数成为constexpr,如果它们满足条件,就可以在需要编译时评估的上下文中使用。
-
捕获*this:在lambda中捕获*this变得更加简单,允许直接访问包含对象的成员。
-
扩展的if和switch语句:C++17允许if或switch语句的条件是任何表达式,不仅限于布尔条件。
-
泛化的基于范围的for循环:C++17支持不同于起始迭代器类型的标志或结束迭代器,这有助于处理以空终止的循环和其他类似情况。
-
if constexpr:C++17引入了if constexpr语句,允许编译器在编译时评估条件,从而实现更通用的代码。
这些新特性使得C++17成为C++发展史上的一个重要里程碑,为C++程序员提供了更多的工具和能力来编写高效、现代的C++程序。
C20
C++20是C++语言的一次重大更新,引入了许多新特性,旨在提高语言的表达力、性能和易用性。以下是C++20的一些核心新特性:
-
概念(Concepts):C++20引入了概念,这是一种新的模板约束机制,允许开发者定义模板参数必须满足的条件,从而使得模板编程更加直观和安全。
-
模块(Modules):C++20正式引入了模块,这是一种新的代码组织方式,旨在替代传统的头文件包含机制,提高编译速度,减少编译依赖性,并提供更好的代码封装。
-
协程(Coroutines):C++20提供了原生的协程支持,允许开发者编写异步代码,提高程序的并发性能。协程可以通过
co_await
、co_return
和co_yield
关键字来实现。 -
范围(Ranges):C++20扩展了范围库,提供了一种新的方式来处理序列数据,使得对容器和序列的操作更加简洁和直观。
-
三向比较运算符(Three-Way Comparison Operator):C++20引入了一个新的比较运算符
<=>
,也称为太空飞船操作符,它提供了一种统一的比较机制,可以用于所有类型的比较。 -
指定初始化(Designated Initializers):C++20允许使用指定初始化,这意味着可以直接初始化结构体或类的特定成员,而不需要使用默认初始化。
-
char8_t
类型:C++20引入了char8_t
类型,用于支持UTF-8字符串字面量,提供了一种新的字符类型来处理Unicode编码。 -
consteval
函数:C++20扩展了constexpr
,允许定义consteval
函数,这些函数可以在编译时求值。 -
constinit
:C++20引入了constinit
,用于声明具有静态存储期的变量,这些变量必须在编译时初始化。 -
格式化库(
std::format
):C++20引入了一个新的格式化库,提供了一种类似于Python的字符串格式化机制,使得字符串格式化更加灵活和强大。 -
std::span
:C++20进一步改进了std::span
,这是一个非拥有的容器视图,用于访问连续的内存区域。 -
日期和时区库:C++20引入了一个新的日期和时区库,提供了一套完整的日期和时间处理功能,包括时区转换和日期计算。
这些新特性使得C++20成为C++语言发展史上的一个重要里程碑,为C++开发者提供了更多的工具和能力来编写高效、现代的C++程序。
C14
C++14是C++11的一个小但重要的补充和改进,它在保持向后兼容性的同时,引入了一系列旨在提高代码简洁性和效率的新特性和增强功能。
-
Lambda初始化捕获:允许在Lambda表达式的捕获列表中直接初始化变量。
-
泛型Lambda参数:使用
auto
关键字作为Lambda参数,使得Lambda表达式更加灵活和通用。 -
constexpr函数的增强:允许在constexpr函数内部使用局部变量、循环和分支等简单语句。
-
废弃标志
[[deprecated]]
:提供了一个标准化的属性来标记已弃用的函数、类或其他声明。 -
读写锁
std::shared_timed_mutex
和std::shared_lock
:扩展了线程支持库,引入了新的互斥量类型和共享锁管理器。 -
模板可变整数序列:增强了模板元编程的能力,引入了可变参数模板的整数序列表示。
-
std::exchange
:用于原子地交换一个对象的值,并返回其旧值。 -
字符串字面值带引号:允许在字符串字面值中嵌入单引号、双引号和反斜杠等,无需转义。
-
二进制字面量与整形字面量分隔符:新增了
0b
前缀表示二进制字面量,新增了分隔符'
用于帮助阅读。 -
用户定义字面量:允许定义自定义的字面量,例如时间单位和字符串。
-
返回类型推导
auto
:允许在函数声明中使用auto
关键字来推导返回类型。 -
变量模板:允许使用模板来声明变量并进行初始化。
-
std::make_unique
:用于创建一个动态分配的对象并返回一个指向该对象的std::unique_ptr
智能指针。