天天看點

《C++入門經典(第6版)》——第2章 程式的組成部分2.1 使用C++的原因

本節書摘來自異步社群出版社《c++入門經典(第6版)》一書中的第2章,第2.1節,作者: 【美】rogers cadenhead(羅格斯 卡登海德) , jesse liberty(傑西 立波提) ,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

c++入門經典(第6版)

本章介紹如下内容:

為何使用c++;

c++程式的組織結構;

注釋如何讓程式更容易了解;

函數的作用。

雖然已面世37年,但是c++程式設計語言的地位比20世紀70年代末出現的其他東西高得多。目前c++仍在風行,還是一種世界級程式設計語言。

造就它令人驚訝的生命力的原因在于,通過使用c++,隻需編寫少量的代碼,就可建立快速執行的程式,且可在各種計算環境下運作。當今的c++程式設計功能讓您能夠生成功能強大的複雜應用程式,适用于商業、商務和開源開發。

在計算時代持續的70年中,計算機程式設計語言得到了長足發展。c++被認為是對1972年面世的c語言的革命性改進。

最早的程式員使用最原始的計算機指令:機器語言,這些指令用一長串1和0表示。後來,人們發明了彙編語言,它們将機器指令映射到人類能閱讀且易于管理的指令,如add和mov。

組成計算機程式的指令稱為源代碼。

随後出現了進階語言,如basic和cobol,這些語言讓程式員能夠使用類似于實際單詞或句子的語言編寫程式,如let average = .366。然後,由稱為解釋器或編譯器的工具将這些指令轉換為機器語言。

基于解釋器的語言每次讀取一行代碼,并将指令進行轉換。

基于編譯器的語言通過編譯将程式轉換為目标代碼,這些代碼存儲在目标檔案中。然後,由連結器将目标檔案轉換為可在作業系統上運作的可執行程式。

由于解釋器在代碼編寫時讀取它,并動态地執行代碼,是以對程式員來說更容易使用。編譯器要求程式員執行不那麼友善的編譯和連結步驟,但好處是運作速度比解釋器運作的程式快得多。

多年來,程式員的目标是編寫可快速執行的簡短代碼。程式必須很小,因為記憶體昂貴;其運作速度也必須快,因為處理能力的要求也很苛刻。随着計算機價格越來越便宜、速度越來越快、處理能力越來越強大,而記憶體的容量越來越大、價格越來越便宜,是以,這些制約因素已不再重要。

目前,最大的程式設計開銷是程式員的時間成本。諸如c++等現代語言使得編寫結構良好、易于維護的程式更容易,而且這些程式還可擴充和改進。

随着程式設計語言的發展,出現了滿足不同程式設計風格的語言。

在過程型程式設計中,程式被設計為一系列操作,這些操作對一組資料進行處理。結構化程式設計的出現為組織這些過程和管理大量資料提供了一種系統性方法。

結構化程式設計的主要思想是分而治之。對于程式要執行的任務,如果太複雜,則将其劃分為一組更小的任務。如果這些任務還太複雜,則進一步劃分成更小的任務。最終的目标是,任務足夠小,足夠獨立,易于了解。

例如,假設有出版商請您編寫一個程式,以跟蹤其天才橫溢、魅力四射的計算機圖書作者小組的平均收入,可将這項工作劃分成如下子任務。

(1)找出每位作者的收入。

(2)計算出版商有多少作者。

(3)計算這些作者的總收入。

(4)将總收入除以作者數。

計算總收入又可做如下劃分。

(1)擷取每位作者的個人記錄。

(2)獲悉作者的預付款和版稅。

(3)扣除咖啡的費用、治療眼睛疲勞的費用以及脊椎保健的費用。

(4)将其收入加入總收入。

(5)擷取下一位作者的個人記錄。

擷取作者記錄的任務又可進一步劃分為如下子任務。

(1)打開存儲作者記錄的檔案夾。

(2)選擇正确的記錄。

(3)從磁盤讀取資料。

雖然結構化程式設計得到了廣泛應用,但這種方法也存在一些缺點。随着資料量的增加,将資料與操作資料的任務分開将更難。使用資料要做的事情越多,程式越令人感到迷惑。

過程型程式員經常發現自己為解決問題而重新尋求新的解決方案,而不是編寫可重用的程式。重用性基于的理念是,建立程式元件,需要時将其插入程式中。這種方法模拟了現實世界。在現實世界中,使用已制造好的零件組裝成裝置,這些零件執行特定的任務,是以自行車設計師無須從頭開始制作刹車;相反,他可将現有的刹車融合到設計中,以利用其功能。

在面向對象程式設計面世前,計算機程式員無法使用這種基于元件的方法。

面向對象程式設計(oop)是一種革命性的程式設計風格,正是c++讓它得以大行其道。

從本質上說,面向對象程式設計就是将資料和操作資料的過程視為一個對象:一個有身份和特征的獨立實體。

c++全面支援面向對象程式設計,包括面向對象開發的三個支柱概念:封裝、繼承和多态。

1.封裝

前面說到,自行車工程師在設計新車時,他将各個元件組合起來,如車架、手把、車輪和前燈。每個元件都有一些屬性,能夠完成一些行為。他不用了解前燈的工作原理就能使用,隻要知道它是做什麼用的即可。

為了實作這個目标,前燈必須是獨立的,它必須完成明确的任務,并且全面完成。全面完成一項任務稱為封裝。

前燈的所有屬性都封裝在headlight對象中,而不是遍布整輛自行車。

c++支援通過建立使用者定義的類型來封裝屬性,這種類型稱為類。定義良好的類是一個完全封裝的實體,要麼使用整個實體,要麼不使用。使用定義良好的類時,程式不需要知道其工作原理,根據這一原則,應隐藏類的内部工作原理。程式員隻需知道如何使用它即可。如何建立類将在第8章介紹。

2.繼承和重用

下面更深入地了解自行車工程師,假設他名為penny farthing。penny要讓新設計的自行車快速投放市場:他欠了一屁股債,這些債主可沒有耐心。

鑒于時間緊迫,penny決定對一款現有的自行車進行改進,給它添加杯托和裡程表等新部件,推出一款有額外功能的改進型新車。他重用了普通自行車的所有部件,同時添加了新部件,以拓展其用途。

c++通過繼承來支援重用的概念。可将新類型聲明為現有類型的擴充,新子類稱為繼承了現有類型。penny設計的自行車繼承了老式普通自行車,是以具備其所有品質,但根據需要添加了新功能。有關繼承及其應用将在第16章讨論。

3.多态

作為最後一個賣點,penny farthing設計的amazo-bicycle牌自行車的鈴铛的行為與衆不同,不是像病鴨那樣叫,而是輕按時像汽車喇叭,重按時像霧号。鈴铛根據騎車人如何使用它發出正确的叫聲。

為了支援這種不同對象做相應事情的概念,c++使用了稱為函數多态和類多态的功能。 多态指的是同一樣東西有多種形态,這将在第17章讨論。

通過學習c++,您将全面了解面向對象程式設計。等您閱讀完本書并開始開發c++程式時,将熟悉這些概念。

本書不介紹如何設計自行車,也不介紹從債務纏身的狀态下走出來。

繼續閱讀