成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不知道C++這七大特性,絕對枉為圈中人

開發 后端
C++蛻變后也并沒有簡單多少,仍是最難的編程語言之一。但是,C++確實比之前更加人性化了。本文要講的是的C++的一些新特性(以有8年歷史的C++11為例),相信每個程序員都會對這個話題感興趣。

作為一種計算機語言,C++經歷了許多發展變化。

當然,這些改變并不是一蹴而就的。C++曾經缺乏活力與創新,因此很不受歡迎。

但是在C++標準委員會決定加速發展這個語言之后,形勢發生了改變。

2011年起,C++一躍成為了具有活力、不斷演進、廣受喜愛的計算機語言。

C++蛻變后也并沒有簡單多少,仍是最難的編程語言之一。但是,C++確實比之前更加人性化了。

本文要講的是的C++的一些新特性(以有8年歷史的C++11為例),相信每個程序員都會對這個話題感興趣。

注:本文略過了一些高級特性。

1. 關鍵字auto

當C++11***次引入auto時,程序員們紛紛喜極而泣!

auto的意義是使C++編譯器可以在編譯時推導數據類型,這樣就不用每次都要聲明數據類型了。當數據類型為

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

 

不知道C++這七大特性,絕對枉為圈中人

沒有initializer,就無法聲明數據類型(見第五行)。這是說得通的。第五行指令并沒有讓編譯器推導數據類型。

起初,auto的功能比較有限。在之后新版本的C++中,auto的功能越來越強大。

不知道C++這七大特性,絕對枉為圈中人

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

請注意使用auto時,編譯器必須能夠推導數據類型。

一個有趣的問題是:如果寫下autoa = {1, 2, 3}會發生什么?這是個編譯錯誤嗎?是一個矢量嗎?

[[267239]]

實際上,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表達式內使用全局作用域的局部變量,只能使用參數。
  • [=]— 按值捕獲作用域中的局部對象(局部變量,參數)。只可使用不可修改。
  • [&]—按引用捕獲作用域中的局部對象(局部變量,參數)。可以被修改。例子如下。
  • [this]—按值捕獲this 指針。
  • [a, &b]—按值捕獲對象a ,按引用捕獲對象b。

所以,如果想在lambda函數內部將數據轉換為其他格式,可以利用作用域的優勢來運用lambda.比如:

不知道C++這七大特性,絕對枉為圈中人

在上面這個例子中,如果在lambda表達式中按值捕獲([factor])局部變量,則不能改變第五行的factor.原因很簡單——沒有權限。

最終,請注意示例中使用了val 作為引用 (reference). 這確保了lambda函數內部的任何變化都會改變vector.

[[267240]]

學完現代C++后,她們樂開了花!(攝影:Ian Schneider 圖源:Unsplash)

3. if/switch內的初始化語句

C++17的這個特性十分討喜:

不知道C++這七大特性,絕對枉為圈中人

很明顯,現在可以同時在if/switch句塊內進行變量初始化和條件檢查。這有助于保持代碼簡潔精煉。通用形式為:

  1. if( init-statement(x);condition(x)) { 
  2.  // do some stuff here 
  3. } else { 
  4.  // else has the scope of x 
  5.  // 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的函數的一個重點——傳遞參數應該是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<std::string,int> user = {"M", 25}; // previous 
  2. std::pair user = {"M", 25}; // C++17 

這種推導是“隱性的”。這對于tuple來說就更方便了。

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

以上這一特性對不熟悉C++模板的人來說沒有太大用處。

7. 智能指針

指針有時很恐怖。由于C++語言為程序員提供了很大程度的自由,所以有時很容易搬起石頭砸自己的腳。而且很多情況下,麻煩是由指針造成的。

幸運的是,C++11引入了智能指針,智能指針比普通指針便捷得多。它們通過適時釋放內存來幫助程序員防止內存泄漏。它們還有助于代碼達到異常安全等級。

責任編輯:趙寧寧 來源: 讀芯術
相關推薦

2011-08-10 23:28:49

打印機常見問題

2023-03-20 07:32:26

配置代碼Spring

2023-03-26 08:15:04

代碼配置Spring

2023-02-27 09:20:24

絕對定位CSS

2023-04-09 23:37:31

JavaScript開發

2011-01-13 13:48:52

Android 3.0

2020-08-25 11:04:48

SaaS云服務云安全

2024-12-17 08:33:42

2012-12-26 09:14:40

Windows Ser微軟

2012-12-25 10:05:27

2017-01-19 09:41:29

2009-07-16 10:35:34

iBATIS特性

2013-07-22 15:36:48

谷歌秘密項目

2024-01-09 07:39:20

maven特性版本

2021-09-17 13:17:56

Spring 模塊開發

2017-12-08 10:08:52

2012-10-29 13:47:47

Surface RT

2016-05-03 15:13:34

大數據大數據技術數據管理

2014-01-22 16:19:06

游戲圈游戲創業移動游戲

2022-01-04 07:30:24

IT熱門技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本在线一二 | 久久综合一区二区三区 | 中文字幕第90页 | 欧美久久国产精品 | 在线观看日韩 | 国产精品污污视频 | 日韩精品一区二区三区视频播放 | 91精品国产91久久久久久丝袜 | 国产色在线 | 成人影院一区二区三区 | 在线观看免费国产 | 亚洲一区精品在线 | 日韩第一夜 | 久久久久国产一区二区三区 | 亚洲不卡一 | 国产a区| 综合久久亚洲 | 成人欧美一区二区 | 亚洲精品乱码久久久久久按摩观 | 91九色在线观看 | 蜜桃av一区二区三区 | 日本一区二区不卡 | 亚洲精品久久久久中文字幕欢迎你 | 嫩草国产| 日本特黄a级高清免费大片 国产精品久久性 | 亚洲一区二区av | 99久久婷婷国产综合精品电影 | 九色 在线 | 国产精品亚洲一区二区三区在线 | 中文字幕欧美日韩 | 五月天综合网 | 久久精品视频在线播放 | 丁香婷婷成人 | 一本岛道一二三不卡区 | 久久久久久久久久久久久9999 | 久久久精品一区二区三区 | 日韩欧美综合在线视频 | 成人欧美一区二区三区在线播放 | 久久久高清 | 欧美日韩精品影院 | 精品区 |