吉祥坊官方平台

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

吉祥坊

每个开发人员都应该知道的一些C ++特性

从中等

作者:M Chowdhury

参与:韩芳,拍摄

C ++是一种功能强大的编程语言,但由于其复杂性,它一直被用户所禁止。后来,C ++决定进行更改,然后它逐渐发展成为编程社区中最受欢迎的语言之一。 C ++有一些非常容易使用的新功能。本文将介绍它,例如auto,lambda,constexpr,tuple,smart pointers等。

d6dc1717c6f94c05aee3277fd9b0cbc2.jpeg

作为一种编程语言,C ++已经发展了很多。

当然,这些变化并非一蹴而就。曾几何时,C ++缺乏活力,导致人们不喜欢这种语言。

但是,当C ++标准委员会决定加快转型时,情况就不同了。

自2011年以来,C ++已经成为一种不断发展的动态语言,这正是许多人所期望的。

不要误以为这种语言变得简单,但事实并非如此。它仍然是最难以被广泛使用的编程语言之一。但与之前的版本相比,它实际上更加用户友好。

今天,我们深入研究每个开发人员应该理解的新功能(这些新功能自C ++ 11以来就已存在,已经存在了八年)。请注意,本文略过了稍后可能详细介绍的一些高级功能。

自动概念

当C ++ 11首次引入auto时,一切都变得更容易了。

auto的概念是让C ++编译器在编译时自动推断数据类型,而不是要求您每次手动声明类型。如果您的数据类型是map>>

a4e66b7395484142b104e3e62017fae1.jpeg

看看第五行。没有初始化程序就不能声明一些东西,这并不难理解。与第五行一样,编译器无法推断数据类型。

最初,汽车的使用非常有限。在以后的版本中,auto变得更加强大!

4227ed31ecd54eacbaa7df6edfe2cf70.jpeg

在第7行和第8行中,我使用花括号进行初始化。此功能在C ++ 11中也是新功能。

请记住,使用auto时,必须确保编译器能够以某种方式推断数据类型。

现在问题来了。如果我写自动a={1,2,3}会怎样?会出现编译错误吗?这是一个载体吗?

事实上,C ++ 11引入了std: initializer_list,如果声明为auto,初始化列表将被视为轻量级容器。

最后,如前所述,编译器在使用复杂数据类型时推断数据类型很有用。

e62c6ab0d50944acb66e7b9c381c1477.jpeg

别忘了查看第25行!表达式auto [v1,v2]=itr.second是C ++ 17的一个新特性。这称为结构化绑定。在以前的版本中,每个变量都必须单独提取,但结构化绑定使得该过程更加方便。

此外,如果您想通过引用获取数据,只需添加一个符号,如auto& [v1,v2]=itr.second,这非常简洁。

Lambda表达式

C ++ 11引入了一个lambda表达式,它非常类似于Java中的匿名函数。它们是未命名的函数对象,它们基于一些简洁的语法在不同的范围内捕获,也可以分配给变量。

当你想在代码中快速实现一些小函数但不想为此目的编写整个函数时,Lambda非常有用。另一个非常常见的应用是将其用作比较功能。

95a52b1f8b8f416e863d97dce753f0d4.jpeg

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

首先,注意列表初始化保存了多少代码。然后是通用的begin()和end(),它们在C ++ 11中也是新的。然后有lambda函数作为数据比较器。 lambda函数的参数声明为auto,这在c ++ 14中是新的。在此之前,无法使用auto作为函数参数。

这里使用方括号[]作为lambda表达式的开头。它定义了lambda函数的范围,它是对局部变量和对象拥有多少权限。

以下是现代C ++中的一些相关定义:

[]代表空。因此,您不能在lambda表达式中使用任何外部作用域的局部变量。只能使用参数。

[=]表示范围内的本地对象(局部变量和参数)可以通过值获取,即您只能使用但不能修改它们。

[&]表示范围内的本地对象(局部变量和参数)可以通过引用获得,即您可以像下面的示例中那样修改它。

[this]表示可以通过值获取此指针。

[a,& b]表示通过值获得的对象a,并且通过引用表示对象b。

因此,如果要将数据转换为lambda函数中的其他表单,可以使用范围来使用lambda,如下面的代码所示。

0f12be4d3a6e46a0b1a2ccfacee1b03a.jpeg

在上面的示例中,如果使用lambda表达式中的[factor]值获取局部变量,则无法修改第五行中的因子,因为您没有权限这样做。不要滥用你的权限!

最后,请注意var是这里的参考。这可以确保lambda函数中的任何更改都会实际更改向量。

if或switch语句中的初始状态

当我了解c ++ 17的这个特性时,我真的很喜欢它。

件。这对于保持代码紧凑和简洁非常有用。通常表格如下:

如果(init-statement(x); condition(x)){

//在这里做点什么

} else {

//其他的范围是x

//做一些其他的事情

}

在编译时执行constexpr

Constexpr非常酷!

假设您有一些要计算的表达式,并且一旦初始化它的值就不会改变。您可以预先计算此值并将其用作宏。或者如C ++ 11中提供的那样,您可以使用constexpr。

程序员倾向于最小化程序的运行时间。因此,如果编译器可以执行某些操作,则可以减少运行时负担并提高时间效率。

451318fa75ec4a2093b9ff1dd7c64a35.jpeg

上面的代码是constexpr的常见示例。

由于我们声明fibonacci计算函数是constexpr,因此编译器在编译时预先计算fib(20)的值。所以在编译之后,它可以用const long long bigval=2432902008176640000替换const long long bigval=fib(20);

请注意,传递的参数是一个const值。这是声明为constexpr的函数的一个非常重要的点,传递的参数也是constexpr或const。否则,该函数将表现得像普通函数,即它不会在编译时预先计算。

变量也可以是constexpr。在这种情况下,您应该能够猜测这些变量也是在编译时计算的。否则,将发生编译错误。

有趣的是,在后来的c ++ 17中,引入了constexpr-if和constexpr-lambda。

元组

非常像一对,元组是各种数据类型的固定大小值的集合。

564143eced754304b90c4a7dac5c70b5.jpeg

有时使用std:数组比使用元组更方便。 Array与普通的C类型数组非常相似,但具有C ++标准库的一些功能。此数据结构是C ++ 11中的新增功能。

类模板参数推断

这个名字有点长。从c ++ 17开始,参数推断也适用于标准类模板。以前,此功能仅支持功能模板。

因此,

标准值:对用户={'M',25}; //上一个

标准值:对用户={'M',25}; //C ++ 17

类型推断是隐式完成的。这对于元组来说更方便。

//上一个

标准:元组用户('M','Chy',25);

//扣除行动!

标准:元组user2('M','Chy',25);

如果您不熟悉C ++模板,可能无法很好地理解上述功能。

智能指针

指针也可能无法正常工作。

因为C ++为程序员提供了很大的自由,有时这种自由可能会成为一个绊脚石。在大多数情况下,指针的作用方向相反。

幸运的是,C ++ 11引入了比原始指针更方便的智能指针,可以帮助开发人员通过正确的指针释放来避免内存泄漏,并提供额外的安全性。

一开始,我想在本文中详细讨论智能指针,但显然有很多重要的细节,值得写一篇文章,所以相关文章应该在不久的将来发表。

原始地址:

看看更多