c++
C++是一種高級編程語言,以其強大的功能、靈活性和高效性而聞名。它是由Bjarne Stroustrup在20世紀80年代初期在貝爾實驗室開發的,作為C語言的一個擴展。C++不僅包含了C語言的所有特性,還引入了面向對象編程(OOP)的概念,包括類、繼承、多態和封裝。
C++的一些關鍵特點:
-
面向對象編程:C++支持類和對象,允許程序員通過封裝、繼承和多態性來構建復雜的程序。
-
泛型編程:通過模板,C++支持泛型編程,允許程序員編寫與數據類型無關的代碼。
-
內存管理:C++提供了手動內存管理的能力,包括指針和動態內存分配。
-
異常處理:C++支持異常處理機制,允許程序在遇到錯誤時以一種結構化的方式進行恢復。
-
標準模板庫(STL):C++的STL提供了一系列的數據結構和算法,如向量(vector)、列表(list)、映射(map)和排序(sort)等。
-
函數重載:C++允許定義具有相同名稱但參數不同的多個函數。
-
運算符重載:C++允許程序員為用戶定義的類型重新定義運算符的行為。
-
多重繼承:C++支持從多個基類繼承,雖然這可能導致復雜的設計問題。
-
模板:模板是C++的一個強大特性,允許程序員定義可以處理多種數據類型的類和函數。
-
編譯時多態:通過函數重載和模板,C++支持在編譯時解決多態性。
-
運行時多態:C++通過虛函數支持運行時多態性。
-
性能:C++以其高性能而著稱,通常用于需要快速執行和低級別硬件操作的應用程序。
-
跨平臺:C++可以在多種操作系統和硬件平臺上編譯和運行。
C++廣泛應用于系統軟件、游戲開發、嵌入式系統、實時系統、模擬科學計算、生物信息學、高頻交易等領域。隨著C++標準的不斷更新,C++語言持續發展,引入了現代化的特性,如自動存儲期管理、基于概念的模板編程、并發編程支持等,以適應現代軟件開發的需求。
c++版本演變
c++各版本主要特點
c++03
-
值初始化(Value-initialization):C++03引入了值初始化的概念,這是對對象進行初始化的一種方式,它使用默認值對對象進行初始化。
-
std::auto_ptr:雖然std::auto_ptr在C++98中已經存在,但C++03對其進行了改進,使其成為標準庫的一部分。
-
成員模板:C++03對成員模板的支持進行了改進,允許更靈活地使用模板類。
-
命名空間別名:C++03允許使用namespace別名,使得使用長命名空間更為方便。
-
類型轉換運算符:C++03明確了static_cast、dynamic_cast、const_cast和reinterpret_cast的使用,這些在C++98中已經被引入,但在C++03中得到了進一步的明確和標準化。
-
bool類型:C++03繼續支持bool類型,并對其進行了標準化。
-
異常處理:C++03對異常處理機制進行了標準化,確保了不同平臺上的一致性。
-
RTTI(運行時類型識別):C++03繼續支持RTTI機制,并對其進行了標準化。
-
標準庫的改進:C++03對標準庫進行了一些改進和擴展,提高了庫的健壯性和可用性。
-
多重繼承:C++03繼續支持多重繼承,并對其進行了標準化。
c++11
-
自動類型推導(auto):允許編譯器自動推斷變量類型,簡化了模板編程和迭代器的使用。
-
基于范圍的for循環(Range-based for loop):提供了一種新的遍歷容器和數組的方式,使代碼更加簡潔。
-
統一的初始化(Uniform Initialization):使用花括號{}進行初始化,提供了一種一致的初始化語法,適用于基本類型、類類型、數組等。
-
nullptr:引入了一個新的字面量nullptr,用于表示空指針,提高了代碼的類型安全性。
-
智能指針(Smart Pointers):如std::unique_ptr、std::shared_ptr和std::weak_ptr,提供了自動內存管理,減少了內存泄漏的風險。
-
Lambda表達式:允許在代碼中定義匿名函數,簡化了對函數對象的使用,特別是在STL算法中的應用。
-
右值引用(Right-Value References):使用&&引入了右值引用,支持移動語義(Move Semantics)和完美轉發(Perfect Forwarding),提高了性能。
-
變參模板(Variadic Templates):允許模板接受任意數量的模板參數,提供了更大的靈活性。
-
類型別名(Type Alias):使用using關鍵字簡化復雜的類型定義,提高代碼的可讀性。
-
constexpr函數:允許在編譯時計算某些值,提高了程序的性能。
-
顯式虛函數重載(override)和final關鍵字:提供了更好的重寫控制和類繼承的終止聲明。
-
標準庫增強:包括新的線程庫、原子操作、條件變量、std::async、std::future等,為并發編程提供了更好的支持。
-
正則表達式庫:提供了對正則表達式的支持,使得字符串處理更加強大和靈活。
-
用戶定義字面量(User-Defined Literals):允許開發者定義自己的字面量后綴,擴展了語言的表達能力。
-
強類型枚舉(enum class):引入了作用域枚舉,提高了枚舉類型的類型安全性。
-
委托構造函數(Delegating Constructors):允許一個構造函數調用同一個類中的另一個構造函數,減少了代碼重復。
-
繼承構造函數:允許派生類直接使用基類的構造函數。
-
noexcept關鍵字:用于聲明函數不會拋出異常,提高了代碼的異常安全性。
-
std::move和std::forward:支持移動語義和完美轉發,優化了臨時對象的處理。
-
靜態斷言(static_assert):在編譯時進行斷言檢查,確保模板參數和常量表達式的正確性。
c++14
-
變量模板(Variable Templates):允許模板定義不僅適用于函數和類,也適用于變量,從而在編譯時提供更多靈活性。
-
泛型Lambda表達式(Generic Lambdas):在Lambda表達式中可以使用auto關鍵字來推導參數類型,使得Lambda表達式更加通用。
-
Lambda表達式的初始化捕獲:允許在Lambda表達式中初始化捕獲的變量,例如 [&capture = expression] {}。
-
函數返回類型推導(Auto Return Type Deduction):允許使用auto關鍵字自動推導函數的返回類型,簡化了模板函數的聲明。
-
二進制字面量(Binary Literals):支持使用0b前綴表示二進制數值,例如0b1010。
-
數字分隔符(Digit Separators):允許在數值字面量中使用單引號’作為分隔符,提高大數值的可讀性,例如1’000’000。
-
constexpr的增強:放寬了對constexpr函數的限制,允許在其中使用循環和條件語句,使得更多的編譯時計算成為可能。
-
std::make_unique和std::make_shared:新的標準庫函數,提供了一種安全且方便的方法來創建std::unique_ptr和std::shared_ptr智能指針。
-
std::shared_timed_mutex和std::shared_lock:引入了新的互斥機制,允許多個線程同時讀取,但在寫入時需要獨占訪問。
-
std::quote:用于處理字符串轉義的標準庫組件。
-
[[deprecated]]屬性:允許開發者標記某些函數或類為已棄用,編譯器會在這些實體被使用時發出警告。
-
[[maybe_unused]]屬性:用于標識可能未使用的變量或實體,以避免編譯器警告。
-
std::exchange:一個新標準庫函數,用于交換兩個變量的值,并返回交換前的舊值。
-
統一初始化(Uniform Initialization):使用花括號{}進行初始化的方式被統一應用于直接初始化、復制初始化和列表初始化。
c++17
-
結構化綁定(Structured Bindings):允許從元組、對或類中綁定多個變量,簡化了對復雜結構的訪問。
-
if-initializer語句:在if語句中允許初始化變量,這使得代碼更加緊湊并且作用域受限。
-
內聯變量(Inline Variables):允許在頭文件中直接初始化一些變量,提高了代碼的可維護性。
-
折疊表達式(Fold Expressions):允許對參數包使用二元操作符進行折疊計算,簡化了可變參數模板的使用。
-
類模板參數推導(Class Template Argument Deduction):允許推導類模板的參數類型,使得模板類的使用更加方便。
-
constexpr lambda:允許在編譯時執行lambda表達式,擴展了constexpr關鍵字的用途。
-
namespace嵌套定義:簡化了嵌套namespace的使用,使得代碼更加清晰。
-
__has_include預處理表達式:提供了一種檢查特定頭文件是否可用的方法。
-
lambda表達式捕獲*this:允許lambda捕獲對象的副本,而不是對象的引用,這在多線程環境中特別有用。
-
std::any, std::optional, std::variant:引入了新的標準庫組件,提供了類型安全和更豐富的編程模型。
-
std::filesystem:提供了一套完整的文件系統操作庫,簡化了文件和目錄的訪問。
-
std::shared_mutex:引入了讀寫鎖,增加了并發編程的選擇。
-
并行算法庫:為標準庫算法提供了并行執行的能力,提高了性能。
-
noexcept成為類型系統的一部分:增強了對異常安全性的控制。
-
[[nodiscard]]屬性:用于標記函數,指示調用者應該檢查函數的返回值。
-
maybe_unused屬性:用于標識未使用的變量或實體,以避免編譯器警告。
-
if constexpr:允許編譯時根據條件包含或排除代碼塊,優化了模板編程。
-
std::string_view:提供了一種非擁有(non-owning)的字符串視圖,用于避免不必要的字符串拷貝。
c++20
-
概念(Concepts):允許在模板編程中定義和檢查類型屬性,使得模板的約束更加清晰和直觀。
-
協程(Coroutines):提供了一種異步編程模型,允許編寫非阻塞的、基于生成器的代碼,簡化了異步編程的復雜性。
-
范圍(Ranges):提供了一種新的抽象,用于處理容器和迭代器之間的操作,簡化了數據集合的遍歷和處理。
-
三向比較運算符(<=>):引入了新的比較運算符,用于比較兩個對象的順序關系,提供了一種統一的比較方法。
-
auto 作為函數參數類型:C++20 允許在函數聲明中直接使用 auto 作為參數類型,簡化了模板函數的定義。
-
模塊(Modules):C++20 引入了模塊,這是一種新的編譯單元,可以提高編譯速度并改善代碼的組織結構。
-
constexpr 變得更加強大:C++20 放寬了對 constexpr 函數的限制,允許更復雜的編譯時計算。
-
指定迭代范圍的 for 循環:C++20 引入了指定范圍的 for 循環語法,支持自定義的初始化列表。
-
特性的枚舉:C++17 支持對枚舉成員進行特性聲明,C++20 在 switch 枚舉使做出了優化,可以通過 using enum 的方式簡化枚舉類型的聲明。
-
安全的聯合體 std::variant:C++17 引入了 std::variant,提供類型安全的聯合體,C++20 進一步優化了其使用。
-
概念支持的配置:一些開發環境如 CLion 支持配置 Concepts 特性,以便開發者能夠使用 C++20 的概念進行編程。
參考
- 論文:《Thriving in a Crowded and Changing World: C++ 2006–2020》