摘要: 1.noexcept 的修饰和操作 C++ 相比于 C 的一大优势就在于 C++ 本身就定义了一套完整的异常处理机制。 然而在 C11 之前,几乎没有人去使用在函数名后书写异常声明表达式, 从 C11 开始,这套机制被弃用,所以我们不去讨论也不去介绍以前这套机制是如何工作如何使用, 你更不应该主动去 阅读全文
posted @ 2022-02-19 16:34 DarkH 阅读(67) 评论(2) 推荐(0) 编辑
摘要: 并行与并发 1 并行基础 std::thread 用于创建一个执行的线程实例,所以它是一切并发编程的基础,使用时需要包含 <thread> 头文件, 它提供了很多基本的线程操作,例如 get_id() 来获取所创建线程的线程 ID,使用 join() 来加入一个线程等等,例如: #include < 阅读全文
posted @ 2022-02-19 16:23 DarkH 阅读(60) 评论(0) 推荐(0) 编辑
摘要: 正则表达式 1.正则表达式简介 正则表达式不是 C++ 语言的一部分,这里仅做简单的介绍。 正则表达式描述了一种字符串匹配的模式。一般使用正则表达式主要是实现下面三个需求: 检查一个串是否包含某种形式的子串; 将匹配的子串替换; 从某个串中取出符合条件的子串。 正则表达式是由普通字符(例如 a 到 阅读全文
posted @ 2022-02-19 16:19 DarkH 阅读(125) 评论(0) 推荐(0) 编辑
摘要: 智能指针与内存管理 1 .RAII 与引用计数 引用计数这种计数是为了防止内存泄露而产生的。 基本想法是对于动态分配的对象,进行引用计数,每当增加一次对同一个对象的引用,那么引用对象的引用计数就会增加一次, 每删除一次引用,引用计数就会减一,当一个对象的引用计数减为零时,就自动删除指向的堆内存。 在 阅读全文
posted @ 2022-02-19 16:07 DarkH 阅读(87) 评论(0) 推荐(0) 编辑
摘要: 容器 1 .线性容器 std::array 看到这个容器的时候肯定会出现这样的问题: 为什么要引入 std::array 而不是直接使用 std::vector? 已经有了传统数组,为什么要用 std::array? 先回答第一个问题,与 std::vector 不同,std::array 对象的大 阅读全文
posted @ 2022-02-19 15:52 DarkH 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 面向对象 委托构造 C++11 引入了委托构造的概念,这使得构造函数可以在同一个类中一个构造函数调用另一个构造函数,从而达到简化代码的目的: #include <iostream> class Base { public: int value1; int value2; Base() { value 阅读全文
posted @ 2022-02-19 15:44 DarkH 阅读(42) 评论(0) 推荐(0) 编辑
摘要: 模板 C++ 的模板一直是这门语言的一种特殊的艺术,模板甚至可以独立作为一门新的语言来进行使用。模板的哲学在于将一切能够在编译期处理的问题丢到编译期进行处理,仅在运行时处理那些最核心的动态服务,进而大幅优化运行期的性能。因此模板也被很多人视作 C++ 的黑魔法之一。 外部模板 传统 C++ 中,模板 阅读全文
posted @ 2022-02-19 15:43 DarkH 阅读(121) 评论(0) 推荐(0) 编辑
摘要: if constexpr 正如本章开头出,我们知道了 C11 引入了 constexpr 关键字,它将表达式或函数编译为常量结果。一个很自然的想法是,如果我们把这一特性引入到条件判断中去,让代码在编译时就完成分支判断,岂不是能让程序效率更高?C17 将 constexpr 这个关键字引入到 if 语 阅读全文
posted @ 2022-02-19 15:36 DarkH 阅读(277) 评论(0) 推荐(0) 编辑
摘要: C++ 本身已经具备了常量表达式的概念,比如 1+2, 3*4 这种表达式总是会产生相同的结果并且没有任何副作用。如果编译器能够在编译时就把这些表达式直接优化并植入到程序运行时,将能增加程序的性能。一个非常明显的例子就是在数组的定义阶段: #include <iostream> #define LE 阅读全文
posted @ 2022-02-19 15:31 DarkH 阅读(51) 评论(0) 推荐(0) 编辑
摘要: 在传统 C 和 C++ 中,参数的类型都必须明确定义,这其实对我们快速进行编码没有任何帮助,尤其是当我们面对一大堆复杂的模板类型时,必须明确的指出变量的类型才能进行后续的编码,这不仅拖慢我们的开发效率,也让代码变得又臭又长。 C11 引入了 auto 和 decltype 这两个关键字实现了类型推导 阅读全文
posted @ 2022-02-19 15:28 DarkH 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 初始化列表 初始化是一个非常重要的语言特性,最常见的就是在对象进行初始化时进行使用。在传统 C++ 中,不同的对象有着不同的初始化方法,例如普通数组、 POD (Plain Old Data,即没有构造、析构和虚函数的类或结构体)类型都可以使用 {} 进行初始化,也就是我们所说的初始化列表。而对于类 阅读全文
posted @ 2022-02-19 15:23 DarkH 阅读(120) 评论(0) 推荐(0) 编辑
摘要: 1 什么是闭包 ​ 闭包有很多种定义,一种说法是,闭包是带有上下文的函数。说白了,就是有状态的函数。更直接一些,不就是个类吗?换了个名字而已。 ​ 一个函数,带上了一个状态,就变成了闭包了。那什么叫 “带上状态” 呢? 意思是这个闭包有属于自己的变量,这些个变量的值是创建闭包的时候设置的,并在调用闭 阅读全文
posted @ 2022-02-19 15:08 DarkH 阅读(67) 评论(0) 推荐(0) 编辑
摘要: 1.左值、右值的纯右值、将亡值、右值 ​ 左值 (lvalue, left value),顾名思义就是赋值符号左边的值。准确来说,左值是表达式(不一定是赋值表达式)后依然存在的持久对象。 ​ 右值 (rvalue, right value),右边的值,是指表达式结束后就不再存在的临时对象。 而 C+ 阅读全文
posted @ 2022-02-19 14:25 DarkH 阅读(301) 评论(0) 推荐(0) 编辑