自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(12)
  • 问答 (1)
  • 收藏
  • 关注

原创 第三章 语言运行期的强化——右值引用

3.3 右值引用我感觉,右值引用绝对是现代 C++ 中最重要的特性。解决了很多历史遗留问题。右值引用消除了诸如 std::vector、std::string 等容器额外的开销,也使得函数对象容器 std::function 成为了可能。左值、右值、纯右值、将亡值我们先详细区分一些现代 C++ 中的各种值左值英文是 lvalue,表示的是存储在内存中、有明确存储地址(可寻址)的数据。右值英文是 rvalue,表示的是那些可以提供数据值的数据(不一定可以寻址,例如存储于寄存器中的数据)。C+

2022-01-12 23:33:57 234

原创 第三章 语言运行期强化——函数对象包裹器

3.2 函数对象包裹器这部分虽然属于标准库的一部分,但是从本质上来看,他却增强了 C++ 语言运行时的能力。std::functionLambda 表达式的本质是一个和函数对象类型相似的类型的对象(有点拗口)。就是说 Lambda 表达式实际上是一种函数对象类型,这种类型称之为闭包类型。这种闭包类型产生的对象,叫做闭包对象。当 Lambda 表达式的捕获列表为空时,闭包对象可以转换为函数指针进行值传递。如下代码:#include <iostream>using namespace s

2022-01-12 23:32:52 177

原创 第三章 语言运行期的强化——Lambda 表达式

3.1 Lambda 表达式Lambda 表达式提供了一个类似于匿名函数的特性。匿名函数是在一个需要函数,但是又不想费力去命名一个函数的情况下去使用的。这样的场景其实在现代编程语言中有很多,所以匿名函数几乎是现代编程语言的标配。基础Lambda 表达式基本语法如下:[捕获列表](参数列表)mutable(可选) 异常属性 -> 返回类型{ //函数体}上面的语法规则都很好理解,可能[捕获列表]困难一点。Lambda 表达式内部函数体在默认情况下是不能使用函数体外部的变量的。

2022-01-12 23:31:48 129

原创 第二章 语言可用性的强化——模板

第二章 语言可用性的强化——模板C++ 的模板被称作 C++ 的黑魔法,甚至可以独立作为一门新的语言来进行使用。模板的哲学在于一切能够在编译期处理的问题全部都丢到编译期进行处理,仅在运行时处理那些最核心的动态服务,进而大幅度优化性能。外部模板传统 C++ 中,模板只有在使用时才会被编译器实例化。只要在每个编译单元(文件)中遇到了被完整定义的模板,都会实例化。这就产生了重复实例化而导致编译时间增加。并且,我们没有办法通知编译器不要触发模板的实例化。C++11 引入了外部模板,扩充了原来的强制编译器在

2022-01-03 01:43:01 379

原创 第二章 语言可用性的强化——控制流

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 227

原创 第二章 语言可用性的强化——类型推导

2.3 类型推导在传统C++中,参数的类型必须明确定义,这会很大程度上降低我们的变成速度。尤其是当我们面对一大堆复杂的模板类型时,必须明确指定变量的类型才能继续进行后续的编码。不仅降低开发速度,代码也变得又臭又长autoauto 在很早以前就进入C++了,咱们也不去纠结以前到底干什么用,咱就说说现在有什么用。使用 auto 进行类型推导的一个最为常见的例子就是迭代器。//在 C++11 之前for (vector<int>::iterator itr = vec.begin(); i

2022-01-02 20:36:25 306

原创 第二章 语言可用性的强化——变量及其类型初始化

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 228

原创 第二章 语言可用性的强化——常量

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 1913

原创 第一章 迈向现代C++

第一章 迈向现代C++1.1 被弃用的特性弃用并不是彻底不能用,而是这些特性即将从未来的标准中消失,应该尽量避免使用。弃用的特性出于对兼容性的考虑,依然是标准库的一部分(这里是C++的原则,一直向前兼容,我感觉有点偶像包袱了)。1.不再允许字符串字面值常量赋值给一个 char * 。如果需要用字符串字面值常量复制和初始化一个 char *,应该使用const char * 或者 auto 。(这里挺关键的)2.C++98一场说明、unexpected_handler、set_unexpected()

2021-12-19 23:59:18 697

原创 第0章 简单说几句

第0章 简单说几句前言​ 我要开始写技术文章了,这个专栏专门为现代C++开设的。我还记得那个时候说什么感觉自己是个大佬了,才开始写技术文章。现在,好像有点食言了,因为我现在还是一个菜鸡。这个专栏开设的目的是为了和大家一起学习现代C++。主要是,我们公司新招进来一个应届的毕业生,我看的的代码里充满了NULL这种老古董,到处都有 char * 这种沙雕东西。我真是有点为国内的本科教育担心啊,这些是神马东西啊,你在学校写这种代码不会挨骂吗?什么是现代C++​ 在《现代C++白皮书》将C++98称之为传

2021-12-19 23:57:28 555

原创 关于转行那些事

呃,原本打算一周更新一章的,但是上周忘了,纯纯的老年人记忆力。这周也不做啥补偿了,也不是为了啥利益,也不是作家,没有那个必要,随缘更新吧。不整那些虚头八脑的,开整。1.为什么要转行?​ 第一篇文章已经说过了,我大学本科学的是土木专业。不是说这个专业不好,学校的老师和学术水平也很好(呃,好像有舔狗的嫌疑),转行的根本原因就是因为自己不喜欢。我总觉得,人这一辈子总要找点自己喜欢的事情做。不然,天天怨天尤人的干着土木的工作,自己不上心,也不快乐。趁着自己年轻,没有遭受过社会的毒打,有那种初生牛犊不怕虎的气势

2021-12-12 22:48:19 3382

原创 我是谁?——第一次CSDN发文

前言这是我CSDN的第一篇文章,也是我入行稳定后的第一篇文章,同样是我认真工作后的第一篇文章。写文章的目的也不是去为了讲解什么高深的技术,只是想和大家分享一下自己偶然间的心得。呃,有点把CSDN当作一个树洞的意思。文章目前的内容不想包含技术相关的东西,主要是自己也不是什么技术大佬,而且技术相关的文章到处都是,也不差自己这一点。写作的主要内容是包括一些业务逻辑,对工作和生活的一些看法,某项技术的探讨等。基本上不会设计高深的技术理论,因为自己也是一个菜鸡,怕写出来误导大家。可能以后会有技术方面的内容,这可能要

2021-11-27 19:13:24 192

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除