加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

每个开发者都应该了解的一些C++特性

发布时间:2019-05-25 13:28:36 所属栏目:建站 来源:机器之心编译
导读:作为一门编程说话,C++已经进化了许多。 虽然,这些改变不是一夜之间产生的。曾几许时,C++缺乏活力,导致人们不太喜好这门说话。 可是,当 C++尺度委员会抉择加速转变时,环境就差异了。 自 2011 年以来,C++已经成为一种不绝成长的动态说话,而这正是很
副问题[/!--empirenews.page--]

作为一门编程说话,C++已经进化了许多。

虽然,这些改变不是一夜之间产生的。曾几许时,C++缺乏活力,导致人们不太喜好这门说话。

可是,当 C++尺度委员会抉择加速转变时,环境就差异了。

自 2011 年以来,C++已经成为一种不绝成长的动态说话,而这正是许多人所期许的。

每个开拓者都应该相识的一些C++特征

不要误觉得是这门说话变得简朴了,现实并没有。它如故是被普及行使的最难编程说话之一。可是对比于之前的版本,确实对用户越发友爱了。

本日,我们深入掘客一下每位开拓者都应该相识的新特征(这些新特征从 C++11 时开始呈现,距今已有八年汗青了)。留意,本文略过了一些高级特征,也许会在往后的内容中具体切磋。

auto 观念

当 C++11 第一次引入 auto,统统都变得更简朴了。

auto 的观念是让 c++编译器在编译时自动揣度数据的范例,而不是每次都要求你手动声明范例。假如你的数据范例是

  1. map<string,vector<pair<int,int>>> <string,vector<pair 

这样的,工作会变得很是利便。

  1. </string,vector<pair 

每个开拓者都应该相识的一些C++特征

看一下第五行。没有 initializer 时你不能声明某些对象,这不难领略。像第五行这样,编译器是无法揣度数据范例的。

最初,auto 的行使长短常受限的。在之后的版本中,auto 变得越发强盛!

每个开拓者都应该相识的一些C++特征

第 7 和第 8 行中,我行使了花括号初始化。这个特征也是 C++11 中新插手的。

记着,当行使 auto 时,必需确保你的编译器可以通过某种方法揣度数据范例。

此刻题目来了,假如我写 auto a = {1, 2, 3} 会产生什么?会有编译错误吗?这是向量吗?

现实上,C++11 引入了 std::initializer_list,假如声明为 auto,那么初始化列表会被以为是这种轻量级容器。

最后,就像前面提到的,当你行使伟大的数据范例时,编译器揣度数据范例会很是有效。

每个开拓者都应该相识的一些C++特征

不要健忘查察第 25 行!表达式 auto [v1,v2] = itr.second 是 C++17 的新特征。这被称为布局化绑定。在之前的版本中,每个变量必必要别离举办提取,然而布局化绑定会使这个进程利便许多。

其它,假如你想通过引用获取数据,只必要添加一个像 auto &[v1,v2] = itr.second 这样的标记,很是简捷。

lambda 表达式

C++11 引入了 lambda 表达式,该表达式和 JavaScript 中的匿名函数很是相似。它们是没有定名的函数工具,而且基于一些简捷的语法在差异的浸染域捕捉变量,它们还可以分派给变量。

当你想在代码中快速实现一些小成果但并不想为此单独编写整个函数时,lambda 很是有效。另一种很是广泛的应用是将其作为较量函数。

每个开拓者都应该相识的一些C++特征

上面的例子中有许多细节。

起首,要留意到列表初始化为你节减了几多代码。然后是通用的 begin() 和 end(),它们同样也是 C++11 中新添加的。然后是作为数据较量器的 lambda 函数。lambda 函数的参数被声明为 auto,这是 c++14 中新增的。在此之前,是不行以用 auto 作为函数参数的。

这里行使方括号[]作为 lambda 表达式的开始。它界说了 lambda 函数的浸染域,即它对局部变量和工具有几多权限。

下面是一些当代 c++中的相干界说:

  • []代表空。因此你不行以在 lambda 表达式中行使任何外部浸染域的局部变量。只可以行使参数。
  • [=]代表可通过值获取浸染域内的局部工具(局部变量和参数),即你只可以行使但不行修改。
  • [&]代表可通过引用获取浸染域内的局部工具(局部变量和参数),即你可以像下面例子中一样修改它。
  • [this]代表可通过值获取 this 指针。
  • [a,&b]代表通过值获取工具 a, 通过引用获取工具 b。

因此,假如你想在 lambda 函数中将数据转换成其他情势,你可以像下面这段代码一样,操作浸染域来行使 lambda。

每个开拓者都应该相识的一些C++特征

在上面的例子中,假如你在 lambda 表达式中行使 [factor] 取值的方法获取结局部变量,你就不能在第五行中修改 factor,由于你没有权力这样做。不要滥用你的权限!

最后,留意这里 var 是引用。这担保了在 lambda 函数内的任何改变城市真正改变 vector。

if 或 switch 语句里的初始状态

当我相识了 c++17 的这个特征之后我很是喜好。

显然,此刻你可以在 if/switch 语句块内初始化变量而且举办前提搜查了。这对保持代码的紧凑和简捷长短常有辅佐的。凡是情势如下:

  1. if( init-statement(x); condition(x)) { 
  2.     // do some stuff here 
  3. } else { 
  4.     // else has the scope of x 
  5.     // do some other stuff 

编译时执行 constexpr

constexpr 很是酷!

假设你有一些表达式要计较,而且它的值一旦初始化就不会改变。你可以预先计较该值而且作为宏来行使。可能像 C++11 中提供的,你可以行使 constexpr。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读