现代C++, C11、C14、C17、C20

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的一些核心新特性:

  1. 并行算法:C++17引入了许多并行版本的标准库算法,允许算法并行执行,可能会在多核系统上带来显著的性能提升。

  2. if 初始化器:C++17允许在if语句中直接初始化变量,这可以提高代码的可读性和简洁性。

  3. 类模板参数推导(CTAD):CTAD允许编译器从类参数中自动推导出模板参数,使得使用模板更加容易。

  4. template <auto>:C++17允许使用非类型模板参数来声明变量,这在模板编程中非常有用。

  5. std::optional 和 std::variant:这两个新类型提供了更安全的类型使用方式,解决了传统C++中常见的“空值”问题。

  6. 折叠表达式:C++17引入了折叠表达式,提供了一种简洁的方式来对参数包执行二元操作,使得代码更加简洁和表达力更强。

  7. 结构化绑定:允许将对象分解成其构成元素,类似于元组拆包,使得代码更加简洁。

  8. 模板模板参数:C++17允许模板接受模板作为参数,这在模板元编程中非常有用。

  9. 内联变量:C++17允许在类定义内部声明变量为内联的,有助于减小二进制大小并可能提高性能。

  10. 属性改进:C++17引入了新的属性,如[[nodiscard]],允许开发人员为编译器提供更多的代码行为信息。

  11. 嵌套命名空间:C++17允许使用嵌套命名空间,提供了一种将代码层次化组织的方式。

  12. 字面量改进:C++17增强了字面量,包括对整数和浮点字面量的改进,以及对真和假字面量的支持。

  13. constexpr Lambda:C++17允许lambda函数成为constexpr,如果它们满足条件,就可以在需要编译时评估的上下文中使用。

  14. 捕获*this:在lambda中捕获*this变得更加简单,允许直接访问包含对象的成员。

  15. 扩展的if和switch语句:C++17允许if或switch语句的条件是任何表达式,不仅限于布尔条件。

  16. 泛化的基于范围的for循环:C++17支持不同于起始迭代器类型的标志或结束迭代器,这有助于处理以空终止的循环和其他类似情况。

  17. if constexpr:C++17引入了if constexpr语句,允许编译器在编译时评估条件,从而实现更通用的代码。

        这些新特性使得C++17成为C++发展史上的一个重要里程碑,为C++程序员提供了更多的工具和能力来编写高效、现代的C++程序。

C20

        C++20是C++语言的一次重大更新,引入了许多新特性,旨在提高语言的表达力、性能和易用性。以下是C++20的一些核心新特性:

  1. 概念(Concepts):C++20引入了概念,这是一种新的模板约束机制,允许开发者定义模板参数必须满足的条件,从而使得模板编程更加直观和安全。

  2. 模块(Modules):C++20正式引入了模块,这是一种新的代码组织方式,旨在替代传统的头文件包含机制,提高编译速度,减少编译依赖性,并提供更好的代码封装。

  3. 协程(Coroutines):C++20提供了原生的协程支持,允许开发者编写异步代码,提高程序的并发性能。协程可以通过co_awaitco_returnco_yield关键字来实现。

  4. 范围(Ranges):C++20扩展了范围库,提供了一种新的方式来处理序列数据,使得对容器和序列的操作更加简洁和直观。

  5. 三向比较运算符(Three-Way Comparison Operator):C++20引入了一个新的比较运算符<=>,也称为太空飞船操作符,它提供了一种统一的比较机制,可以用于所有类型的比较。

  6. 指定初始化(Designated Initializers):C++20允许使用指定初始化,这意味着可以直接初始化结构体或类的特定成员,而不需要使用默认初始化。

  7. char8_t类型:C++20引入了char8_t类型,用于支持UTF-8字符串字面量,提供了一种新的字符类型来处理Unicode编码。

  8. consteval函数:C++20扩展了constexpr,允许定义consteval函数,这些函数可以在编译时求值。

  9. constinit:C++20引入了constinit,用于声明具有静态存储期的变量,这些变量必须在编译时初始化。

  10. 格式化库(std::format:C++20引入了一个新的格式化库,提供了一种类似于Python的字符串格式化机制,使得字符串格式化更加灵活和强大。

  11. std::span:C++20进一步改进了std::span,这是一个非拥有的容器视图,用于访问连续的内存区域。

  12. 日期和时区库:C++20引入了一个新的日期和时区库,提供了一套完整的日期和时间处理功能,包括时区转换和日期计算。

这些新特性使得C++20成为C++语言发展史上的一个重要里程碑,为C++开发者提供了更多的工具和能力来编写高效、现代的C++程序。

C14

        C++14是C++11的一个小但重要的补充和改进,它在保持向后兼容性的同时,引入了一系列旨在提高代码简洁性和效率的新特性和增强功能。

  1. Lambda初始化捕获:允许在Lambda表达式的捕获列表中直接初始化变量。

  2. 泛型Lambda参数:使用auto关键字作为Lambda参数,使得Lambda表达式更加灵活和通用。

  3. constexpr函数的增强:允许在constexpr函数内部使用局部变量、循环和分支等简单语句。

  4. 废弃标志 [[deprecated]]:提供了一个标准化的属性来标记已弃用的函数、类或其他声明。

  5. 读写锁 std::shared_timed_mutexstd::shared_lock:扩展了线程支持库,引入了新的互斥量类型和共享锁管理器。

  6. 模板可变整数序列:增强了模板元编程的能力,引入了可变参数模板的整数序列表示。

  7. std::exchange:用于原子地交换一个对象的值,并返回其旧值。

  8. 字符串字面值带引号:允许在字符串字面值中嵌入单引号、双引号和反斜杠等,无需转义。

  9. 二进制字面量与整形字面量分隔符:新增了0b前缀表示二进制字面量,新增了分隔符'用于帮助阅读。

  10. 用户定义字面量:允许定义自定义的字面量,例如时间单位和字符串。

  11. 返回类型推导 auto:允许在函数声明中使用auto关键字来推导返回类型。

  12. 变量模板:允许使用模板来声明变量并进行初始化。

  13. std::make_unique:用于创建一个动态分配的对象并返回一个指向该对象的std::unique_ptr智能指针。

现代C++程序设计(原书第2版)》图文并茂,通俗易懂,真正做到寓教于乐,是一本难得的C++面向对象设计入门教材。 出版者的话 译者序 前言 第1章 C++概述与软件开发 1.1 什么是C语言C++ 1.1.1 C和C++历史回顾 1.1.2 C/C++是一门编译语言 1.1.3 为什么许多程序员都选择C++ 1.2 什么是面向对象 1.2.1 C++程序并不一定是面向对象的 1.2.2 一个简单的面向对象程序示例 1.2.3 面向对象的软件更有优势 1.3 结构化设计与面向对象设计 1.3.1 ATM——结构化设计 1.3.2 采用面向对象方法的ATM——究竟是谁的任务 1.3.3 汽车维护——结构化设计 1.3.4 采用面向对象方法的汽车维护——究竟是谁的任务 1.4 软件开发技术概述 1.5 问题发现与解决 复习题 第2章 C++的入门知识 2.1 编程基础 2.1.1 算法设计 2.1.2 正确的软件开发步骤 2.2 专业术语及工程创建 2.3 C++程序的一般格式 2.3.1 “Hello World!”程序 2.3.2 “How’s the Weather?”程序 2.4 程序的数据及数据类型 2.4.1 C++的数据类型 2.4.2 容器=数据类型,标签=变量名 2.4.3 数据类型修饰符 2.4.4 问题分析:整型数据究竟有多大 2.5 C++中的变量声明 2.5.1 C++的命名规则 2.5.2 在哪里声明变量 2.6 C++中的运算符 2.6.1 计算路程的程序 2.6.2 从键盘输入程序所需数据 2.6.3 赋值运算符 2.6.4 运算符的优先级 2.6.5 数据类型及其存储的值 2.6.6 算术运算符 2.6.7 自增运算符和自减运算符 2.6.8 复合赋值运算符 2.7 #define、const和数据类型转换 2.7.1 #define预处理指令 2.7.2 const修饰符 2.7.3 const比#define好吗 2.7.4 数据类型转换 2.8 关于键盘输入和屏幕输出的更多内容 2.8.1 转义序列 2.8.2 ios格式标记 2.8.3 流的IO控制符 2.9 开始使用类和对象、C++string类 2.10 练习 复习题 第3章 控制语句和循环 3.1 关系运算符和逻辑运算符 3.2 if语句 3.2.1 if-else语句 3.2.2 问题分析:在if语句中使用大括号 3.2.3 if-else if-else语句 3.2.4 低效的编程方法 3.2.5 if-else程序示例 3.2.6 嵌套if-else语句 3.2.7 条件运算符“?” 3.3 switch语句 3.4 循环 3.4.1 括号的用法 3.4.2 无限循环 3.5 for循环 3.5.1 不要改变循环索引 3.5.2 for循环示例 3.6 while循环 3.7 do while循环 3.8 跳转语句 3.8.1 break语句 3.8.2 continue语句 3.9 问题发现与解决 3.9.1 五个常见错误 3.9.2 调试程序 3.10 C++类与vector类 3.11 总结 3.12 练习 复习题 第4章 函数一:基础 4.1 C++中的函数 4.1.1 只由一个main函数构成的程序 4.1.2 包含多个函数的程序 4.1.3 函数是个好东西 4.1.4 三个重要的问题 4.2 函数:基本格式 4.3 函数的编写要求 4.3.1 你想住在C++旅馆中吗 4.3.2 函数为先 4.3.3 函数声明或函数原型 4.3.4 函数定义、函数标题行与函数体 4.3.5 函数调用 4.3.6 传值调用 4.3.7 问题分析:未声明的标识符 4.4 重载函数 4.5 具有默认输入参数列表的函数 4.6 局部变量、全局变量和静态变量 4.6.1 局部变量 4.6.2 块范围 4.6.3 全局变量 4.6.4 危险的全局变量 4.6.5 问题分析:全局变量y0、y1与cmath 4.6.6 静态变量 4.7 C++stringstream类 4.8 总结 4.9 练习 复习题 第5章 函数二:变量地址、指针以及引用 5.1 数据变量和内存 5.1.1 sizeof运算符 5.1.2 预留内存 5.1.3 计算机内存和十六进制 5.2 取地址运算符& 5.3 指针 5.4 函数、指针以及间接运算符 5.4.1 解决思路 5.4.2 指针和函数 5.4.3 有效处理大型数据 5.5 函数和引用 5.5.1 复习:两种机制 5.5.2 为什么要强调指针的重要性 5.6 queue类 5.7 总结 5.8 练习 复习题 第6章 数组 6.1 使用单个数据变量 6.2 数组基础 6.2.1 数组的索引值从0开始 6.2.2 使用for循环和数组来实现的电话账单程序 6.2.3 数组的声明和初始化 6.2.4 数组越界==严重的问题 6.2.5 vector与数组的比较 6.3 数组和函数 6.3.1 每个数组都有一个指针 6.3.2 数组指针 6.3.3 向函数传递数组:最开始的引用调用 6.3.4 利用数组和函数生成随机数并进行排序 6.4 C字符串,也称为字符数组 6.4.1 字符数组的初始化 6.4.2 null字符 6.4.3 C字符串的输入 6.4.4 C++中提供的字符数组函数 6.5 多维数组 6.5.1 二维数组的初始化 6.5.2 嵌套的for循环和二维数组 6.5.3 利用二维数组来实现Bingo游戏 6.6 多维数组和函数 6.6.1 改进的Bingo卡片程序 6.6.2 白雪公主:利用二维数组来存储姓名 6.7 利用数据文件对数组赋值 6.8 总结 6.9 练习 复习题 第7章 类和对象 7.1 我们所了解的类和对象 7.2 编写自己的类 7.2.1 入门实例:自定义日期类 7.2.2 第一个C++类:Date类 7.2.3 揭开类的生命之谜 7.2.4 set和get函数的作用与VolumeCalc类 7.2.5 PICalculator类 7.3 作为类成员的对象 7.4 类的析构函数 7.5 对象数组 7.6 重载运算符与对象 7.7 指针、引用和类 7.7.1 指针和引用实例 7.7.2 处理日期和时间的程序实例 7.8 总结 7.9 练习 复习题 第8章 继承和虚函数 8.1 为什么继承如此重要 8.1.1 IceCreamDialog实例 8.1.2 Counter类实例 8.2 继承基础 8.2.1 Counter和DeluxeCounter实例 8.2.2 保护成员 8.2.3 员工、老板和CEO 8.3 访问控制符的规范和多继承 8.4 继承、构造和析构 8.4.1 构造函数和析构函数回顾 8.4.2 基类和派生类的默认构造函数——没有参数 8.4.3 在重载的构造函数中使用参数 8.4.4 基类和派生类的析构函数 8.4.5 医生也是人 8.4.6 关于派生类和基类构造函数的规则 8.5 多态和虚函数 8.5.1 多态——同一个接口,不同的行为 8.5.2 什么是虚函数 8.5.3 虚函数的作用 8.6 总结 8.7 练习 复习题 附录A 学习使用Visual C++2005Express Edition 附录B C++关键字表 附录C C++运算符 附录D ASCII码 附录E 位、字节、内存和十六进制表示 附录F 文件输入/输出 附录G 部分C++类 附录H 多文件程序 附录I Microsoft visual C++2005Express Edit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值