C++(c plus plus)是一種計算機(jī)高級程序設(shè)計語言,由C語言擴(kuò)展升級而產(chǎn)生,最早于1979年由本賈尼·斯特勞斯特盧普在AT&T貝爾工作室研發(fā)。
C++既可以進(jìn)行C語言的過程化程序設(shè)計,又可以進(jìn)行以抽象數(shù)據(jù)類型為特點的基于對象的程序設(shè)計,還可以進(jìn)行以繼承和多態(tài)為特點的面向?qū)ο蟮某绦蛟O(shè)計。C++擅長面向?qū)ο蟪绦蛟O(shè)計的同時,還可以進(jìn)行基于過程的程序設(shè)計。C++幾乎可以創(chuàng)建任何類型的程序:游戲、設(shè)備驅(qū)動程序、HPC、云、桌面、嵌入式和移動應(yīng)用等。甚至用于其他編程語言的庫和編譯器也使用C++編寫。
C++擁有計算機(jī)運(yùn)行的實用性特征,同時還致力于提高大規(guī)模程序的編程質(zhì)量與程序設(shè)計語言的問題描述能力。
1970年,AT&T貝爾實驗室的工作人員D.Ritchie和K.Thompson共同研發(fā)了C語言。研制C語言的初衷是用它編寫UNIX系統(tǒng)程序,因此,實際上C語言是UNIX的“副產(chǎn)品”。
1971年,瑞士聯(lián)邦技術(shù)學(xué)院N.Wirth教授發(fā)明了第一個結(jié)構(gòu)化的編程語言Pascal。
20世紀(jì)70年代中期,本賈尼·斯特勞斯特盧普在劍橋大學(xué)計算機(jī)中心工作。斯特勞斯特盧普希望開發(fā)一個既要編程簡單、正確可靠,又要運(yùn)行高效、可移植的計算機(jī)程序設(shè)計語言。而以C語言為背景,以Simula思想為基礎(chǔ)的語言,正好符合斯特勞斯特盧普的初衷和設(shè)想。
1979年,本賈尼·斯特勞斯特盧普到了AT&T貝爾實驗室,開始從事將C改良為帶類的C(C with classes)的工作。、1983年,該語言被正式命名為C++。
1985年、1990年和1994年,C++先后進(jìn)行3次主要修訂。
C++的標(biāo)準(zhǔn)化工作于1989年開始,并成立了一個ANSI和ISO(International Standards Organization)國際標(biāo)準(zhǔn)化組織的聯(lián)合標(biāo)準(zhǔn)化委員會。
1994年1月25曰,聯(lián)合標(biāo)準(zhǔn)化委員會提出了第一個標(biāo)準(zhǔn)化草案。在該草案中,委員會在保持斯特勞斯特盧普最初定義的所有特征的同時,還增加了部分新特征。
在完成C++標(biāo)準(zhǔn)化的第一個草案后不久,亞歷山大·斯特潘諾夫(Alexander Stepanov)創(chuàng)建了標(biāo)準(zhǔn)模板庫(Standard Template Library,STL)。在通過了標(biāo)準(zhǔn)化第一個草案之后,聯(lián)合標(biāo)準(zhǔn)化委員會投票并通過了將STL包含到C++標(biāo)準(zhǔn)中的提議。STL對C++的擴(kuò)展超出了C++的最初定義范圍。雖然在標(biāo)準(zhǔn)中增加STL是個很重要的決定,但也因此延緩了C++標(biāo)準(zhǔn)化的進(jìn)程。
1997年11月14日,聯(lián)合標(biāo)準(zhǔn)化委員會通過了該標(biāo)準(zhǔn)的最終草案,
1998年,C++的ANSI/IS0標(biāo)準(zhǔn)被投入使用。
截至2014年3月,C++共有12個主流集成開發(fā)環(huán)境。
Visual Studio(Visual C++) Dev C++ C++ Builder kDevelop
Anjuta Code::Blocks Visual Mingw Ideone
Eclipse CDT Compilr Code Lite Netbeans C++
截至2014年3月,C++共有5款主流編譯器。
Ultimate++ Digital Mars C-Free MinGW Tiny C Compiler
C++語言的程序開發(fā)環(huán)境,為了方便測試,將調(diào)試環(huán)境做成了解釋型。即開發(fā)過程中,以解釋型的逐條語句執(zhí)行方式來進(jìn)行調(diào)試,以編譯型的脫離開發(fā)環(huán)境而啟動運(yùn)行的方式來生成程序最終的執(zhí)行代碼。
開發(fā)C++應(yīng)用程序,需要經(jīng)過編寫源程序、編譯、連接程序生成可執(zhí)行程序、運(yùn)行程序四個步驟。生成程序是指將源碼(C++語句)轉(zhuǎn)換成一個可以運(yùn)行的應(yīng)用程序的過程。如果程序編寫正確,那么通常只需按一個功能鍵,即可完成該過程。
第一步對程序進(jìn)行編譯,這需要用到編譯器(compiler)。編譯器將C++語句轉(zhuǎn)換成機(jī)器碼(也稱為目標(biāo)碼);如果該步驟成功執(zhí)行,下一步就是對程序進(jìn)行鏈接,這需要用到鏈接器(linker)。鏈接器將編譯獲得機(jī)器碼與C++庫中的代碼進(jìn)行合并。C++庫包含了執(zhí)行某些常見任務(wù)的函數(shù)(“函數(shù)”是子程序的另一種稱呼)。例如,一個C++庫中包含標(biāo)準(zhǔn)的平方根函數(shù)sqrt,所以不必親自計算平方根。C++庫中還包含一些子程序,它們把數(shù)據(jù)發(fā)送到顯示器,并知道如何讀寫硬盤上的數(shù)據(jù)文件。
C++語言數(shù)據(jù)類型可以分為兩大類:基本類型和引用類型?;绢愋褪侵覆荒茉俜纸獾臄?shù)據(jù)類型,其數(shù)據(jù)在函數(shù)的調(diào)用中是以傳值方式工作的;引用類型有時也稱復(fù)合類型,它是可以分解為基本類型的數(shù)據(jù)類型,其數(shù)據(jù)在函數(shù)調(diào)用中是以傳址方式來工作的。
1、整數(shù)常量
整數(shù)常量是不帶小數(shù)的數(shù)值,用來表示正負(fù)數(shù)。例2—2中Ox55、0x55ff、1000000都是c++語言的整數(shù)常量。
c++語言的整數(shù)常量有三種形式:十進(jìn)制、八進(jìn)制、十六進(jìn)制。
(1)十進(jìn)制整數(shù)是由不以0開頭的0~9的數(shù)字組成的數(shù)據(jù)。
(2)八進(jìn)制整數(shù)是由以0開頭的0~7的數(shù)字組成的數(shù)據(jù)。
(3)十六進(jìn)制整數(shù)是由以0x或0x開頭的0~9的數(shù)字及A~F的字母(大小寫字母均可)組成的數(shù)據(jù)。
例如:
0,63,83是十進(jìn)制數(shù)。
00,077,0123是八進(jìn)制數(shù)。
0x0,Ox0,0x53,0x53,0x3f,0x3f是十六進(jìn)制數(shù)。
整數(shù)常量的取值范圍是有限的,它的大小取決于此類整型數(shù)的類型,與所使用的進(jìn)制形式無關(guān)。
2、整型變量類型
整型變量類型有byte,short,int,long四種說明符,它們都是有符號整型變量類型。
(1)byte類型
byte類型說明一個帶符號的8位整型變量。由于不同的機(jī)器對多字節(jié)數(shù)據(jù)的存儲方式不同,可能是從低字節(jié)向高字節(jié)存儲,也可能是從高字節(jié)向低字節(jié)存儲。這樣,在分析網(wǎng)絡(luò)協(xié)議或文件格式時,為了解決不同機(jī)器上的字節(jié)存儲順序問題,用byte類型來表示數(shù)據(jù)是合適的。
(2)short類型
short類型說明一個帶符號的16位整型變量。short類型限制了數(shù)據(jù)的存儲應(yīng)為先高字節(jié),后低字節(jié)。
(3)int類型
int類型說明一個帶符號的32位整型變量。int類型是一種最豐富、最有效的類型。它最常用于計數(shù)、數(shù)組訪問和整數(shù)運(yùn)算。
(4)long類型
long類型說明一個帶符號的64位整型變量。對于大型計算,常常會遇到很大的整數(shù),并超出int所表示的范圍,這時要使用long類型。
1、浮點數(shù)常量
浮點數(shù)是帶有小數(shù)的十進(jìn)制數(shù),可用一般表示法或科學(xué)記數(shù)法表示。0.23f、0.7e-3都是c++語言的浮點數(shù)常量。
(1)一般表示法:十進(jìn)制整數(shù)+小數(shù)點+十進(jìn)制小數(shù)。
(2)科學(xué)記數(shù)法:十進(jìn)制整數(shù)+小數(shù)點+十進(jìn)制小數(shù)+E(或e)+正負(fù)號+指數(shù)。
例如:3.14159,0.567,9777.12是一般表示法形式,1.234e5,4.90867e-2是科學(xué)記數(shù)法形式。
c++語言的浮點數(shù)常量在機(jī)器中有單精度和雙精度之分。單精度以32位形式存放,用f/F做后綴標(biāo)記(可以省略);雙精度則以64位形式存放。當(dāng)一個浮點數(shù)常量沒有特別指定精度時,則它為雙精度浮點數(shù)常量。
2、浮點變量類型
浮點變量也稱實數(shù)變量,用于需要精確到小數(shù)的函數(shù)運(yùn)算中,有float和double兩種類型說明符。
(1)float類型
float類型是一個位數(shù)為32位的單精度浮點數(shù)。它具有運(yùn)行速度較快,占用空間較少的特點。
(2)double類型
double類型是一個位數(shù)為64的雙精度浮點數(shù)。雙精度數(shù)在某些具有優(yōu)化和高速運(yùn)算能力的現(xiàn)代處理機(jī)上運(yùn)算比單精度數(shù)快。雙精度類型double比單精度類型float具有更高的精度和更大表示范圍,常常使用。
1、字符型常量
字符型常量是指由單引號括起來的單個字符。
例如:’a’,’A’,’z’,‘$’,’?’。
注意:’a’和’A’是兩個不同的字符常量。
除了以上形式的字符常量外,c++語言還允許使用一種以“”開頭的特殊形式的字符常量。這種字符常量稱為轉(zhuǎn)義字符,用來表示一些不可顯示的或有特殊意義的字符。
2、字符型變量
字符型變量的類型說明符為char,它在機(jī)器中占8位,其范圍為0~255。
注意:字符型變量只能存放一個字符,不能存放多個字符,例如:
1
char a='am';
這樣定義賦值是錯誤的。
布爾常量只有兩個值:“true”和“false”,表示“真”和“假”,均為關(guān)鍵詞,在機(jī)器中位長為8位。
布爾型變量的類型說明符為booI,用來表示邏輯值。
C++語言中定義了豐富的運(yùn)算符,如算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符等等,有些運(yùn)算符需要兩個操作數(shù),使用形式為:<操作數(shù)1>運(yùn)算符<操作數(shù)2>,這樣的運(yùn)算符稱為二元運(yùn)算符(或二目運(yùn)算符)。另一些運(yùn)算符只需要一個操作數(shù),稱為一元運(yùn)算符(或單目運(yùn)算符)。
運(yùn)算符具有優(yōu)先級與結(jié)合性。當(dāng)一個表達(dá)式包含多個運(yùn)算符時,先進(jìn)行優(yōu)先級高的運(yùn)算,再進(jìn)行優(yōu)先級低的運(yùn)算。如果表達(dá)式中出現(xiàn)了多個相同優(yōu)先級的運(yùn)算,運(yùn)算順序就要看運(yùn)算符的結(jié)合性了。所謂結(jié)合性,是指當(dāng)一個操作數(shù)左右兩邊的運(yùn)算符優(yōu)先級相同時,按什么樣的順序進(jìn)行運(yùn)算,是自左向右,還是自右向左。例如,我們熟悉的算術(shù)表達(dá)式6+5-2中,“+”、“-”是同級運(yùn)算符,那么是先算5-2,還是先算6+5?這就取決于算術(shù)運(yùn)算符的結(jié)合性。由于算術(shù)運(yùn)算符的結(jié)合性為自左向右,所以應(yīng)先算6+5,然后再算11-2。
算術(shù)運(yùn)算符與算術(shù)表達(dá)式
C++中的算術(shù)運(yùn)算符包括基本的算術(shù)運(yùn)算符和自增、自減運(yùn)算符。由算術(shù)運(yùn)算符、操作數(shù)和括號構(gòu)成的表達(dá)式稱為算術(shù)表達(dá)式。
基本算術(shù)運(yùn)算符有:+(加)、-(減或負(fù)號)、*(乘)、/(除)、%(取余)。其中“-”作為負(fù)號時為一元運(yùn)算符,其余都為二元運(yùn)算符。這些基本算術(shù)運(yùn)算符的意義與數(shù)學(xué)中相應(yīng)符號的意義是一致的。它們之間的相對優(yōu)先級關(guān)系與數(shù)學(xué)中的也是一致的,即先乘除、后加減,同級運(yùn)算自左向右進(jìn)行。使用算術(shù)運(yùn)算符要注意以下幾點:
1、“%”是取余運(yùn)算,只能用于整型操作數(shù)。表達(dá)式a%b的結(jié)果為a/b的余數(shù)。“%”的優(yōu)先級與“/”相同。
2、當(dāng)“/”用于兩整型操作數(shù)相除時,其結(jié)果取商的整數(shù)部分,小數(shù)部分被自動舍棄。因此,表達(dá)式1/2的結(jié)果為0,這一點需要特別注意。
3、C++中的“++”(自增)、“--”(自減)運(yùn)算符是使用方便且效率很高的兩個運(yùn)算符,它們都是一元運(yùn)算符。
這兩個運(yùn)算符都有前置和后置兩種使用形式,無論寫成前置或后置的形式,它們的作用都是將操作數(shù)的值增1(減1)后,重新寫回該操作數(shù)在內(nèi)存中的原有位置。所以,如果變量i原來的值是1,計算表達(dá)式i++后,表達(dá)式的結(jié)果為2,并且i的值也被改變?yōu)?。但是,當(dāng)自增、自減運(yùn)算的結(jié)果要被用于繼續(xù)參與其它操作時,前置與后置時的情況就完全不同。例如,如果i的值為l,則下列兩條語句的執(zhí)行結(jié)果不同:
1
2
cout<
cout<<++i;
第一條語句首先輸出i當(dāng)前的值1,然后i自增,其值變?yōu)?;第二條語句首先使i自增為2,然后輸出i的值2。
賦值運(yùn)算符與賦值表達(dá)式
C++提供了幾個賦值運(yùn)算符,最簡單的賦值運(yùn)算符就是“=”。帶有賦值運(yùn)算符的表達(dá)式被稱為賦值表達(dá)式。例如,m=m+6就是一個賦值表達(dá)式。賦值表達(dá)式的作用就是將等號右邊表達(dá)式的值賦給等號左邊的對象。賦值表達(dá)式的類型為等號左邊對象的類型,表達(dá)式的結(jié)果為等號左邊對象被賦值后的值,運(yùn)算的結(jié)合性為自右向左。請看下列賦值表達(dá)式的例子。
1
n=1
表達(dá)式值為1。
1
a=b=c=2
這個表達(dá)式從右向左運(yùn)算,在c被更新為2后,表達(dá)式c=2的值為2,接著b的值被更新為2,最后a被賦值為2。
1
a=3+(c=4)
表達(dá)式值為7,a的值為7,c為4。
除了“=”以外,C++還提供了10種復(fù)合的賦值運(yùn)算符:+=,-=,*=,/=,%=,<<=,>>=,&=,“=,|=。其中,前五個運(yùn)算符是賦值運(yùn)算符與算術(shù)運(yùn)算符復(fù)合而成的,后五個是賦值運(yùn)算符與位運(yùn)算符復(fù)合而成的。關(guān)于位運(yùn)算,稍后再做介紹。這里10種運(yùn)算符的優(yōu)先級與“=”相同,結(jié)合性也是自右向左?,F(xiàn)在舉例說明復(fù)合賦值運(yùn)算符的功能。
1
2
b+=2;//等價于b=b+2
x*=y+3;//等價于x=x*(y+3)
1
如果在賦值表達(dá)式后面加上分號,便成為了賦值語句。例如:
b=b+2:便是一個賦值語句,它實現(xiàn)的功能與賦值表達(dá)式相同。賦值表達(dá)式與賦值語句的不同點在于:賦值表達(dá)式可以作為一個更復(fù)雜表達(dá)式的一部分,繼續(xù)參與運(yùn)算;而賦值語句不能。
逗號運(yùn)算符與逗號表達(dá)式
在C++中,逗號也是一個運(yùn)算符,它的使用形式為:
<表達(dá)式1>,<表達(dá)式2>,…,<表達(dá)式n>求解順序為,先求解表達(dá)式1,再求解表達(dá)式2,最后求解表達(dá)式n的值。逗號表達(dá)式的最終結(jié)果為表達(dá)式n的值。例如:
1
x=2*5,x*4
表達(dá)式的結(jié)果為40。
關(guān)系運(yùn)算符和關(guān)系表達(dá)式
關(guān)系運(yùn)算符即比較符。
用關(guān)系運(yùn)算符將兩個表達(dá)式連接起來就是關(guān)系表達(dá)式。關(guān)系表達(dá)式是一種最簡單的邏輯表達(dá)式。例如:
1
2
3
x>5
x+y<=20
c==a+b
注:“==”(等于)是連續(xù)的兩個等號,勿誤寫為賦值運(yùn)算符“=”。
關(guān)系表達(dá)式一般用于判斷是否符合某一條件。關(guān)系表達(dá)式的結(jié)果類型為bool,值只能是true或false。條件滿足為true,條件不滿足為false。例如,當(dāng)x=t時,x>5的結(jié)果就為false。
邏輯運(yùn)算符與邏輯表達(dá)式
用邏輯運(yùn)算符將簡單的關(guān)系表達(dá)式連接起來構(gòu)成較復(fù)雜的邏輯表達(dá)式。邏輯表達(dá)式的結(jié)果類型也為bool,值只能為true或false。
“!”是一元運(yùn)算符,使用形式是:!操作數(shù)。非運(yùn)算的作用是對操作數(shù)取反。如果操作數(shù)a的值為true,則表達(dá)式!a的值為false:如果操作數(shù)a的值為false,則表達(dá)式!a的值為true。
“&&”是二元運(yùn)算符?!?&”運(yùn)算的作用是求兩個操作數(shù)的邏輯與。只有當(dāng)兩個操作數(shù)的值都為true時,與運(yùn)算的結(jié)果才為true,其它情況下與運(yùn)算的結(jié)果均為false。
“||”也是二元運(yùn)算符?!皘|”運(yùn)算的作用是求兩個操作數(shù)的邏輯或。只有當(dāng)兩個操作數(shù)的值都為false時,或運(yùn)算的結(jié)果才為false,其它情況下或運(yùn)算的結(jié)果均為true。
類所表示的一組對象十分相似,可以作為模板來有效的創(chuàng)建對象,利用類可以產(chǎn)生很多的對象類所代表的事物或者概念都是抽象的。在存取Private類型數(shù)據(jù)或者函數(shù)的時候,只有類本身聲明的函數(shù)才是被允許的。類在與外部連接時,利用的就是Public共有類型函數(shù),任何外部函數(shù)的訪問都是運(yùn)行的。
對象主要是對客觀事物的某個實體進(jìn)行描述,它作為一個單位,共同組成了系統(tǒng),它的組成是一組屬性和一組服務(wù),這組服務(wù)操作于這組屬性。屬性和服務(wù)是對象構(gòu)成眾多要素中的兩種,屬性的實質(zhì)是一個數(shù)據(jù)項,主要是對對象靜態(tài)特性進(jìn)行描述,服務(wù)的實質(zhì)是一個操作序列,主要是對對象動態(tài)特征進(jìn)行描述。
關(guān)鍵字(keyword)是整個語言范圍內(nèi)預(yù)先保留的標(biāo)識符,每個C++關(guān)鍵字都有特殊的含義。經(jīng)過預(yù)處理后,關(guān)鍵字從預(yù)處理記號(preprocessing-token)中區(qū)出來,剩下的標(biāo)識符作為記號(token),用于聲明對象、函數(shù)、類型、命名空間等。不能聲明與關(guān)鍵字同名的標(biāo)識符。
各個版本的ISO C++都規(guī)定以下劃線接大寫字母起始的標(biāo)識符保留給實現(xiàn)。編譯器可以用這些保留標(biāo)識符作為擴(kuò)展關(guān)鍵字,這不保證可移植性。以下討論ISO C++所保留的關(guān)鍵字。
C++與C語言完全兼容,C語言的絕大部分內(nèi)容可以直接用于C++的程序設(shè)計,用C語言編寫的程序可以不加修改地用于C++。
在C++中,類是支持?jǐn)?shù)據(jù)封裝的工具,對象則是數(shù)據(jù)封裝的實現(xiàn)。C++通過建立用戶定義類支持?jǐn)?shù)據(jù)封裝和數(shù)據(jù)隱藏。
在面向?qū)ο蟮某绦蛟O(shè)計中,將數(shù)據(jù)和對該數(shù)據(jù)進(jìn)行合法操作的函數(shù)封裝在一起作為一個類的定義。對象被說明為具有一個給定類的變量。每個給定類的對象包含這個類所規(guī)定的若干私有成員、公有成員及保護(hù)成員。完好定義的類一旦建立,就可看成完全封裝的實體,可以作為一個整體單元使用。類的實際內(nèi)部工作隱藏起來,使用完好定義的類的用戶不需要知道類的工作原理,只要知道如何使用它即可。
在C++現(xiàn)有類的基礎(chǔ)上可以聲明新類型,這就是繼承和重用的思想。通過繼承和重用可以更有效地組織程序結(jié)構(gòu),明確類間關(guān)系,并且充分利用已有的類來完成更復(fù)雜、深入的開發(fā)。新定義的類為子類,成為派生類。它可以從父類那里繼承所有非私有的屬性和方法,作為自己的成員。
采用多態(tài)性為每個類指定表現(xiàn)行為。多態(tài)性形成由父類和它們的子類組成的一個樹型結(jié)構(gòu)。在這個樹中的每個子類可以接收一個或多個具有相同名字的消息。當(dāng)一個消息被這個樹中一個類的一個對象接收時,這個對象動態(tài)地決定給予子類對象的消息的某種用法。多態(tài)性的這一特性允許使用高級抽象。
繼承性和多態(tài)性的組合,可以輕易地生成一系列雖然類似但獨一無二的對象。由于繼承性,這些對象共享許多相似的特征。由于多態(tài)性,一個對象可有獨特的表現(xiàn)方式,而另一個對象有另一種表現(xiàn)方式。
C++語言是對C語言的擴(kuò)充,從Simula中吸取了類,從ALGOL語言中吸取了運(yùn)算符的一名多用、引用和在分程序中任何位置均可說明變量,綜合了Ada語言的類屬和Clu語言的模塊特點,形成了抽象類,從Ada Clu和ML等語言吸取了異常處理,從BCPL語言中吸取了用//表示注釋C++語言保持了C語言的緊湊靈活、高效以及易于移植性強(qiáng)等優(yōu)點,它對數(shù)據(jù)抽象的支持主要在于類概念和機(jī)制,對面向?qū)ο箫L(fēng)范的支持主要通過虛擬機(jī)制函數(shù)因C++語言既有數(shù)據(jù)抽象和面向?qū)ο竽芰?,運(yùn)行性能高,加上C語言的普及,而從C語言到C++語言的過渡較為平滑,以及C++語言與C語言的兼容程度可使數(shù)量巨大的C語言程序能方便地在C++語言環(huán)境中復(fù)用,使C++語言在短短幾年內(nèi)能流行。(計算機(jī)軟件專家王汝傳評)
作為最受歡迎的編程語言之一,C++帶給開發(fā)者們最大的驚喜便是其強(qiáng)大的特性。一方面跟C兼容,可以直面系統(tǒng)底層API,SDK,另一方面提供了很多范式,足夠的抽象能力,面向?qū)ο?,操作符重載,模板等。(腳本之家評)