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》