c++ 各版本特性介紹

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》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12320.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12320.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12320.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Vue3+ElementPlus項目,復制文字到剪貼板功能實踐指南,揭秘使用js-tool-big-box工具庫的核心優勢

在前端開發項目中&#xff0c;很多時候有那么一個場景&#xff0c;就是要求將一段文案復制下來&#xff0c;這段文案可能是一串很長的id&#xff0c;可能是一條命令語句&#xff0c;可能是一小段文案&#xff0c;復制到剪貼板上。這樣有利于用戶復制到其他地方去&#xff0c;使…

自然資源-城鄉規劃行業未來二十年將何去何從?

自然資源-城鄉規劃行業未來二十年將何去何從? 城鄉規劃行業未來風口在以下幾個方向&#xff0c;看好啦&#xff01;緊跟國家發展戰略和政策背景。 1.大數據的城市規劃應用。 包含:公共數據平臺的搭建CIM&#xff0c;數據賦能治理&#xff0c;城市規劃中大數據應用的研究 等…

微軟必應bing國內官方代理商,廣告賬戶如何開戶?

微軟必應Bing作為全球知名的搜索引擎之一&#xff0c;其廣告平臺為眾多企業提供了廣闊的市場空間和精準的推廣機會。對于中國內地的企業而言&#xff0c;通過必應Bing開展國內廣告推廣不僅能夠觸及更廣泛的潛在客戶群體&#xff0c;還能有效提升品牌影響力。通過微軟必應Bing國…

【算法作業】均分卡牌,購買股票

問題描述 John 有兩個孩子&#xff0c;在 John病逝后&#xff0c;留下了一組價值不一定相同的魔卡&#xff0c; 現在要求你設計一種策略&#xff0c;幫John的經管人將John的這些遺產分給他的兩個孩子&#xff0c;使得他們獲得的遺產差異最小&#xff08;每張魔卡不能分拆&#…

搜索引擎的設計與實現(三)

目錄 5 系統詳細實現 5.1實現環境配置 5.2功能實現 5.2.1 建立索引 5.2.2 文件搜索實現 5.2.3 數據庫的連接配置 5.2.4 數據庫搜索實現 5.2.5 后臺數據編輯實現 前面內容請移步 搜索引擎的設計與實現&#xff08;二&#xff09; 免費源代碼&畢業設計論文 搜索…

git-刪除workspace.xml的跟蹤

問題描述 .gitignore 文件內容如下&#xff1a; .pyc *.pyc user_files/ .vscode/ __pycache__//.idea/misc.xml /.idea/modules.xml /.idea/inspectionProfiles/profiles_settings.xml /.idea/inspectionProfiles/Project_Default.xml /.idea/batrp_webbackend-server-dev.i…

NARUTO 復現記錄

1 環境配置 下載項目&#xff0c;一定要 git 下載全項目&#xff0c;下載完后要檢查third_parities 里面的coslam和neural_slam_eval 文件全不全。 git clone --recursive https://github.com/oppo-us-research/NARUTO.git 環境配置 注意 bash scripts/installation/conda…

番外篇 | 利用PyQt5+YOLOv5來搭建目標檢測系統(附可視化界面+功能介紹+源代碼)

前言:Hello大家好,我是小哥談。PyQt5是一個Python綁定的Qt庫,是用于創建圖形用戶界面(GUI)和其他應用程序組件的工具包。PyQt5提供了許多GUI元素,如按鈕、文本框、標簽等,也提供了許多Qt的功能,如網絡、數據庫、XML等。通過PyQt5可以在Python中使用Qt的豐富功能和強大的工…

克服虧損的負面影響 學學現貨白銀止損的方法

一個多月以前&#xff0c;現貨黃金的上漲還十分強勁&#xff0c;一度還逼近歷史的高位30大關。但是我們看近半個月以來&#xff0c;現貨白銀價格出現了調整。很多在高位買入的投資者都承受了較大的虧損&#xff0c;這時候就凸顯出了現貨白銀止損的作用。如果投資者能夠通過近期…

Git 基礎使用(2) 分支管理

文章目錄 分支概念分支使用查看分支分支創建分支切換分支合并合并沖突分支刪除 分支管理快進模式分支策略內容保存錯誤處理 分支概念 &#xff08;1&#xff09;分支概念 Git分支是指在版本控制系統Git中&#xff0c;用來表示項目的不同工作流程或開發路徑的一個重要概念。通過…

【cmake】Windows 環境下編譯第三方依賴源碼(以編譯Xerces庫為例)

第三方依賴源碼的編譯分為兩種&#xff0c;一種是使用 Configure 腳本編譯&#xff0c;另一種是使用 CMakeLists.txt 編譯。Xerces 3.2.3 的編譯方式是 CMakeLists.txt 腳本編譯。 必要軟件&#xff1a; CMake &#xff08;CMake | Download&#xff09;Visual Studio 2019&a…

前端AJAX講解

目錄 1.AJAX是什么&#xff1f; 2.異步交互和同步交互 3.AJAX常見應用情景和優缺點 4.AJAX的優缺點 5.AJAX發送異步請求&#xff08;四步操作&#xff09; 6.經典案例 1.AJAX是什么&#xff1f; AJAX即“Asynchronous JavaScript and XML”&#xff08;異步的JavaScript與…

指針基礎實踐

文章目錄 1.聲明指針2.初始化指針3.指針地址和大小&#xff0c;值4.指針解引用,修改值5.指針指向堆內存&#xff0c;修改值6.申請堆內存并釋放7.數組釋放8.指針運算9.指針遞增10.指針遞減11.指針常量12.常量指針13.常量指針指向常量 1.聲明指針 2.初始化指針 3.指針地址和大小…

【數據結構】二叉樹(Binary Tree)

文章目錄 一、樹的概念及結構二、二叉樹的概念及結構1.二叉樹的概念2.特殊的二叉樹3.二叉樹的性質 三、二叉樹的存儲順序存儲鏈式存儲 四、二叉樹的實現1.創建二叉樹2.二叉樹的遍歷前序遍歷中序遍歷后序遍歷層序遍歷根據遍歷順序創建二叉樹 3.二叉樹的基本操作1.總結點個數2.二…

ctfshow之_萌新web9至web10

一、訪問在線靶場ctfshow 1、web9 如下圖所示&#xff0c;進入_萌新賽的web9問題&#xff0c;題目提醒flag在config.php中&#xff1a; 如上圖所示&#xff0c;可以get傳參&#xff0c;且傳入的參數需要正則匹配system、exec、highlight&#xff0c;且不區分大小寫&#xff0…

C++設計模式|創建型 5.原型模式

1.什么是原型模式&#xff1f; 原型模式?種創建型設計模式&#xff0c;該模式的核?思想是基于現有的對象創建新的對象&#xff0c;?不是從頭開始創建。 在原型模式中&#xff0c;通常有?個原型對象&#xff0c;它被?作創建新對象的模板。新對象通過復制原型對象的屬性和狀…

Mac IDEA 自動補全mybatis sql語句

導航 Mac IDEA 自動補全mybatis sql語句一、點擊IDEA 右側Database選項二、選擇添加對應數據庫三、輸入數據庫信息和方案四、輸入數據庫信息和方案五、成功 Mac IDEA 自動補全mybatis sql語句 背景&#xff1a; 想在Mapper中&#xff0c;能夠實現自動檢索數據庫表和對應的字段…

QT日志類SimpleQtLogger的簡單記錄

在現代軟件開發中&#xff0c;日志記錄是必不可少的部分。它不僅幫助開發者在調試和維護軟件時了解程序的運行狀態&#xff0c;還能提供關鍵的錯誤信息。對于使用Qt框架開發應用程序的開發者來說&#xff0c;選擇一個合適的日志庫至關重要。本文將詳細介紹Qt日志庫SimpleQtLogg…

web前端之sass中的顏色函數、active按鈕激活、hover鼠標懸浮、disabled禁用、scss循環、css

MENU 效果圖htmlsassscss編譯后的css頁面css 效果圖 注意查看藍色按鈕。 html <div class"box"><button class"btn type_1">按鈕</button><button class"btn type_2">按鈕</button><button class"btn ty…

一文讀懂通用漏洞評分系統CVSS4.0:順帶理清CVE、CWE及其與CVSS之間的關系

事件響應和安全團隊論壇 (FIRST&#xff0c;Forum of Incident Response and Security Teams) 于 2023 年 11 月 1 日正式推出第四版通用漏洞評分系統 (CVSS 4.0&#xff0c;Common Vulnerability Scoring System version 4.0)。CVSS 4.0 是評估計算機系統安全漏洞嚴重性的行業…