文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++的七大特性是什么

2023-06-16 21:01

关注

本篇内容介绍了“C++的七大特性是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1. 关键字auto

当C++11***次引入auto时,程序员们纷纷喜极而泣!

auto的意义是使C++编译器可以在编译时推导数据类型,这样就不用每次都要声明数据类型了。当数据类型为

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

C++的七大特性是什么

没有initializer,就无法声明数据类型(见第五行)。这是说得通的。第五行指令并没有让编译器推导数据类型。

起初,auto的功能比较有限。在之后新版本的C++中,auto的功能越来越强大。

C++的七大特性是什么

第七行和第八行中使用了括号初始化 (bracketedinitialization),这也是C++11的新特性之一。

请注意使用auto时,编译器必须能够推导数据类型。

一个有趣的问题是:如果写下autoa = {1, 2, 3}会发生什么?这是个编译错误吗?是一个矢量吗?

实际上,C++11引入了std::initializer_list.如果声明auto,花括号初始化列表会被当做轻量级容器。

最终,正如前文所言,当数据结构复杂时,编译器类型推导很有帮助:

C++的七大特性是什么

别忘了检查第25行!auto [v1,v2] =  itr.second纯粹是C++17的新特性。这个特性叫做结构化绑定。在旧版本C++中,程序员需要单独获取每个变量。但是结构化绑定给这一过程带来了便利。此外,如果想获得数据使用引用(reference),只需要加上一个symbol--auto&[v1,v2]  = itr.second.

2. Lambda表达式

C++11引入了lambda表达式,这类似于JavaScript里的匿名函数。它们都是函数对象,没有名字,且基于简洁的语法在不同作用域上捕获变量。它们也可以被分配给变量。

如果需要在代码中进行一些小而快的操作,又不愿意为此单独写一个函数,那么Lambdas很有用。另一种常见用法是将lambdas作为比较函数。

C++的七大特性是什么

以上例子可以说明很多问题。

首先,请注意花括号初始化是如何提升权重的。然后是通用的begin(),end()  (这也是C++11的新增部分)。接着是作为数据比较器的lambda函数。lambda函数的参数被声明为auto(这是C++14的新增部分)。在C++14之前是不能对于函数参数使用auto  的。

正如现代C++的awesome库中定义的那样:

所以,如果想在lambda函数内部将数据转换为其他格式,可以利用作用域的优势来运用lambda.比如:

C++的七大特性是什么

在上面这个例子中,如果在lambda表达式中按值捕获([factor])局部变量,则不能改变第五行的factor.原因很简单&mdash;&mdash;没有权限。

最终,请注意示例中使用了val 作为引用 (reference). 这确保了lambda函数内部的任何变化都会改变vector.

学完现代C++后,她们乐开了花!(摄影:Ian Schneider 图源:Unsplash)

3. if/switch内的初始化语句

C++17的这个特性十分讨喜:

C++的七大特性是什么

很明显,现在可以同时在if/switch句块内进行变量初始化和条件检查。这有助于保持代码简洁精炼。通用形式为:

if( init-statement(x);condition(x)) {  // do some stuff here } else {  // else has the scope of x  // do some other stuff }

4. 在编译时使用constexpr

constexpr  很棒!假如要评估一些表达式,且它的值一旦初始化就不会改变,那么可以预运算其值并将之作为宏。或者利用C++11提供的constexpr.

程序员倾向于尽量减少程序运行时间。所以,如果能让编译器进行一些操作并减小程序运行的压力,那么就可以缩短运行时间。

C++的七大特性是什么

以上代码是constexpr的常见例子之一。既然声明斐波那契数列函数为constexpr, 那么编译器就可以在编译时预运算fib(20).  所以编译之后,可以用constlong long bigval = 2432902008176640000来替代const longlong bigval =  fib(20).

请注意,传递参数是一个const  值。这是被声明为constexpr的函数的一个重点&mdash;&mdash;传递参数应该是constexpr或const。否则这里的函数会和普通函数一样,也就是说编译时不进行预运算。

变量也可以是constexpr. 在这种情况下,这些变量在编译时必须可评估;否则会出现编译错误。

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

5. Tuples元组

与pair非常类似, tuple是各种数据类型的固定大小值的集合。

C++的七大特性是什么

有时,相比于tuple,使用 std::array更方便。array类似于带有C++标准库的功能的plain  C阵列。这个数据结构是C++11新增的。

6. 类模板参数推导

这个特性的名字还挺啰嗦。从C++17开始,标准类模板也可以进行模板参数推导。之前,模板参数推导只支持函数模板。结果就是:

std::pair<std::string,int> user = {"M", 25}; // previous std::pair user = {"M", 25}; // C++17

这种推导是“隐性的”。这对于tuple来说就更方便了。

// previous std::tuple<std::string, std::string, int> user ("M","Chy", 25); // deduction in action!  std::tuple user2("M", "Chy", 25);

以上这一特性对不熟悉C++模板的人来说没有太大用处。

7. 智能指针

指针有时很恐怖。由于C++语言为程序员提供了很大程度的自由,所以有时很容易搬起石头砸自己的脚。而且很多情况下,麻烦是由指针造成的。

幸运的是,C++11引入了智能指针,智能指针比普通指针便捷得多。它们通过适时释放内存来帮助程序员防止内存泄漏。它们还有助于代码达到异常安全等级。

“C++的七大特性是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯