必威电竞|足球世界杯竞猜平台

C++
來源:互聯網

C++(C plus plus)是一種面向對象的程序設計語言,具有泛型編程和與c語言兼容等特點,被廣泛應用于各個領域的軟件開發和系統編程。C++ 是一種高效的編程語言,其提供了指針、引用和內存管理等特性,可以直接操作內存。從設計上講 C++ 在C語言的基礎上引入了靜態數據成員、類的成員函數,增強了共享性;引入了繼承、模板和多態機制以支持重用性。

C++由C語言擴展升級而產生,最早于1979年由本賈尼·斯特勞斯特盧普(Bjarne Stroupstrup)博士在美國AT&T貝爾實驗室以C語言為基礎研發,其主要增加了類的設計,增強了C語言的共享能力。1987年,Cfront 2.0 發布,增強了 C++ 的面向對象的程序設計(object oriented programming,OOP) 功能,使其 OOP 方法論、設計風格和設計模式等開始流行。1994年,STL 正式成為 C++ 標準庫,豐富了 C++ 語言的抽象表達能力,使 C++ 的程序代碼變得更加高效易讀。1998年8月,ISO 標準被正式通過,意味著 C++ 正式接納了 STL 和異常處理的加盟以及C++語言的成熟與標準化。到了21世紀,C++ 標準不斷變化改進,引入了包括模組和協程等在內的眾多新特性,逐漸成為使用最廣泛的編程語言之一。

C++ 具有豐富的數據類型和運算符,以及結構化的控制語句,能直接訪問和控制硬件。C++ 標準庫提供了豐富的庫函數,以及類、模板等功能,使得程序員的工作更加輕松。隨著云計算大數據的興起,C++ 語言的普及度越來越高。截至2024年5月14日,在 TIOBE 對編程語言人氣的排名中,C++ 排名第3。

發展歷程

C++ 的“面向對象初探與初生階段”

20世紀70年代初期,為了移植與開發 unix 操作系統,美國 AT&T 貝爾實驗室的里奇博士(D. M. Ritchie)設計開發了一種通用的、面向過程的計算機程序設計語言,即c語言,其既具有高級語言的特點,又具有匯編語言的特點。因此,C語言可以作為操作系統設計語言,編寫系統程序,也可以作為應用程序設計語言,從而編寫不依賴計算機硬件的應用程序。

1979年,本賈尼·斯特勞斯特盧普到了AT&T貝爾實驗室,開始從事將C改良為帶類的C(C with classes)的工作。1983年,該語言被正式命名為C++。同時,C語言的大多數內容被保留了下來,很多情況下C語言和C++ 可以互相轉化,甚至不用對代碼進行任何修改。

1985年10月,第一個 C++ 商業版本發布,該版本是 AT&T 的 Cfront1.0 版本,包括多數最重要、最常用的 OOP 功能,如類、類繼承、構造函數和析構函數、new/delete 操作、虛擬函數、內聯函數、操作符重載、public 和private 數據保護、友元、關鍵字等。

1986年,由 D.B.Stroustrup 博士編寫的關于C++語言的書籍《The C++ Programming Language》出版。該書以簡潔的筆法和簡短的案例,影響了一代 C++ 程序員的風格和習慣,是當時真正有影響、有使用價值的書籍之一。

1987年,Cfront2.0 發布。該版本主要增強了 C++ 的 OOP 功能,其主要特征包括多重繼承、抽象類、靜態成員函數、保護成員、常量成員函數、成員指針。這些功能使 C++ 的 OOP 方法論、設計風格和設計模式等開始流行,C++ 因此真正成為了一門富有哲理性的深邃[suì]的程序設計語言。

1990年,瑪格麗特·埃利斯(Margaret A. Ellis)和D.B.Stroustrup博士編寫的書籍《The Annotated C++ Reference Manual》出版,該書籍是在 C++ 標準化之前,唯一一本能幫助程序員精確理解 C++ 語言構造和語義的書籍。例如,關于 MI 語義層面的描述以及包括內存布局、delta 值的設立等的實現方案,在這本書之前幾乎找不到參考文獻。

C++ 的“STL與Boost時代”

1994年,由斯捷潘諾夫博士(Alex Stepanov)主持開發的 STL(standard template library,標準模板庫)被 ANSI/ISO C++ 委員會接受,正式成為 C++ 標準庫。STL 的誕生使 C++ 語言有了自己的基本函數庫,豐富了 C++ 語言的抽象表達能力,拓展了 OOP 語言對多態性的理解。STL 里整合了許多常用數據結構和算法模板,使用 C++ 進行程序開發的代碼變得更加高效、整潔和易讀。

1998年,Boost 社區出現,其由許多 C++ 開發人員群組組成,通過其以及幾個郵件列表進行協調溝通。boost 社區開發和發布了 Boost C++ 庫。Boost 庫是一個可移植、提供源代碼的 C++ 庫,是C++ 標準化進程的開發引擎之一和程序擴展庫的總稱。標準模板庫(STL)和 Boost 等程序庫的出現,使泛型程序設計在 C++ 中占據了越來越多的比重。

C++ 的“復雜性嶄露與標準之路”

1998年8月,ISO 標準被正式批準。C++ 正式國際標準(ISO/IEC 14882:1998)的出臺,標志著 C++ 語言的成熟與標準化,意味著 C++ 正式接納了 STL 和異常處理(exceptional handling)的加盟,促進了之后10年 C++ 語言的不斷發展。

2007年,C++ TR1(C++技術報告1,TR1)(ISO/IEC TR 19768)公布,受到了C++ 界的廣泛關注。TR1 是為了解決 STL 值語義對指針和 REF 的支持不足等問題而提出的改進建議。2011年,C++11 頒布,其正式接受了 TR1,大大改善了 STL 的性能。同時,C++ 語言的語法有了實質性的提升,增加了包括Lambda表達式、并行程序設計(parallel programming)、多線程(multithreading)、value reference 和轉移構造函數(move constructor)等 OOP、FP 概念和語言構造。

隨著以Loki、MPL等程序庫為代表的產生式編程和模板元編程的出現,C++ 通過將新技術和原有技術融合進行創新發展。C++ 標準也在不斷演進,其先后發布了包括 C++14、C++17 和 C++20 等多個版本,每個版本都引入了新的功能和改進,進一步豐富了 C++ 的特性集合。其中,C++20 標準是近十年來影響最大的一個版本,其新特性包括模組(modules)、協程(coroutines)、視圖(view)等,進一步提高了 C++ 的表現力和可維護性。

設計原則和語言特點

設計原則

主要特點

C++工作原理

C++ 程序從編寫到最后得到運行結果的過程稱為程序開發過程,具體流程如下圖所示:

語法和結構

基本語法

常量和變量

編寫程序時已經確定的值,稱為常量;尚不確定的值,稱為變量。

在定義變量時,需要注意變量名必須以字母或下劃線開頭,且其他字符必須是字母、數字或下劃線,不得使用空格和其他特殊符號;不可以是系統的保留字,如int、double、for、return等;在C++語言中,變量名是區分大小寫的,例如,ABC、Abc和abc是3個不同的變量名。

標識符

標識符是由程序員定義的記號,用來對 C++程序中的符號常量、變量、用戶自定義函數、函數的參數、語句標號結構和類以及其他對象的名稱進行標識的符號。在C++語言中,標識符需要遵循的命名規則如下:

關鍵字

關鍵字是組成編程語言詞匯表的標識符,是C++的核心,不能用于其他用途。例如,變量名是一種標識符,在程序中,只要不使用C++預定義的關鍵字,就可以隨意選擇變量名。

數據類型

數據類型描述了數據實體的特性,包括值、內存空間大小等信息。每個類型實體所占的內存空間大小是不同的,對應的取值范圍也不同。

運算符

運算符是指對常量或變量進行運算及處理的符號,也是構成表達式的重要元素。C++中具有極其豐富的運算符,這些運算符又具有不同的優先級和結合性,使得C++能夠進行各種復雜的數學、工程等運算。

語法結構

程序中的基本控制結構順序結構、選擇結構和循環結構三種。C++ 中提供了這三種結構的控制語句。語句是 C++ 程序中最小的可執行單元,一條語句由一個分號結束。

順序結構

所謂順序結構,就是指按照語句在程序中的先后次序一條一條的順序執行。順序控制語句是一類簡單的語句,包括表達式語句、復合語句、空語句和輸入/輸出語句等。

選擇結構

C++ 中的選擇控制語句有if語句、if...else 語句、if...else if 語句和 switch 語句。

if 語句

if 語句用于在程序中有條件地執行某一語句序列,其基本語法格式和程序示例如下:

if...else 語句

在“條件表達式”為真和為假時分別執行不同的語句,用 else 來引入條件表達式為假時執行的語句序列。其基本語法格式和程序示例如下:

另外,簡單的 if..else 語句,可以使用條件運算符來代替。條件運算符是具有三個操作數的三目運算符,由“?”和“:”組成,其一般語句格式和示例如下:

if...else if 語句

if...else if 語句用于進行多重判斷,其基本語法格式和程序示例如下:

該功能語句執行順序為:先計算“條件表達式1”給出的表達式值,如果該值為真,則執行“語句1”,執行完畢后轉到該條件語句后面繼續執行其后的語句;如果該值為假,則繼續計算“條件表達式2”給出的表達式值。如果“條件表達式2”的值為真,則執行“語句2”。依此類推,如果所有條件中給出的表達式值都為假,則執行 else 后面的“語句n+1”。如果沒有 else,則什么也不做,轉到該條件語句后面的語句繼續執行。

switch 語句

switch 語句也稱為開關語句,用于有多重選擇的場合,測試某一個變量具有多個值時所執行的動作,其基本語法格式和程序示例如下:

該功能語句的執行順序為:先計算 switch 語句中“整型表達式”的值,然后在 case 語句中尋找值相等的整型常量表達式,并以此為入口標號,開始順序執行。如果沒有找到相等的整型常量表達式,則從“default:”開始執行。

循環結構

循環控制語句提供重復處理的能力,當某一特定條件為真時,循環語句就重復執行,并且每循環一次,就會測試一下循環條件,如果為假,則循環結束,否則繼續循環。C++ 支持 while、do while 和 for 三種格式的循環控制語句。

while 語句

while 循環,也稱為前置條件循環或當型循環。其基本語法格式和程序示例如下:

控制語句的執行順序為:當“條件表達式”的運算結果為真時,則重復執行“語句”。每執行一次“語句”后,就會重新計算一次“條件表達式”;當該表達式的值為假時,循環結束。

do while 語句

do while 循環和 while 循環相似,只不過循環的控制條件測試放在了循環體的后面,稱為后置循環,或直到型循環。do while 循環保證了循環體語句至少執行一次,其基本語法格式:

控制語句的執行順序為:先執行循環體語句,后判斷循環條件表達式的值。表達式的值為真,繼續執行循環,表達式的值為假,則結束循環。程序示例如下:

for 語句

for 循環的使用最為靈活,既可以用于循環次數已知的情況,也可以用于循環次數未知的情況。其基本語法格式和程序示例如下:

控制語句的執行順序為:先執行“初始化語句”,再計算“表達式1”的值,如果“表達式1”的值為真,則先后執行后面的“語句”和“表達式2”,然后繼續計算“表達式1”;如果“表達式1”的值為假,則結束循環。

跳轉結構

C++ 中有 break、continue、goto和return 4種無條件跳轉語句。其中,break 和 continue 可用于循環語句中,break 亦可用于 switch 語句中;回車鍵 語句用于實現函數返回。

break 語句

break 語句可用于switch 和循環語句中,分別有以下兩種用途:

break 語句的格式和程序示例如下:

continue 語句

continue 與break 不同的是,continue 語句是使程序跳過本次循環的剩余語句,并回到循環的條件測試部分,重新開始執行循環,而不是立即終止所在循環。

continue 語句的格式和程序示例如下:

goto 語句

goto 語句要求有一個標號,后面跟有冒號的有效標識符。標號必須與使用它的 goto 語句在同一函數中,即不能在不同函數之間跳轉。goto 語句的一般形式和示例如下:

return 語句

return 語句用來明確地從一個函數中返回,因為其可使程序返回到調用函數的地方繼續執行,所以C++將它歸入跳轉結構。return 帶回的數值即為函數的返回值。

其他相關語句

一個 C++ 程序是由一系列語句組成的。C++ 提供了許多不同類型的語句,每條語句都有一個預定義的任務。

聲明語句
表達式語句

表達式語句是以英文分號結尾(作為結束符)的表達式。表達式有一個值,且可能還有副作用。當在程序中出現表達式語句時,計算機確定其值并執行其副作用,從而改變計算機的內存狀態。沒有副作用的表達式作為語句是無用的。

空語句

空語句是不執行任何操作的語句,一般用于 C++ 語法需要語句但不需要副作用的場合。代碼示例如下:

復合語句

在一對花括號內組合任意數量的語句,將其視為單條語句,即為復合語句,也稱為語句塊,一般用于 C++ 語法需要單條語句但實際需要多條語句時。代碼示例如下:

標準庫函數

標準庫

C++ 標準庫(standard library)提供了豐富的函數集合,可以進行常用的數學計算、字符串操作、字符操作、輸入/輸出、錯誤檢查和許多其他操作。這些函數提供了許多程序員需要的功能,使得程序員的工作更加輕松。C++ 標準庫函數是在C++編程環境中提供的。

函數

C++ 中的模塊稱為函數(function)和類(class)。其中函數可分為程序員定義函數(programmer-defined function)和C++標準庫中的預裝函數。C++程序一般由程序員定義函數和預裝函數組合而成,程序員可以通過函數調用(function call)來調用(invoke)函數,讓其完成指定任務。使用函數可使程序區分出許多功能明確的組成部分,簡化程序,減少錯誤。

函數的定義和本質

函數定義包括函數名、參數表列、返回類型和函數體四部分,其一般形式如下:

函數的本質有以下兩點:

輸入/輸出(I/O)

C++數據的輸入與輸出是通過I\O流來實現的,I\O流輸入或輸出的是一系列字節。當程序需要在屏幕上顯示輸出時,可以使用插入符“<<”向cout輸出流中插入字符;當程序需要執行鍵盤輸入時,可以使用提取操作符“>>”從cin輸入流中抽取字符。另外,C++的I\O類庫提供了一些I\O流控制符,可以直接嵌入到輸入/輸出語句中來實現 I\O格式控制。

字符串處理

C++中的string.h頭文件提供了一些字符串處理庫函數。

數學函數

在 C++ 中并沒有相對的運算符可以用來實現開平方根,次方或三角函數等運算。進行這些運算時,程序需要調用定義在頭文件里 C++ 的標準數學函數庫。

泛型編程與模板

泛型編程

對于函數或類,若將一些類型定義為類型形參就能描述不同具體類型的共同的結構或行為,使得編程具有通用性,稱之為泛型編程(Generic Programming)。其具體要求如下:

STL模板庫

C++具有的標準模板庫(Standard Template Library,STL)是C++代碼可重用特性的重要體現,其由Alex Stepanov主持開發,于1998年被加入C++標準。STL是泛型編程的典型代表,其包含了很多基本算法和數據結構,將算法與數據結構完全解耦,使算法不與任何特定數據結構或對象類型綁定(或耦合)在一起,是對類和類模板機制的一種綜合應用。

模板

模板(template)是一種類型參量化機制,是代碼重用的重要手段,是泛型編程的基礎,其以一種獨立于任何特定數據類型的方式編寫代碼。模板是對具有相同特性的函數或類的再抽象,是一種參數多態性的工具,為邏輯功能相同而數據類型不同的程序提供一種代碼共享的機制。一個模板是對一個函數或類的描述,是參數化的函數和類,而不是一個實實在在的函數或類。定義模板的一般格式和示例如下:

面向對象

面向對象程序設計

面向對象程序設計(OOP)是通過為數據和代碼建立分塊的內存區域來提供對程序進行模塊化的一種程序設計方法。對象是一個既含數據又含對數據進行操作的代碼的一個邏輯實體或軟件構造塊,是類的一個實例,每個對象在功能上相互之間保持相對獨立;類是這些實體的抽象,是描述面向對象程序設計語言定義的一種數據類型。OOP語言具有封裝性、繼承性和多態性三個主要性質。

類和對象

在C++中,類是用戶定義的一種新的數據類型,是數據結構及其密切相關的操作函數的封裝體,其明確表達了這種類型數據所能完成的操作。對象是類的一個實例,類似于變量。

一個類由數據和方法兩部分組成。使用關鍵字class來定義一個類,類定義的一般格式和示例如下:

指針和內存管理

指針

C++ 定義了指針類型,并允許使用指針變量,從而操作地址。

指針類型和指針變量

地址

null 指針和 void 指針

按指針傳遞和按指針返回

內存管理

C++ 編寫的程序運行時,會使用內存位置。同時,代碼和每個基本對象或者用戶自定義的對象也必須存儲在內存中。C++ 環境將內存劃分為代碼內存、靜態內存、棧內存和堆內存四種不同的區域,以使內存管理更加高效。

異常處理機制

C++ 提供了一整套面向對象的異常處理機制,其基本思想是將異常的檢測與處理分離。C++ 語言異常處理機制將異常定義為類,通過拋出異常對象和截取異常對象兩種操作將異常檢測和異常處理的邏輯分離。

C++ 異常處理的實現

C++ 異常處理實現的具體操作由保留字 try、throw 和 catch 實現。其中,try 語句塊中通常放入可能出現異常的語句,如果檢測到某個語句發生異常,則使用 throw 拋出一個異常對象,catch 負責捕獲各種異常并做并做相應外理。

異常拋出

異常捕獲

異常自定義

C++ 允許開發者定義自己的異常類,以便更具體地描述異常情況。類 exception 設計為可以繼承的,意味著可以根據自己的項目情況派生自定義的異常類型。

標準異常

C++標準庫中定義了各種各樣預置的異常,這些異常都是Exception類的子類。Exception定義在頭文件中,它的子類大多數都定義在中,主要包括從 Exception 直接派生的異常類、從 logic_error 派生的邏輯異常和從 runtime_error 派生的運行時異常三種。

局限性

環境和工具

編譯器

編譯器的功能是將源程序編譯成二進制形式的“目標程序(object program)”,同時對源程序的語法進行檢查,經過編譯后的程序文件以“.obj”為目標程序的拓展名。

IDE

應用領域

C++ 是一種通用的編程語言,具有高效的運行效率,被廣泛應用于嵌入式系統開發、游戲開發等接近系統底層且對運行效率要求高的領域。

未來發展

跨平臺開發

跨平臺開發是程序設計領域在近些年提出的新的要求,源自于現代軟件工程的發展,其主要目的就是要讓所開發的應用程序可以在不同類型的平臺上順利運行。Boost等跨平臺開發工具和框架已經讓C++開發者能夠更方便地構建跨平臺應用。隨著這些工具的不斷進步,C++在跨平臺開發中的優勢將更加明顯,使開發者能夠更高效地針對多個操作系統和設備進行開發。

對分布式計算語言層面的支持

隨著大數據計算的飛速發展,分布式計算是未來程序設計的一個重要趨勢,由此而來的是分布式計算資源的管理。C++語言最初就是為了描述分布式UNIX OS而設計的,例如C++11引入了一些基本的本地并行計算概念,如thread、atomic、mutext等。未來,C++可以進一步增強其并發和并行編程能力,滿足分布式計算日益增長的需求。

參考資料 >

cplusplus.C++ Language Tutorial.2024-05-18

Cfront releases. C++ Historical Sources Archive.2024-06-03

C/C++編程環境搭建.deepin指南.2024-05-17

TIOBE Index for May 2024.TIOBE Index.2024-05-17

C++ 與 Boost.Boost C++庫.2024-05-27

News, Status & Discussion about Standard C++.C++.2023-09-15

ISO/IEC 14882:2003 - Programming languages -- C++.國際標準化組織.2023-09-06

ISO/IEC 14882:1998.ISO.2024-06-03

ISO/IEC TR 14882:2003.ISO.2024-06-03

C++11.cppreference.com.2024-05-27

C++14.cppreference.com.2024-05-27

C++17.cppreference.com.2024-05-27

C++20.cppreference.com.2024-05-27

ISO/IEC TR 19768:2007.ISO.2024-06-04

ISO/IEC TR 29124:2010.ISO.2024-06-04

ISO/IEC TR 24733:2011.ISO.2024-06-04

ISO/IEC TS 18822:2015.ISO.2024-06-04

ISO/IEC TS 19570:2015.ISO.2024-06-04

ISO/IEC TS 19841:2015.ISO.2024-06-04

ISO/IEC TS 19217:2015.ISO.2024-06-04

ISO/IEC TS 19571:2016.ISO.2024-06-04

ISO/IEC TS 19568:2017.ISO.2024-06-04

ISO/IEC TS 21425:2017.ISO.2024-06-04

ISO/IEC TS 22277:2017.ISO.2024-06-04

ISO/IEC TS 19216:2018.ISO.2024-06-04

ISO/IEC TS 19570:2018.ISO.2024-06-04

ISO/IEC TS 21544:2018.ISO.2024-06-04

最佳 C++ IDE 清單.2021 最佳 C++ IDE 排行.2024-05-17

Is Unity Engine written in Mono/C#? or C++.web.2024-06-04

生活家百科家居網