日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++17新特性_每个开发者都应该了解的一些C++特性

發布時間:2024/1/23 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++17新特性_每个开发者都应该了解的一些C++特性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++ 是一種強大的編程語言,但也因為其復雜性一直讓用戶望而卻步。后來,C++ 決定做出改變,然后發展至今,成了編程社區最受歡迎的語言之一。C++ 有一些新特性非常好用,本文對此進行了介紹,比如 auto、lambda、constexpr、tuple、智能指針等。

作為一門編程語言,C++已經進化了很多。

當然,這些改變不是一夜之間發生的。曾幾何時,C++缺乏活力,導致人們不太喜歡這門語言。

但是,當 C++標準委員會決定加快轉變時,情況就不同了。

自 2011 年以來,C++已經成為一種不斷發展的動態語言,而這正是很多人所期許的。

不要誤以為是這門語言變得簡單了,實際并沒有。它仍然是被廣泛使用的最難編程語言之一。但是相比于之前的版本,確實對用戶更加友好了。

今天,我們深入發掘一下每位開發者都應該了解的新特性(這些新特性從 C++11 時開始出現,距今已有八年歷史了)。注意,本文略過了一些高級特性,可能會在以后的內容中詳細探討。

auto 概念

當 C++11 第一次引入 auto,一切都變得更簡單了。

auto 的概念是讓 c++編譯器在編譯時自動推斷數據的類型,而不是每次都要求你手動聲明類型。如果你的數據類型是 map>>

看一下第五行。沒有 initializer 時你不能聲明某些東西,這不難理解。像第五行這樣,編譯器是無法推斷數據類型的。

最初,auto 的使用是非常受限的。在之后的版本中,auto 變得更加強大!

第 7 和第 8 行中,我使用了花括號初始化。這個特性也是 C++11 中新加入的。

記住,當使用 auto 時,必須確保你的編譯器可以通過某種方式推斷數據類型。

現在問題來了,如果我寫 auto a = {1, 2, 3} 會發生什么?會有編譯錯誤嗎?這是向量嗎?

實際上,C++11 引入了 std::initializer_list,如果聲明為 auto,那么初始化列表會被認為是這種輕量級容器。

最后,就像前面提到的,當你使用復雜的數據類型時,編譯器推斷數據類型會非常有用。

不要忘記查看第 25 行!表達式 auto [v1,v2] = itr.second 是 C++17 的新特性。這被稱為結構化綁定。在之前的版本中,每個變量必須要分別進行提取,然而結構化綁定會使這個過程方便很多。

另外,如果你想通過引用獲取數據,只需要添加一個像 auto &[v1,v2] = itr.second 這樣的符號,非常簡潔。

lambda 表達式

C++11 引入了 lambda 表達式,該表達式和 JavaScript 中的匿名函數非常相似。它們是沒有命名的函數對象,并且基于一些簡潔的語法在不同的作用域捕獲變量,它們還可以分配給變量。

當你想在代碼中快速實現一些小功能但并不想為此單獨編寫整個函數時,lambda 非常有用。另一種非常普遍的應用是將其作為比較函數。

上面的例子中有很多細節。

首先,要注意到列表初始化為你節省了多少代碼。然后是通用的 begin() 和 end(),它們同樣也是 C++11 中新添加的。然后是作為數據比較器的 lambda 函數。lambda 函數的參數被聲明為 auto,這是 c++14 中新增的。在此之前,是不可以用 auto 作為函數參數的。

這里使用方括號[]作為 lambda 表達式的開始。它定義了 lambda 函數的作用域,即它對局部變量和對象有多少權限。

下面是一些現代 c++中的相關定義:

  • []代表空。因此你不可以在 lambda 表達式中使用任何外部作用域的局部變量。只可以使用參數。
  • [=]代表可通過值獲取作用域內的局部對象(局部變量和參數),即你只可以使用但不可修改。
  • [&]代表可通過引用獲取作用域內的局部對象(局部變量和參數),即你可以像下面例子中一樣修改它。
  • [this]代表可通過值獲取 this 指針。
  • [a,&b]代表通過值獲取對象 a, 通過引用獲取對象 b。

因此,如果你想在 lambda 函數中將數據轉換成其他形式,你可以像下面這段代碼一樣,利用作用域來使用 lambda。

在上面的例子中,如果你在 lambda 表達式中使用 [factor] 取值的方式獲取了局部變量,你就不能在第五行中修改 factor,因為你沒有權利這樣做。不要濫用你的權限!

最后,注意這里 var 是引用。這保證了在 lambda 函數內的任何改變都會真正改變 vector。

if 或 switch 語句里的初始狀態

當我了解了 c++17 的這個特性之后我非常喜歡。

顯然,現在你可以在 if/switch 語句塊內初始化變量并且進行條件檢查了。這對保持代碼的緊湊和簡潔是非常有幫助的。通常形式如下:

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

編譯時執行 constexpr

constexpr 非常酷!

假設你有一些表達式要計算,并且它的值一旦初始化就不會改變。你可以預先計算該值并且作為宏來使用。或者像 C++11 中提供的,你可以使用 constexpr。

編程人員傾向于盡可能減少程序的運行時間。因此如果某些操作可以讓編譯器來做,就可以減輕運行時的負擔,從而提高時間效率。

上面的代碼是 constexpr 的一個常見例子。

由于我們聲明 fibonacci 計算函數為 constexpr,編譯器會在編譯時預先計算 fib(20) 的值。所以編譯結束后,它可以把 const long long bigval = fib(20) 替換為 const long long bigval = 2432902008176640000;

需要注意的是,傳遞的參數是 const 值。這是聲明為 constexpr 的函數非常重要的一點,傳遞的參數同樣要是 constexpr 或者 const。否則,該函數會像普通函數一樣執行,即不會在編譯時預先計算。

變量也同樣可以是 constexpr。這種情況下,你應該可以猜到,這些變量同樣也是編譯時計算的。否則,會出現編譯錯誤。

有趣的是,在之后的 c++17 中,又引入了 constexpr-if 和 constexpr-lambda。

tuple

和 pair 非常相似,tuple 是一組各種數據類型的固定大小值的集合。

有時候,使用 std::array會比使用 tuple 更加方便。array 和普通 C 類型的 array 非常相似,但具有 C++標準庫的一些特性。這種數據結構是 C++11 中新增的。

類模版參數推斷

名字有點長。從 c++17 開始,參數推斷也適用于標準類模版。此前,該特性只支持函數模版。

因此,

std::pair<:string int> user = {"M

總結

以上是生活随笔為你收集整理的c++17新特性_每个开发者都应该了解的一些C++特性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。