![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
现代C++
文章平均质量分 69
爱夫浮等于肉液寄微排
做一个不宅的技术宅
展开
-
第三章 语言运行期的强化——右值引用
3.3 右值引用我感觉,右值引用绝对是现代 C++ 中最重要的特性。解决了很多历史遗留问题。右值引用消除了诸如 std::vector、std::string 等容器额外的开销,也使得函数对象容器 std::function 成为了可能。左值、右值、纯右值、将亡值我们先详细区分一些现代 C++ 中的各种值左值英文是 lvalue,表示的是存储在内存中、有明确存储地址(可寻址)的数据。右值英文是 rvalue,表示的是那些可以提供数据值的数据(不一定可以寻址,例如存储于寄存器中的数据)。C+原创 2022-01-12 23:33:57 · 229 阅读 · 0 评论 -
第三章 语言运行期强化——函数对象包裹器
3.2 函数对象包裹器这部分虽然属于标准库的一部分,但是从本质上来看,他却增强了 C++ 语言运行时的能力。std::functionLambda 表达式的本质是一个和函数对象类型相似的类型的对象(有点拗口)。就是说 Lambda 表达式实际上是一种函数对象类型,这种类型称之为闭包类型。这种闭包类型产生的对象,叫做闭包对象。当 Lambda 表达式的捕获列表为空时,闭包对象可以转换为函数指针进行值传递。如下代码:#include <iostream>using namespace s原创 2022-01-12 23:32:52 · 172 阅读 · 0 评论 -
第三章 语言运行期的强化——Lambda 表达式
3.1 Lambda 表达式Lambda 表达式提供了一个类似于匿名函数的特性。匿名函数是在一个需要函数,但是又不想费力去命名一个函数的情况下去使用的。这样的场景其实在现代编程语言中有很多,所以匿名函数几乎是现代编程语言的标配。基础Lambda 表达式基本语法如下:[捕获列表](参数列表)mutable(可选) 异常属性 -> 返回类型{ //函数体}上面的语法规则都很好理解,可能[捕获列表]困难一点。Lambda 表达式内部函数体在默认情况下是不能使用函数体外部的变量的。原创 2022-01-12 23:31:48 · 127 阅读 · 0 评论 -
第二章 语言可用性的强化——模板
第二章 语言可用性的强化——模板C++ 的模板被称作 C++ 的黑魔法,甚至可以独立作为一门新的语言来进行使用。模板的哲学在于一切能够在编译期处理的问题全部都丢到编译期进行处理,仅在运行时处理那些最核心的动态服务,进而大幅度优化性能。外部模板传统 C++ 中,模板只有在使用时才会被编译器实例化。只要在每个编译单元(文件)中遇到了被完整定义的模板,都会实例化。这就产生了重复实例化而导致编译时间增加。并且,我们没有办法通知编译器不要触发模板的实例化。C++11 引入了外部模板,扩充了原来的强制编译器在原创 2022-01-03 01:43:01 · 378 阅读 · 0 评论 -
第二章 语言可用性的强化——控制流
2.4 控制流if constexprC++17 将 constexpr 这个关键字引入到 if 语句中,允许代码中声明常量表达式的判断条件,如下代码:template<typename T>auto print_type_info(const T& t){ if constexpr (std::is_integral<T>::value) { return t + 1; } else { re原创 2022-01-02 20:37:11 · 222 阅读 · 0 评论 -
第二章 语言可用性的强化——类型推导
2.3 类型推导在传统C++中,参数的类型必须明确定义,这会很大程度上降低我们的变成速度。尤其是当我们面对一大堆复杂的模板类型时,必须明确指定变量的类型才能继续进行后续的编码。不仅降低开发速度,代码也变得又臭又长autoauto 在很早以前就进入C++了,咱们也不去纠结以前到底干什么用,咱就说说现在有什么用。使用 auto 进行类型推导的一个最为常见的例子就是迭代器。//在 C++11 之前for (vector<int>::iterator itr = vec.begin(); i原创 2022-01-02 20:36:25 · 300 阅读 · 0 评论 -
第二章 语言可用性的强化——变量及其类型初始化
2.2 变量及其类型初始化if/switch 变量声明强化在传统C++中,可以在 for 循环内声明一个临时变量 int,但是始终没有办法再 if 和 switch语句中声明一个临时变量。C++17解除了这一限制,使我们可以在 if/switch 中完成这一操作。std::vector<int> vec = { 1, 2, 3, 4 };if (const vector<int>::iterator itr = std::find(vec.begin(), vec.end(原创 2022-01-02 20:35:32 · 222 阅读 · 0 评论 -
第二章 语言可用性的强化——常量
2.1 常量nullptr目的是为了代替NULL。传统C++会把NULL、0是为一种东西,这取决于编译器如何定义NULL。有些编译器会定义为((void)* 0),有些会直接定义为0.C++不允许直接将void 隐式转换到其他类型。如果编译器尝试把NULL定义为((void) 0),如下代码:char *ch = NULL;由于C++没有 void * 的隐式转换,只好将NULL定义为0。表面上是解决了当前问题,但是这样做会产生重载混乱的新问题,如下代码:void foo(char*);vo原创 2022-01-02 20:34:01 · 1907 阅读 · 0 评论 -
第一章 迈向现代C++
第一章 迈向现代C++1.1 被弃用的特性弃用并不是彻底不能用,而是这些特性即将从未来的标准中消失,应该尽量避免使用。弃用的特性出于对兼容性的考虑,依然是标准库的一部分(这里是C++的原则,一直向前兼容,我感觉有点偶像包袱了)。1.不再允许字符串字面值常量赋值给一个 char * 。如果需要用字符串字面值常量复制和初始化一个 char *,应该使用const char * 或者 auto 。(这里挺关键的)2.C++98一场说明、unexpected_handler、set_unexpected()原创 2021-12-19 23:59:18 · 690 阅读 · 0 评论 -
第0章 简单说几句
第0章 简单说几句前言 我要开始写技术文章了,这个专栏专门为现代C++开设的。我还记得那个时候说什么感觉自己是个大佬了,才开始写技术文章。现在,好像有点食言了,因为我现在还是一个菜鸡。这个专栏开设的目的是为了和大家一起学习现代C++。主要是,我们公司新招进来一个应届的毕业生,我看的的代码里充满了NULL这种老古董,到处都有 char * 这种沙雕东西。我真是有点为国内的本科教育担心啊,这些是神马东西啊,你在学校写这种代码不会挨骂吗?什么是现代C++ 在《现代C++白皮书》将C++98称之为传原创 2021-12-19 23:57:28 · 553 阅读 · 0 评论