C++ 介紹
C++ 是一種通用的、靜態類型的、支援多範式編程的程式語言,它具有高效性、可擴展性和靈活性,常被用於系統開發、遊戲開發、嵌入式系統、高性能運算等領域。C++語言最初由 Bjarne Stroustrup 於1980年代開發(哇賽,我都還沒出生ㄟ) ,它是在C語言的基礎上進行擴展和增強而成的。
優點:它運行很快(但並不代表你可以快速 coding 完成) 缺點:難學!因為語言特性豐富、複雜的語法和概念、需要深入理解底層細節、豐富的標準庫和工具…
Reference: Tiobe Index
C++ 總整理
為什麼要整理? 因為 C++ 本身不斷的進步,使得 C++ 更加現代化、安全和易用,幾乎每隔 3 ~ 4 年就有一次重大變動。 以下整理 modern C++ 的重要進程(也就是 C++ 11 後、包含 C++ 11、C++ 14、C++ 17、C++ 20) 總共 30 個 items。
30 items of modern C++
- 自動類型推斷(auto關鍵字):允許編譯器根據初始化表達式的類型來推斷變量的類型。(𝘊++ 11)
- 範圍for循環(range-based for loop):通過for (auto& x : vec)這樣的語法,可以方便地遍歷容器中的元素。(𝘊++ 11)
- 移動語意(move semantics):引入右值引用(&&)和移動構造函數,以實現對臨時對象的有效移動,提高性能。(𝘊++ 11)
- 新的容器類型:引入了std::array、std::unordered_map等新的標準容器。(𝘊++ 11)
- lambda表達式:類似於匿名函數,可以在需要函數對象的地方使用。(𝘊++ 11)
- 空指針常量(nullptr):用於表示空指針,替代了傳統的NULL宏。(𝘊++ 11)
- 智能指针: std::unique_ptr和std::shared_ptr提供了更安全和方便的内存管理。(𝘊++ 11)
- 對多線程支持的增強:引入了std::thread、std::mutex等多線程相關的庫。(𝘊++ 11)
- constexpr:用於在編譯時求值的常量表達式,可以提高性能。(𝘊++ 11)
static_assert:用於在編譯時進行靜態斷言,檢查代碼的一致性。(𝘊++ 11)
- 二進制字面量(binary literals):允許使用0b或0B作為前綴來表示二進制數字。(𝘊++ 14)
- 泛型lambda表達式(generic lambda expressions):lambda表達式可以在參數列表中使用auto,方便地創建泛型函數對象。(𝘊++ 14)
- 返回類型推斷(return type deduction):允許函數的返回類型使用auto來進行類型推斷。(𝘊++ 14)
- 初始化捕獲(initializer capture):在lambda表達式中,可以通過初始化捕獲(如[x = std::move(x)])來捕獲外部變量。(𝘊++ 14)
常數表達式函數(constexpr function):允許在constexpr函數中使用if語句和局部變量等。(𝘊++ 14)
- 折疊表達式(fold expressions):引入了新的語法,用於簡化對參數包中元素的遍歷和操作。(𝘊++ 17)
- 智能指针增強:shared_ptr 支援創建動態數組。(𝘊++ 17)
- if語句中的初始化(initialization in if statements):允許在if和switch語句中直接初始化變量。(𝘊++ 17)
- 結構化綁定(structured bindings):允許從元組或其他類型的對象中解包成多個變量。(𝘊++ 17)
- constexpr if:引入了新的語法,允許在編譯時根據條件進行編譯時選擇。(𝘊++ 17)
- 聚合類的新特性:放寬了對聚合類的限制,允許聚合類有基類、額外的非靜態數據成員等。(𝘊++ 17)
reduce:用於對範圍內的元素進行歸約操作,默認使用並行執行進行效能優化。(𝘊++ 17)
- 概念(concepts):引入了新的語法,用於定義模板形式參數的約束,以提高模板代碼的可讀性和錯誤提示。(𝘊++ 20)
- 對區間的操作(ranges):引入了新的庫,用於定義和操作區間(range)的概念。(𝘊++ 20)
- 協程(coroutines):引入了新的語法和庫,用於支持協程(coroutine),使得異步編程更加方便。(𝘊++ 20)
- 範圍 for 迴圈增強:支援 for 迴圈的初始化語句和初始值設定項。(𝘊++ 20)
- 模塊(modules):引入了新的語法和標準庫,用於定義和使用模塊,以解決傳統的頭文件包含機制帶來的問題。(𝘊++ 20)
- 指定初始化器:允許我們在初始化結構體或聯合體時,顯式地指定每個成員的初始化方式。(𝘊++ 20)
- 三向比較運算符(three-way comparison operator):簡化並統一了對象之間的比較操作,使得可以一次性生成所有的比較運算符。(𝘊++ 20)
- likely 和 unlikely 屬性:幫助編譯器進行更好的優化。(𝘊++ 20)