作为一种计算机语言,c++经历了许多发展变化。
当然,这些改变并不是一蹴而就的。c++曾经缺乏活力与创新,因此很不受欢迎。
但是在c++标准委员会决定加速发展这个语言之后,形势发生了改变。
2011年起,c++一跃成为了具有活力、不断演进、广受喜爱的计算机语言。
c++蜕变后也并没有简单多少,仍是最难的编程语言之一。但是,c++确实比之前更加人性化了。
本文要讲的是的c++的一些新特性(以有8年历史的c++11为例),相信每个程序员都会对这个话题感兴趣。
注:本文略过了一些高级特性。
1. 关键字auto
当c++11第一次引入auto时,程序员们纷纷喜极而泣!
auto的意义是使c++编译器可以在编译时推导数据类型,这样就不用每次都要声明数据类型了。当数据类型为
map
?起初,auto的功能比较有限。在之后新版本的c++中,auto的功能越来越强大。
第七行和第八行中使用了括号初始化 (bracketedinitialization),这也是c++11的新特性之一。
请注意使用auto时,编译器必须能够推导数据类型。
一个有趣的问题是:如果写下autoa = {1, 2, 3}会发生什么?这是个编译错误吗?是一个矢量吗?
以上代码是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是各种数据类型的固定大小值的集合。
有时,相比于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引入了智能指针,智能指针比普通指针便捷得多。它们通过适时释放内存来帮助程序员防止内存泄漏。它们还有助于代码达到异常安全等级。
营销型网站设计与普通网站之间的区别移动网站建设用户体验介绍怎样利用百度影响因素做好seo搜索排名?Adobe推出体验设计的CC郑州网站建设哪家价格便宜质量好?网站的数据监控,关键词排名、流量等中小企业网站运营工作如何安排?如何判断一个网站好不好