不知道C++这七大特性,绝对枉为圈中人

2021-02-16    分类: 网站建设

作为一种计算机语言,C++经历了许多发展变化。

当然,这些改变并不是一蹴而就的。C++曾经缺乏活力与创新,因此很不受欢迎。

但是在C++标准委员会决定加速发展这个语言之后,形势发生了改变。

2011年起,C++一跃成为了具有活力、不断演进、广受喜爱的计算机语言。

C++蜕变后也并没有简单多少,仍是最难的编程语言之一。但是,C++确实比之前更加人性化了。

本文要讲的是的C++的一些新特性(以有8年历史的C++11为例),相信每个程序员都会对这个话题感兴趣。

注:本文略过了一些高级特性。

1. 关键字auto

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

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

  1. map>> 

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

起初,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是各种数据类型的固定大小值的集合。

不知道C++这七大特性,绝对枉为圈中人

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

6. 类模板参数推导

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

  1. std::pair user = {"M", 25}; // previous 
  2. std::pair user = {"M", 25}; // C++17 

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

  1. // previous 
  2. std::tuple user ("M","Chy", 25); 
  3. // deduction in action!  
  4. std::tuple user2("M", "Chy", 25); 

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

7. 智能指针

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

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

网站名称:不知道C++这七大特性,绝对枉为圈中人
文章分享:https://www.cdcxhl.com/news/101274.html

成都网站建设公司_创新互联,为您提供商城网站网站导航面包屑导航全网营销推广动态网站企业网站制作

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

商城网站建设