第一章 C++概述
1.1 C++簡介
???????“C++”中的 ++ 來自于C語言中的遞增運(yùn)算符 ++总棵,該運(yùn)算符將變量加1和敬。C++ 起初也叫”c with clsss”.通過名稱表明辛掠,C++ 是對(duì)C的擴(kuò)展宴树,因此C++ 是C語言的超集梆奈,這意味著任何有效的c程序都是有效的C++ 程序茧吊。C++ 程序可以使用已有的C程序庫。
庫是編程模塊的集合叽奥,可以在程序中調(diào)用它們扔水。庫對(duì)很多常見的編程問題提供了可靠的解決方法,因此可以節(jié)省程序員大量的時(shí)間和工作量朝氓。
C++ 語言在C語言的基礎(chǔ)上添加了面向?qū)ο缶幊?/strong>和泛型編程的支持魔市。C++ 繼承了C語言高效,簡潔赵哲,快速和可移植的傳統(tǒng)待德。
C++ 融合了3種不同的編程方式:
- C語言代表的過程性語言.
- C++ 在C語言基礎(chǔ)上添加的類代表的面向?qū)ο笳Z言.
- C++ 模板支持的泛型編程。
C語言和C++語言的關(guān)系:
????????c++ 語言是在C語言的基礎(chǔ)上枫夺,添加了面向?qū)ο蠼堋⒛0宓痊F(xiàn)代程序設(shè)計(jì)語言的特性而發(fā)展起來的。兩者無論是從語法規(guī)則上橡庞,還是從運(yùn)算符的數(shù)量和使用上较坛,都非常相似,所以我們常常將這兩門語言統(tǒng)稱“C/C++”扒最。
C語言和C++并不是對(duì)立的競爭關(guān)系:
- C++ 是C語言的加強(qiáng)丑勤,是一種更好的C語言。
- C++ 是以C語言為基礎(chǔ)的吧趣,并且完全兼容C語言的特性法竞。
????????C語言和C++ 語言的學(xué)習(xí)是可以相互促進(jìn)。學(xué)好C語言强挫,可以為我們將來進(jìn)一步地學(xué)習(xí)C++ 語言打好基礎(chǔ)岔霸,而C++ 語言的學(xué)習(xí),也會(huì)促進(jìn)我們對(duì)于C語言的理解俯渤,從而更好地運(yùn)用C語言呆细。
1.2 C++起源
???????與c語言一樣,c++ 也是在貝爾實(shí)驗(yàn)室誕生的八匠,Bjarne Stroustrup(本賈尼·斯特勞斯特盧普)在20世紀(jì)80年代在這里開發(fā)了這種語言侦鹏。
???????????????????????????????????(C++之父-本賈尼·斯特勞斯特盧普)
???????Stroustrup關(guān)心的是讓c++ 更有用,而不是實(shí)施特定的編程原理或風(fēng)格臀叙。在確定語言特性方面略水,真正的編程比純粹的原理更重要。Stroustrup之所以在c的基礎(chǔ)上創(chuàng)建c++,是因?yàn)?strong>c語言簡潔劝萤、適合系統(tǒng)編程渊涝、使用廣泛且與UNIX操作系統(tǒng)聯(lián)系緊密。
???????用他自己的話來說,“C++ 主要是為了我的朋友和我不必再使用匯編語言跨释、C語言或者其他現(xiàn)代高級(jí)語言來編程而設(shè)計(jì)的胸私。它的主要功能是可以更方便得編寫出好程序,讓每個(gè)程序員更加快樂”鳖谈。
1.3 可移植性和標(biāo)準(zhǔn)
???????假設(shè)為運(yùn)行windows 2000的老式奔騰pc編寫了一個(gè)很好用的c++ 程序岁疼,而管理員決定使用不同操作系統(tǒng)(比如說Mac OS 或 Linux)和處理器的計(jì)算機(jī)替換它。該程序是否可在新平臺(tái)運(yùn)行呢缆娃?當(dāng)然捷绒,但是必須使用為新平臺(tái)設(shè)計(jì)的c++ 編譯器重新編譯。但是是否需要修改寫好的代碼贯要?如果不需要修改代碼的情況下暖侨,重新編譯程序后,程序依然運(yùn)行良好崇渗,該程序是可移植的字逗。
???????程序是否可移植性有兩個(gè)問題需要解決。第一是硬件宅广,針對(duì)特定硬件編程的程序是不可移植的葫掉。第二,語言的實(shí)現(xiàn)跟狱,windows xp c++ 和 Redhat Linux 或 Mac OS X對(duì)c++ 的實(shí)現(xiàn)不一定相同挖息。雖然我們希望c++ 版本與其他版本兼容,但是如果沒有一個(gè)公開的標(biāo)準(zhǔn)兽肤,很難做到。因此绪抛,美國國家標(biāo)準(zhǔn)局(American National Standards Institute,ANSI)在1990年設(shè)立一個(gè)委員會(huì)專門負(fù)責(zé)制定c++ 標(biāo)準(zhǔn)(ANSI制定了c語言的標(biāo)準(zhǔn))资铡。國際標(biāo)準(zhǔn)化組織(International Organization for Standardization,ISO)很快通過自己的委員會(huì)加入到這個(gè)行列幢码,創(chuàng)建了聯(lián)合組織ANSI/ISO,制定c++ 標(biāo)準(zhǔn)笤休。
???????經(jīng)過多年的努力,制定出了一個(gè)國際標(biāo)準(zhǔn)ISO/IEC 14882:1998 症副,并于1998年獲得了ISO店雅、IEC(International Electrotechnical Committee,國際電工技術(shù)委員會(huì))和ANSI的批準(zhǔn)。這個(gè)標(biāo)準(zhǔn)就是我們經(jīng)常所說的c++98贞铣。它不僅描述了已有的c++ 特性闹啦,還對(duì)語言進(jìn)行了擴(kuò)展,添加了異常辕坝、運(yùn)行階段類型識(shí)別(RTTI)窍奋、模板和標(biāo)準(zhǔn)模板庫(STL).
???????2003年,發(fā)布了c++ 標(biāo)準(zhǔn)第二版(IOS/IEC 14882:2003),這一版本對(duì)第一版修訂了一些錯(cuò)誤,但并沒有改變語言特性琳袄,因此c++98表示c++98/c++2003.
???????c++ 不斷發(fā)展江场。IOS標(biāo)準(zhǔn)委員會(huì)于2011年8月批準(zhǔn)了新標(biāo)準(zhǔn)ISO/IEC 14882:2011,該標(biāo)準(zhǔn)被稱為c++11,與c++98一樣c++11也新增了許多特性。
ISO c++ 標(biāo)準(zhǔn)還吸收了ANSI c語言標(biāo)準(zhǔn)窖逗,c++ 盡量做到是c的超集址否。意味著在理想情況下,任何有效的c程序都應(yīng)該是有效的c++ 程序碎紊。
???????ANSI不僅定義了c語言佑附,還 定義了一個(gè)ANSI c必須實(shí)現(xiàn)的標(biāo)準(zhǔn)c庫。c++ 也在使用這個(gè)庫矮慕,另外ANSI/ISO c++ 標(biāo)準(zhǔn)還提供了一個(gè)c++ 標(biāo)準(zhǔn)類庫帮匾。
1.4 為什么C++會(huì)成功
???????c++ 最初的目的是將c語言轉(zhuǎn)變?yōu)?strong>OOP(面向?qū)ο蟪绦蛟O(shè)計(jì))語言,但是c++ 后來并沒有這么做痴鳄,而是立足于程序的實(shí)際瘟斜。因?yàn)樵?strong>c 語言方面大量投入的程序員使其完全丟掉c 語言那種編程的思考方式,轉(zhuǎn)而去接受一種新的語言痪寻,新的思維螺句,那么將會(huì)導(dǎo)致這些程序員中大部分人在短時(shí)間內(nèi)可能毫無成果,使其生產(chǎn)率降低橡类。但是如果讓這些c程序員在已有知識(shí)的基礎(chǔ)上蛇尚,再去學(xué)習(xí)c++ 語言,理解運(yùn)用OOP顾画,那么也只是在其已有思維的基礎(chǔ)上進(jìn)行擴(kuò)展而已取劫,這樣可以保持其更好的生產(chǎn)率。
???????簡而言之研侣,強(qiáng)迫程序員放棄c語言和c語言的思考方式谱邪,而去轉(zhuǎn)到OOP上是需要代價(jià)的,但是從c語言轉(zhuǎn)到c++ 所花費(fèi)的代價(jià)就會(huì)小很多庶诡。所以也可以理解為c++ 的出現(xiàn)并不是去替代c,而是對(duì)c的擴(kuò)展惦银,所以在c++ 中既可以使用c++ 新特性,并且可以使用c的過程式思維來編寫程序末誓。
對(duì)于傳統(tǒng)的結(jié)構(gòu)化語言扯俱,我們向來沒有太多的疑惑,函數(shù)調(diào)用那么自然而明顯喇澡,只是從程序的某一個(gè)地點(diǎn)調(diào)到另一個(gè)地點(diǎn)去執(zhí)行迅栅。但是對(duì)于面向?qū)ο?OO)語言,我們疑惑就會(huì)很多晴玖。其原因就是c++編譯器為我們程序員做了太多隱藏的工作:構(gòu)造函數(shù)库继,析構(gòu)函數(shù)箩艺、虛函數(shù)、繼承宪萄、多態(tài)....有時(shí)候它為我們合成出一些額外的函數(shù),有時(shí)候它又偷偷在我們寫的函數(shù)里艺谆,放進(jìn)更多的操作。有時(shí)候也會(huì)給我們的對(duì)象里放進(jìn)一些奇妙的東西拜英,使得我們sizeof的時(shí)候結(jié)果可我們預(yù)期不一樣静汤。
第二章 C++初識(shí)
2.1 簡單的C++程序
2.1.1 c++ hello world
請(qǐng)打開一下示例代碼:
#include<iostream>
using namespace std;
int main(){
cout << "hello world" << endl;
return EXIT_SUCCESS;
}
分析:
-
#include<iostream>;
預(yù)編譯指令,引入頭文件iostream
. -
using namespace std;
使用標(biāo)準(zhǔn)命名空間 -
cout << “hello world”<< endl;
和printf
功能一樣居凶,輸出字符串”hello wrold”
問題1:c++頭文件為什么沒有.h虫给?
???????在c語言中頭文件使用擴(kuò)展名 .h ,將其作為一種通過名稱標(biāo)識(shí)文件類型的簡單方式。但是c++ 得用法改變了侠碧,c++ 頭文件沒有擴(kuò)展名抹估。但是有些c語言的頭文件被轉(zhuǎn)換為c++ 的頭文件,這些文件被重新命名弄兜,丟掉了擴(kuò)展名 .h (使之成為c++ 風(fēng)格頭文件)药蜻,并在文件名稱前面加上前綴c(表明來自c語言)。例如c++ 版本的math.h為cmath.
???????由于C使用不同的擴(kuò)展名來表示不同文件類型替饿,因此用一些特殊的擴(kuò)展名(如hpp或hxx)表示c++ 的頭文件也是可以的语泽,ANSI/IOS標(biāo)準(zhǔn)委員會(huì)也認(rèn)為是可以的,但是關(guān)鍵問題是用哪個(gè)比較好视卢,最后一致同意不適用任何擴(kuò)展名踱卵。
頭文件類型 | 約定 | 示例 | 說明 |
---|---|---|---|
c++舊式風(fēng)格 | 以.h結(jié)尾 | iostream.h | c++程序可用 |
c舊式風(fēng)格 | 以.h結(jié)尾 | math.h | c/c++程序可用 |
c++新式風(fēng)格 | 無擴(kuò)展名 | iostream | c++程序可用,使用namespace std |
轉(zhuǎn)換后的c | 加上前綴c,無擴(kuò)展名 | cmath | c++程序可用据过,可使用非c特性惋砂,如namespace std |
問題2:using namespace std 是什么?
???????namespace是指標(biāo)識(shí)符的各種可見范圍。命名空間用關(guān)鍵字namespace 來定義绳锅。命名空間是C++ 的一種機(jī)制西饵,用來把單個(gè)標(biāo)識(shí)符下的大量有邏輯聯(lián)系的程序?qū)嶓w組合到一起。此標(biāo)識(shí)符作為此組群的名字榨呆。
問題3:cout 、endl 是什么庸队?
???????cout是c++ 中的標(biāo)準(zhǔn)輸出流积蜻,endl是輸出換行并刷新緩沖區(qū)。
2.1.2 面向過程
???????面向過程是一種以過程為中心的編程思想彻消。
???????通過分析出解決問題所需要的步驟竿拆,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn),使用的時(shí)候一個(gè)一個(gè)依次調(diào)用就可以了宾尚。
???????面向過程編程思想的核心:功能分解丙笋,自頂向下谢澈,逐層細(xì)化(程序=數(shù)據(jù)結(jié)構(gòu)+算法)。
???????面向過程編程語言存在的主要缺點(diǎn)是不符合人的思維習(xí)慣御板,而是要用計(jì)算機(jī)的思維方式去處理問題,而且面向過程編程語言重用性低,維護(hù)困難纵顾。
2.1.3 面向?qū)ο?/h3>
???????面向?qū)ο缶幊蹋?strong>Object-Oriented Programming)簡稱 OOP 技術(shù)串慰,是開發(fā)計(jì)算機(jī)應(yīng)用程序的一種新方法、新思想笙各。過去的面向過程編程常常會(huì)導(dǎo)致所有的代碼都包含在幾個(gè)模塊中钉答,使程序難以閱讀和維護(hù)。在做一些修改時(shí)常常牽一動(dòng)百杈抢,使以后的開發(fā)和維護(hù)難以為繼数尿。而使用 OOP 技術(shù),常常要使用許多代碼模塊惶楼,每個(gè)模塊都只提供特定的功能右蹦,它們是彼此獨(dú)立的,這樣就增大了代碼重用的幾率鲫懒,更加有利于軟件的開發(fā)嫩实、維護(hù)和升級(jí)。
???????在面向?qū)ο笾锌遥惴ㄅc數(shù)據(jù)結(jié)構(gòu)被看做是一個(gè)整體甲献,稱作對(duì)象,現(xiàn)實(shí)世界中任何類的對(duì)象都具有一定的屬性和操作颂翼,也總能用數(shù)據(jù)結(jié)構(gòu)與算法兩者合一地來描述晃洒,所以可以用下面的等式來定義對(duì)象和程序:
對(duì)象 = 算法 + 數(shù)據(jù)結(jié)構(gòu)
程序 = 對(duì)象 + 對(duì)象 + ……
???????從上面的等式可以看出,程序就是許多對(duì)象在計(jì)算機(jī)中相繼表現(xiàn)自己朦乏,而對(duì)象則是一個(gè)個(gè)程序?qū)嶓w球及。
???????面向?qū)ο缶幊趟枷氲暮诵模?strong>應(yīng)對(duì)變化,提高復(fù)用呻疹。
2.1.4 面向?qū)ο笕筇匦?/h3>
封裝
???????把客觀事物封裝成抽象的類吃引,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作,對(duì)不可信的進(jìn)行信息隱藏刽锤。
???????類將成員變量和成員函數(shù)封裝在類的內(nèi)部镊尺,根據(jù)需要設(shè)置訪問權(quán)限,通過成員函數(shù)管理內(nèi)部狀態(tài)并思。
繼承
???????繼承所表達(dá)的是類之間相關(guān)的關(guān)系庐氮,這種關(guān)系使得對(duì)象可以繼承另外一類對(duì)象的特征和能力。
???????繼承的作用: 避免公用代碼的重復(fù)開發(fā)宋彼,減少代碼和數(shù)據(jù)冗余弄砍。
多態(tài)
???????多態(tài)性可以簡單地概括為“一個(gè)接口仙畦,多種方法”,字面意思為多種形態(tài)音婶。程序在運(yùn)行時(shí)才決定調(diào)用的函數(shù)慨畸,它是面向?qū)ο缶幊填I(lǐng)域的核心概念。
封裝
???????把客觀事物封裝成抽象的類吃引,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作,對(duì)不可信的進(jìn)行信息隱藏刽锤。
???????類將成員變量和成員函數(shù)封裝在類的內(nèi)部镊尺,根據(jù)需要設(shè)置訪問權(quán)限,通過成員函數(shù)管理內(nèi)部狀態(tài)并思。
繼承
???????繼承所表達(dá)的是類之間相關(guān)的關(guān)系庐氮,這種關(guān)系使得對(duì)象可以繼承另外一類對(duì)象的特征和能力。
???????繼承的作用: 避免公用代碼的重復(fù)開發(fā)宋彼,減少代碼和數(shù)據(jù)冗余弄砍。
多態(tài)
???????多態(tài)性可以簡單地概括為“一個(gè)接口仙畦,多種方法”,字面意思為多種形態(tài)音婶。程序在運(yùn)行時(shí)才決定調(diào)用的函數(shù)慨畸,它是面向?qū)ο缶幊填I(lǐng)域的核心概念。