複製鏈接
請複製以下鏈接發送給好友

C++

鎖定
C++(c plus plus)是一種計算機高級程序設計語言,由C語言擴展升級而產生 [17] 最早於1979年由本賈尼·斯特勞斯特盧普在AT&T貝爾工作室研發。 [2] 
C++既可以進行C語言的過程化程序設計,又可以進行以抽象數據類型為特點的基於對象的程序設計,還可以進行以繼承和多態為特點的面向對象的程序設計。C++擅長面向對象程序設計的同時,還可以進行基於過程的程序設計。 C++幾乎可以創建任何類型的程序:遊戲、設備驅動程序HPC桌面嵌入式移動應用等。 甚至用於其他編程語言的庫和編譯器也使用C++編寫。 [25] 
C++擁有計算機運行的實用性特徵,同時還致力於提高大規模程序的編程質量與程序設計語言的問題描述能力。 [1] 
軟件名稱
C++
軟件平台
Windows、UNIXMacOS [26] 
上線時間
1979年
最近更新時間
2020年12月7日
軟件語言
C++
開發商
AT&T貝爾實驗室
軟件版本
C++ 20
別    名
The C++ Programming Language/c plus plus

C++發展歷程

1970年,AT&T貝爾實驗室的工作人員D.Ritchie和K.Thompson共同研發了C語言。研製C語言的初衷是用它編寫UNIX系統程序,因此,實際上C語言是UNIX的“副產品”。
1971年,瑞士聯邦技術學院N.Wirth教授發明了第一個結構化的編程語言Pascal
20世紀70年代中期,本賈尼·斯特勞斯特盧普在劍橋大學計算機中心工作。斯特勞斯特盧普希望開發一個既要編程簡單、正確可靠,又要運行高效、可移植的計算機程序設計語言。而以C語言為背景,以Simula思想為基礎的語言,正好符合斯特勞斯特盧普的初衷和設想。
1979年,本賈尼·斯特勞斯特盧普到了AT&T貝爾實驗室,開始從事將C改良為帶類的C(C with classes)的工作。、1983年,該語言被正式命名為C++。 [2] 
C++代碼
C++代碼(3張)
1985年、1990年和1994年,C++先後進行3次主要修訂。
C++的標準化工作於1989年開始 [21]  ,併成立了一個ANSI和ISO(International Standards Organization)國際標準化組織的聯合標準化委員會。
1994年1月25曰,聯合標準化委員會提出了第一個標準化草案。在該草案中,委員會在保持斯特勞斯特盧普最初定義的所有特徵的同時,還增加了部分新特徵。 [3] 
在完成C++標準化的第一個草案後不久,亞歷山大·斯特潘諾夫(Alexander Stepanov)創建了標準模板庫(Standard Template Library,STL)。在通過了標準化第一個草案之後,聯合標準化委員會投票並通過了將STL包含到C++標準中的提議。STL對C++的擴展超出了C++的最初定義範圍。雖然在標準中增加STL是個很重要的決定,但也因此延緩了C++標準化的進程。
1997年11月14日,聯合標準化委員會通過了該標準的最終草案。
1998年,C++的ANSI/IS0標準被投入使用。 [4] 

C++語言標準

自C++的ANSI/IS0標準投用以來,共進行過5次更新。
C++語言標準更新記錄
標準版本
發佈時間
正式名稱
更新內容
C++ 03
2003年
ISO/IEC 14882:2003
對C++ 98版本的漏洞做了部分修改。 [14] 
C++ 11
2011年8月12日
ISO/IEC 14882:2011
對容器類的方法做了三項主要修改:
1、新增了右值引用,可以給容器提供移動語義。
2、新增了模板類initilizer_list,因此可將initilizer_list作為參數的構造函數和賦值運算符。
3、新增了可變參數模板(variadic template)和函數參數包(parameter pack),可以提供就地創建(emplacement)方法。 [15] 
C++ 14
2014年8月18日
ISO/IEC 14882:2014
C++11的增量更新。主要是支持普通函數的返回類型推演,泛型lambda,擴展的lambda捕獲,對constexpr函數限制的修訂,constexpr變量模板化等。 [18] 
C++ 17
2017年12月6日
ISO/IEC 14882:2017
新增UTF-8 字符文字、摺疊表達式(fold expressions):用於可變的模板、內聯變量(inline variables):允許在頭文件中定義變量;在if和switch語句內可以初始化變量;結構化綁定(Structured Binding):for(auto [key,value] : my_map){…};類模板參數規約(Class Template Argument Deduction):用pair p{1, 2.0}; 替代pair{1, 2.0};;>;static_assert的文本信息可選;刪除trigraphs;在模板參數中允許使用typename(作為替代類);來自 braced-init-list 的新規則用於自動推導;嵌套命名空間的定義;允許命名空間和枚舉器的屬性;新的標準屬性:[[fallthrough]], [[maybe_unused]] 和 [[nodiscard]];對所有非類型模板參數進行常量評估;Fold表達式,用於可變的模板;A compile-time static if with the form if constexpr(expression);結構化的綁定聲明,允許auto [a, b]=getTwoReturnValues()。 [24] 
C++ 20
2020年12月7日
ISO/IEC 14882:2020
新增模塊(Modules)、協程(Coroutines)、範圍 (Ranges)、概念與約束 (Constraints and concepts)、指定初始化 (designated initializers)、操作符“<=> != ==”;constexpr支持:new/delete、dynamic_cast、try/catch、虛擬、constexpr向量和字符串;計時:日曆、時區支持。 [20] 

C++編程開發

C++集成開發環境

截至2014年3月,C++共有12個主流集成開發環境。 [6] 
Visual Studio(Visual C++)
Dev C++
C++ Builder
kDevelop
Anjuta
Code::Blocks [5] 
Visual Mingw
Ideone
Eclipse CDT
Compilr
Code Lite
Netbeans C++

C++編譯器

截至2014年3月,C++共有5款主流編譯器。 [6] 
Ultimate++
Digital Mars
C-Free
MinGW
Tiny C Compiler

C++語言特點

  • 與C語言的兼容性
C++與C語言完全兼容,C語言的絕大部分內容可以直接用於C++的程序設計,用C語言編寫的程序可以不加修改地用於C++。 [22] 
  • 數據封裝和數據隱藏
在C++中,類是支持數據封裝的工具,對象則是數據封裝的實現。C++通過建立用户定義類支持數據封裝和數據隱藏。
在面向對象的程序設計中,將數據和對該數據進行合法操作的函數封裝在一起作為一個類的定義。對象被説明為具有一個給定類的變量。每個給定類的對象包含這個類所規定的若干私有成員、公有成員及保護成員。完好定義的類一旦建立,就可看成完全封裝的實體,可以作為一個整體單元使用。類的實際內部工作隱藏起來,使用完好定義的類的用户不需要知道類的工作原理,只要知道如何使用它即可。
  • 支持繼承和重用
在C++現有類的基礎上可以聲明新類型,這就是繼承和重用的思想。通過繼承和重用可以更有效地組織程序結構,明確類間關係,並且充分利用已有的類來完成更復雜、深入的開發。新定義的類為子類,成為派生類。它可以從父類那裏繼承所有非私有的屬性和方法,作為自己的成員。
  • 多態性
採用多態性為每個類指定表現行為。多態性形成由父類和它們的子類組成的一個樹型結構。在這個樹中的每個子類可以接收一個或多個具有相同名字的消息。當一個消息被這個樹中一個類的一個對象接收時,這個對象動態地決定給予子類對象的消息的某種用法。多態性的這一特性允許使用高級抽象。
繼承性和多態性的組合,可以輕易地生成一系列雖然類似但獨一無二的對象。由於繼承性,這些對象共享許多相似的特徵。由於多態性,一個對象可有獨特的表現方式,而另一個對象有另一種表現方式。 [8] 

C++工作原理

C++編程頁面 C++編程頁面
C++語言的程序開發環境,為了方便測試,將調試環境做成了解釋型。即開發過程中,以解釋型的逐條語句執行方式來進行調試,以編譯型的脱離開發環境而啓動運行的方式來生成程序最終的執行代碼。 [7] 
開發C++應用程序,需要經過編寫源程序、編譯、連接程序生成可執行程序、運行程序四個步驟 [23]  。生成程序是指將源碼(C++語句)轉換成一個可以運行的應用程序的過程。如果程序編寫正確,那麼通常只需按一個功能鍵,即可完成該過程。
第一步對程序進行編譯,這需要用到編譯器(compiler)。編譯器將C++語句轉換成機器碼(也稱為目標碼);如果該步驟成功執行,下一步就是對程序進行鏈接,這需要用到鏈接器(linker)。鏈接器將編譯獲得機器碼與C++庫中的代碼進行合併。C++庫包含了執行某些常見任務的函數(“函數”是子程序的另一種稱呼)。例如,一個C++庫中包含標準的平方根函數sqrt,所以不必親自計算平方根。C++庫中還包含一些子程序,它們把數據發送到顯示器,並知道如何讀寫硬盤上的數據文件。 [9] 

C++語言基礎

C++基本類型

C++語言數據類型可以分為兩大類:基本類型和引用類型。基本類型是指不能再分解的數據類型,其數據在函數的調用中是以傳值方式工作的;引用類型有時也稱複合類型,它是可以分解為基本類型的數據類型,其數據在函數調用中是以傳址方式來工作的。 [10] 
  • 整型
1、整數常量
整數常量是不帶小數的數值,用來表示正負數。例2—2中Ox55、0x55ff、1000000都是c++語言的整數常量。
c++語言的整數常量有三種形式:十進制、八進制、十六進制。
(1)十進制整數是由不以0開頭的0~9的數字組成的數據。
(2)八進制整數是由以0開頭的0~7的數字組成的數據。
(3)十六進制整數是由以0x或0x開頭的0~9的數字及A~F的字母(大小寫字母均可)組成的數據。
例如:
0,63,83是十進制數。
00,077,0123是八進制數。
0x0,Ox0,0x53,0x53,0x3f,0x3f是十六進制數。
整數常量的取值範圍是有限的,它的大小取決於此類整型數的類型,與所使用的進制形式無關。
2、整型變量類型
整型變量類型有byte,short,int,long四種説明符,它們都是有符號整型變量類型。
(1)byte類型
byte類型説明一個帶符號的8位整型變量。由於不同的機器對多字節數據的存儲方式不同,可能是從低字節向高字節存儲,也可能是從高字節向低字節存儲。這樣,在分析網絡協議或文件格式時,為了解決不同機器上的字節存儲順序問題,用byte類型來表示數據是合適的。
(2)short類型
short類型説明一個帶符號的16位整型變量。short類型限制了數據的存儲應為先高字節,後低字節。
(3)int類型
int類型説明一個帶符號的32位整型變量。int類型是一種最豐富、最有效的類型。它最常用於計數、數組訪問和整數運算。
(4)long類型
long類型説明一個帶符號的64位整型變量。對於大型計算,常常會遇到很大的整數,並超出int所表示的範圍,這時要使用long類型。
浮點型
1、浮點數常量
浮點數是帶有小數的十進制數,可用一般表示法或科學記數法表示。0.23f、0.7e-3都是c++語言的浮點數常量。
(1)一般表示法:十進制整數+小數點+十進制小數。
(2)科學記數法:十進制整數+小數點+十進制小數+E(或e)+正負號+指數。
例如:3.14159,0.567,9777.12是一般表示法形式,1.234e5,4.90867e-2是科學記數法形式。
c++語言的浮點數常量在機器中有單精度和雙精度之分。單精度以32位形式存放,用f/F做後綴標記(可以省略);雙精度則以64位形式存放。當一個浮點數常量沒有特別指定精度時,則它為雙精度浮點數常量。
2、浮點變量類型
浮點變量也稱實數變量,用於需要精確到小數的函數運算中,有float和double兩種類型説明符。
(1)float類型
float類型是一個位數為32位的單精度浮點數。它具有運行速度較快,佔用空間較少的特點。
(2)double類型
double類型是一個位數為64的雙精度浮點數。雙精度數在某些具有優化和高速運算能力的現代處理機上運算比單精度數快。雙精度類型double比單精度類型float具有更高的精度和更大表示範圍,常常使用。
字符型
1、字符型常量
字符型常量是指由單引號括起來的單個字符。
例如:’a’,’A’,’z’,‘$’,’?’。
注意:’a’和’A’是兩個不同的字符常量。
除了以上形式的字符常量外,c++語言還允許使用一種以“\”開頭的特殊形式的字符常量。這種字符常量稱為轉義字符,用來表示一些不可顯示的或有特殊意義的字符。
2、字符型變量
字符型變量的類型説明符為char,它在機器中佔8位,其範圍為0~255。
注意:字符型變量只能存放一個字符,不能存放多個字符,例如:
char a='am';
這樣定義賦值是錯誤的。
布爾型
布爾常量只有兩個值:“true”和“false”,表示“真”和“假”,均為關鍵詞,在機器中位長為8位。
布爾型變量的類型説明符為booI,用來表示邏輯值。 [10] 

C++運算符與表達式

C++語言中定義了豐富的運算符,如算術運算符、關係運算符、邏輯運算符等等,有些運算符需要兩個操作數,使用形式為:<操作數1>運算符<操作數2>,這樣的運算符稱為二元運算符(或二目運算符)。另一些運算符只需要一個操作數,稱為一元運算符(或單目運算符)。
運算符具有優先級與結合性。當一個表達式包含多個運算符時,先進行優先級高的運算,再進行優先級低的運算。如果表達式中出現了多個相同優先級的運算,運算順序就要看運算符的結合性了。所謂結合性,是指當一個操作數左右兩邊的運算符優先級相同時,按什麼樣的順序進行運算,是自左向右,還是自右向左。例如,我們熟悉的算術表達式6+5-2中,“+”、 “-”是同級運算符,那麼是先算5-2,還是先算6+5?這就取決於算術運算符的結合性。由於算術運算符的結合性為自左向右,所以應先算6+5,然後再算11-2。
  • 算術運算符與算術表達式
C++中的算術運算符包括基本的算術運算符和自增、自減運算符。由算術運算符、操作數和括號構成的表達式稱為算術表達式。
基本算術運算符有:+()、-(減或負號)、*(乘)、/(除)、%(取餘)。其中“-”作為負號時為一元運算符,其餘都為二元運算符。這些基本算術運算符的意義與數學中相應符號的意義是一致的。它們之間的相對優先級關係與數學中的也是一致的,即先乘除、後加減,同級運算自左向右進行。使用算術運算符要注意以下幾點:
1、“%”是取餘運算,只能用於整型操作數。表達式a%b的結果為a/b的餘數。 “%”的優先級與“/”相同。
2、當“/”用於兩整型操作數相除時,其結果取商的整數部分,小數部分被自動捨棄。因此,表達式1/2的結果為0,這一點需要特別注意。
3、C++中的“++” (自增)、 “--” (自減)運算符是使用方便且效率很高的兩個運算符,它們都是一元運算符。
這兩個運算符都有前置和後置兩種使用形式,無論寫成前置或後置的形式,它們的作用都是將操作數的值增1(減1)後,重新寫回該操作數在內存中的原有位置。所以,如果變量i原來的值是1,計算表達式i++後,表達式的結果為2,並且i的值也被改變為2。但是,當自增、自減運算的結果要被用於繼續參與其它操作時,前置與後置時的情況就完全不同。例如,如果i的值為l,則下列兩條語句的執行結果不同:
cout<<i++;
cout<<++i;
第一條語句首先輸出i當前的值1,然後i自增,其值變為2;第二條語句首先使i自增為2,然後輸出i的值2。
賦值運算符與賦值表達式
C++提供了幾個賦值運算符,最簡單的賦值運算符就是“=”。帶有賦值運算符的表達式被稱為賦值表達式。例如,m=m+6就是一個賦值表達式。賦值表達式的作用就是將等號右邊表達式的值賦給等號左邊的對象。賦值表達式的類型為等號左邊對象的類型,表達式的結果為等號左邊對象被賦值後的值,運算的結合性為自右向左。請看下列賦值表達式的例子。
  n=1
表達式值為1。
  a=b=c=2
這個表達式從右向左運算,在c被更新為2後,表達式c=2的值為2,接着b的值被更新為2,最後a被賦值為2。
a=3+(c=4)
表達式值為7,a的值為7,c為4。
除了“=”以外,C++還提供了10種複合的賦值運算符:+=,-=,*=,/=,%=,<<=,>>=,&=,“=,|=。其中,前五個運算符是賦值運算符與算術運算符複合而成的,後五個是賦值運算符與位運算符複合而成的。關於位運算,稍後再做介紹。這裏10種運算符的優先級與“=”相同,結合性也是自右向左。現在舉例説明覆合賦值運算符的功能。
 b+=2;//等價於b=b+2
 x*=y+3;//等價於x=x*(y+3)
如果在賦值表達式後面加上分號,便成為了賦值語句。例如:
b=b+2:便是一個賦值語句,它實現的功能與賦值表達式相同。賦值表達式與賦值語句的不同點在於:賦值表達式可以作為一個更復雜表達式的一部分,繼續參與運算;而賦值語句不能。
逗號運算符與逗號表達式
在C++中,逗號也是一個運算符,它的使用形式為:
<表達式1>,<表達式2>,…,<表達式n>求解順序為,先求解表達式1,再求解表達式2,最後求解表達式n的值。逗號表達式的最終結果為表達式n的值。例如:
 x=2*5,x*4
表達式的結果為40。
關係運算符和關係表達式
關係運算符即比較符。
用關係運算符將兩個表達式連接起來就是關係表達式。關係表達式是一種最簡單的邏輯表達式。例如:
 x>5
 x+y<=20
 c==a+b
注:“==”(等於)是連續的兩個等號,勿誤寫為賦值運算符“=”。
關係表達式一般用於判斷是否符合某一條件。關係表達式的結果類型為bool,值只能是true或false。條件滿足為true,條件不滿足為false。例如,當x=t時,x>5的結果就為false。
邏輯運算符與邏輯表達式
用邏輯運算符將簡單的關係表達式連接起來構成較複雜的邏輯表達式。邏輯表達式的結果類型也為bool,值只能為true或false。
“!”是一元運算符,使用形式是: !操作數。非運算的作用是對操作數取反。如果操作數a的值為true,則表達式!a的值為false:如果操作數a的值為false,則表達式!a的值為true。
“&&”是二元運算符。“&&”運算的作用是求兩個操作數的邏輯與。只有當兩個操作數的值都為true時,與運算的結果才為true,其它情況下與運算的結果均為false。
“||”也是二元運算符。 “||”運算的作用是求兩個操作數的邏輯或。只有當兩個操作數的值都為false時,或運算的結果才為false,其它情況下或運算的結果均為true。 [11] 

C++類和對象

類所表示的一組對象十分相似,可以作為模板來有效的創建對象,利用類可以產生很多的對象類所代表的事物或者概念都是抽象的。在存取Private類型數據或者函數的時候,只有類本身聲明的函數才是被允許的。類在與外部連接時,利用的就是Public共有類型函數,任何外部函數的訪問都是運行的。
對象主要是對客觀事物的某個實體進行描述,它作為一個單位,共同組成了系統,它的組成是一組屬性和一組服務,這組服務操作於這組屬性。屬性和服務是對象構成眾多要素中的兩種,屬性的實質是一個數據項,主要是對對象靜態特性進行描述,服務的實質是一個操作序列,主要是對對象動態特徵進行描述。 [12] 

C++關鍵字

關鍵字(keyword)是整個語言範圍內預先保留的標識符,每個C++關鍵字都有特殊的含義。經過預處理後,關鍵字從預處理記號(preprocessing-token)中區出來,剩下的標識符作為記號(token),用於聲明對象、函數、類型、命名空間等。不能聲明與關鍵字同名的標識符。
各個版本的ISO C++都規定以下劃線接大寫字母起始的標識符保留給實現。編譯器可以用這些保留標識符作為擴展關鍵字,這不保證可移植性。以下討論ISO C++所保留的關鍵字。
ISO C++ 98關鍵字共63個,按標準排版如下:
ISO C++ 98關鍵字表
asm
do
if
return
typedef
auto
double
inline
short
typeid
bool
dynamic_cast
int
signed
typename
break
else
long
sizeof
union
case
enum
mutable
static
unsigned
catch
explicit
namespace
static_cast
using
char
export
new
struct
virtual
class
extern
operator
switch
void
const
false
private
template
volatile
const_cast
float
protected
this
wchar_t
continue
for
public
throw
while
default
friend
register
true

delete
goto
reinterpret_cast
try

參考資料: [13] 

C++語言評價

C++語言是對C語言的擴充,從Simula中吸取了類,從ALGOL語言中吸取了運算符的一名多用、引用和在分程序中任何位置均可説明變量,綜合了Ada語言的類屬和Clu語言的模塊特點,形成了抽象類,從Ada Clu和ML等語言吸取了異常處理,從BCPL語言中吸取了用//表示註釋C++語言保持了C語言的緊湊靈活、高效以及易於移植性強等優點,它對數據抽象的支持主要在於類概念和機制,對面向對象風範的支持主要通過虛擬機制函數因C++語言既有數據抽象和麪向對象能力,運行性能高,加上C語言的普及,而從C語言到C++語言的過渡較為平滑,以及C++語言與C語言的兼容程度可使數量巨大的C語言程序能方便地在C++語言環境中複用,使C++語言在短短几年內能流行。(計算機軟件專家王汝傳 評) [16] 
作為最受歡迎的編程語言之一,C++帶給開發者們最大的驚喜便是其強大的特性。一方面跟C兼容,可以直面系統底層API,SDK,另一方面提供了很多範式,足夠的抽象能力,面向對象,操作符重載,模板等。(腳本之家 評) [19] 
參考資料
展開全部 收起