首页 / 程序员 / 正文
不知道C++这七大特性,绝对枉为圈中人
Sophia148 发表于:2020-3-21 13:26:37 复制链接 看图 发表新帖
阅读数:5471

下载APP可以快速和圈友联系

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
全文共3039字,估计进修时长6分钟

不晓得C++这七大特征,绝对枉为圈中人-1.jpg

来历:Pexels


作为一种计较机说话,C++履历了很多成长变化。
固然,这些改变并不是一挥而就的。C++已经缺少活力与创新,是以很不受接待。
可是在C++标准委员会决议加速成长这个说话以后,情势发生了改变。
2011年起,C++一跃成为了具有活力、不竭演进、广受爱好的计较机说话。
C++演变后也并没有简单几多,还是最难的编程说话之一。可是,C++确切比之前加倍人性化了。
本文要讲的是的C++的一些新特征(以有8年历史的C++11为例),相信每个法式员城市对这个话题感爱好。
注:本文略过了一些高级特征。


1. 关键字auto
当C++11第一次引入auto时,法式员们纷纷喜极而泣!
auto的意义是使C++编译器可以在编译时推导数据范例,这样就不用每次都要声明数据范例了。当数据范例为map时尤其便利。



不晓得C++这七大特征,绝对枉为圈中人-2.jpg



没有initializer,就没法声明数据范例(见第五行)。这是说得通的。第五行指令并没有让编译器推导数据范例。
开初,auto的功用比力有限。在以后新版本的C++中,auto的功用越来越强大。



不晓得C++这七大特征,绝对枉为圈中人-3.jpg



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


请留意利用auto时,编译器必须可以推导数据范例。


一个风趣的题目是:假如写下autoa = {1, 2, 3}会发生什么?这是个编译毛病吗?是一个矢量吗?



不晓得C++这七大特征,绝对枉为圈中人-4.jpg



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


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



不晓得C++这七大特征,绝对枉为圈中人-5.jpg



别忘了检查第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++这七大特征,绝对枉为圈中人-6.jpg



以上例子可以说明很多题目。
首先,请留意花括号初始化是若何提升权重的。然后是通用的begin(),end() (这也是C++11的新增部分)。接着是作为数据比力器的lambda函数。lambda函数的参数被声明为auto(这是C++14的新增部分)。在C++14之前是不能对于函数参数利用auto 的。


正如现代C++的awesome库中界说的那样:


· []—不捕捉任何工具。所以不能在lambda表达式内利用全局感化域的部分变量,只能利用参数。
· [=]— 按值捕捉感化域中的部合作具(部分变量,参数)。只可利用不成点窜。
· [&]—按援用捕捉感化域中的部合作具(部分变量,参数)。可以被点窜。例子以下。
· [this]—按值捕捉this 指针。
· [a, &b]—按值捕捉工具a ,按援用捕捉工具b。
所以,假如想在lambda函数内部将数据转换为其他格式,可以操纵感化域的上风来应用lambda.比如:



不晓得C++这七大特征,绝对枉为圈中人-7.jpg



在上面这个例子中,假如在lambda表达式中按值捕捉([factor])部分变量,则不能改变第五行的factor.缘由很简单——没有权限。
终极,请留意示例中利用了val 作为援用 (reference). 这确保了lambda函数内部的任何变化城市改变vector.



不晓得C++这七大特征,绝对枉为圈中人-8.jpg



学完现代C++后,她们乐开了花!(摄影:Ian Schneider 图源:Unsplash)
3. if/switch内的初始化语句
C++17的这个特征非常讨喜:



不晓得C++这七大特征,绝对枉为圈中人-9.jpg



很明显,现在可以同时在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++这七大特征,绝对枉为圈中人-10.jpg



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


请留意,传递参数是一个const 值。这是被声明为constexpr的函数的一个重点——传递参数应当是constexpr或const。否则这里的函数会和普通函数一样,也就是说编译时不停止预运算。


变量也可以是constexpr. 在这类情况下,这些变量在编译时必须可评价;否则会出现编译毛病。


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


5. Tuples元组


与pair很是类似, tuple是各类数据范例的牢固巨细值的调集。



不晓得C++这七大特征,绝对枉为圈中人-11.jpg



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


6. 类模板参数推导


这个特征的名字还挺烦琐。从C++17起头,标准类模板也可以停止模板参数推导。之前,模板参数推导只支持函数模板。成果就是:
std::pair user = {"M", 25}; // previous
std::pair user = {"M", 25}; // C++17


这类推导是“隐性的”。这对于tuple来说就更方便了。
// previous
std::tuple user ("M","Chy", 25);
// deduction in action!
std::tuple user2("M", "Chy", 25);


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


7. 智能指针


指针偶然很可骇。由于C++说话为法式员供给了很洪流平的自在,所以偶然很轻易搬起石头砸自己的脚。而且很多情况下,麻烦是由指针酿成的。


荣幸的是,C++11引入了智能指针,智能指针比普通指针便利很多。它们经过当令开释内存来帮助法式员避免内存泄露。它们还有助于代码到达异常平安品级。
C++为最新版本的计较机说话引入了很多全新的特征。假如你感爱好,可以停止深入领会。

不晓得C++这七大特征,绝对枉为圈中人-12.jpg

留言 点赞 关注

我们一路分享AI进修与成长的干货
接待关注全平台AI垂类自媒体 “读芯术”


上一篇:苹果的开放性,或从iOS 14起头
下一篇:TypeScript 让你不会想用回 JavaScript
温馨提示:
下载好向圈客户端可以随时随地交流学习经验,也可以和圈友发起聊天成为好友
好向圈www.kuaixunai.com是一个专业经验分享交流平台,请提供优质的经验内容分享,拒绝任何广告内容出现,低质量广告内容硬广包含手机号码,微信,QQ或者二维码,网址等形式存在可能会审核不通过 要想被各大搜索引擎尽快收录请做好内容原创工作,才会有更好的推广效果。
返回列表
使用道具 举报
#不知道, #七大, #特性, #绝对, #中人
13 条评论
您需要登录后才可以回帖 登录 | 立即注册
123465597 发表于 2020-3-21 13:26:46 | 阅读全部
auto用得最多,constexpr也有用。lambda表达式有用过,但感觉还是用在弱类型语言(如JS)更好理解,右值引用...反而感觉带来了副作用,以前函数形参可以引用传递,现在区分左右值引用,想引用传递,必须重载两个函数,其他一模一样,只是形参分别用左右值引用。这样直接导致代码长度加倍,降低代码可读性。大神们有没有更好的做法?
使用道具 举报
回复
张贺学长 发表于 2020-3-21 13:27:23 | 阅读全部
除了auto、lambda,其他语法没多大便利性。容易引入bug
使用道具 举报
回复
孤独小孩孤n 发表于 2020-3-21 13:28:22 | 阅读全部
c++变得像java python了
使用道具 举报
回复
最爱八卦哈哈庇 发表于 2020-3-21 13:28:43 | 阅读全部
最讨厌新特性多的语言[捂脸][捂脸]
使用道具 举报
回复
大果梨俗 发表于 2020-3-21 13:29:02 | 阅读全部
很方便的功能,同时也很危险
使用道具 举报
回复
123465573 发表于 2020-3-21 13:29:36 | 阅读全部
目前对我来说最有用的是SFAINE和variadic template
使用道具 举报
回复
太阳能手电筒迫 发表于 2020-3-21 13:29:47 | 阅读全部
这些特性,我都不会[捂脸][捂脸][捂脸][捂脸]
使用道具 举报
回复
专喷脑残蓝qd 发表于 2020-3-21 13:30:25 | 阅读全部
还在用C++99。[呲牙]
使用道具 举报
回复
歇天高傧 发表于 2020-3-21 13:31:01 | 阅读全部
加了这么多特性也不会便捷多少,使用它要解决其它语言不好解决的问题,不是要把它变成脚本语言
使用道具 举报
回复
萌面大盗Rich 发表于 2020-3-21 13:31:48 | 阅读全部
这几个特性确实很好用
使用道具 举报
回复
易水寒风酪 发表于 2020-3-21 13:32:33 | 阅读全部
基本上只用c开发经常用的库,c++标准越来越多,烦
使用道具 举报
回复
123465597 发表于 2020-3-21 13:32:46 | 阅读全部
转发了
使用道具 举报
回复
曾有容颜 发表于 2020-3-21 13:33:12 | 阅读全部
转发了
使用道具 举报
回复
相关推荐
广告合作以及侵权投诉客服QQ:1623331347 江苏好向圈信息科技有限公司 网站地图1 网站地图2