序
0.為什麼學習C++
0.Why Shall I Learn C++?
C++作為一門較為成熟重量級的語言,吸引了許許多多編程學習者。單從市面上編程書籍中C++的書所佔的比例即可見一斑。當然,近年來隨著Java、C#的興起與逐漸發展,也出現了一些不同的聲音,認為C++並非高效應用編程的首選,而且硬體的迅速發展也會使虛擬平台的速度劣勢淡化,而其優良的可移植性及安全性將使之成為新的語言主流……
但無論怎麼說,C++強大靈活的語言機制、深邃的內涵、廣博豐富的外延使它成為一個時代的經典語言,其中體現出的編程思想的美感使深入學習過它的人為之感歎;且不論過時與不過時的老掉牙問題,單從學習的角度說,這是一門非常值得品味的語言,儘管我認為無論過去、現在還是將來,天底下不存在哪一門語言非學不可才能成為高手(思想最重要,“不會XXX語言不算真正的高手”之類的言論實在無聊之至),然而假如在這個時代你錯過了C++,我還是有一點點遺憾,畢竟你錯過了一個共用經典的機會(一點點而已,可能有些主觀,呵呵)。至於實用性,自然,C++不是唯一的選擇(Andrew Koenig 曾在《C++沉思錄》中多次強調C++設計的最終基準是實用性,但我們很多人在開發傳統型應用程式時似乎更喜歡VB、DELPHI等RAD)。總言之,這個方面我們允許會有多種選擇,但從思想的深化(學習方面)角度上說,C++或許會給你相當多的啟發,即使你實際開發中更喜歡使用其它語言的RAD。
1.本系列的定位
1.Position
這個系列主要是面向C++的“純”初學者,他們頭一回接觸C++,甚至同時也是頭一回走進Programming的世界。現在市面上C++的好書很多,網路又發達,所以現今的初學者比較有福氣,不像當初,找得一本C++書已經是挺“可以”了,哪裡知道什麼好與不好,書再爛,懷疑的也是自己的腦子(恐怕連“爛書”這個詞還沒發明吧)。現在不同,讀者不難找到一本輕便抑或詳盡的書籍結合自身情況學習。但畢竟書籍本身要考慮到內容組織的系統化,因而不可避免地,暫時或者永久性地存在一些讀者熱切想知道但卻未出現的盲點,或者是略有提及但卻不深入。假如身邊有位老師,自然不成問題,但或許更多的愛好者們都是像我這樣自己“過來”的(呵呵),遇到茫然之處便頭腦發癢,自己又搔不著,多少有些許不爽。本系列的目的就是“搔癢”,癢非必是傷,因此解決的可能是一些過來人看來無關緊要的甚至“弱智”的問題,但我相信這都是許許多多的初學者都非常想瞭解卻無從尋覓的東西。至於哪些是“東西”哪些不是,可能判斷有些主觀,我暫且從自己學習的曲線中搜尋;同時也非常希望朋友們針對自己入門過程中的困惑與我通過郵件聯絡(kusk@163.com),至於本人,同樣也是一位初學者,只不過可能混的時間久了,稍有些經驗而已,但錯誤可能會出現,也非常歡迎指正提出:你的關注將是我最大的動力^_^
2.什麼是C++
2.What is C++?
可能現在還會有許多初學者分不清C++、VC、MFC、C++ Builder這些基本的概念,經常聽到類似於“VB還不夠強,我明天要開始學VC”這樣的言論,有些書店也還是錯誤地赫然掛著“Visual C++語言”、“C++ Builder語言”的分類牌。其實C++指的僅僅是一門電腦語言,它規定了書定程式的文法,例如:如何使用變數、常量,如何撰寫語句,如何讓電腦作出判斷,如何讓某些特定的功能反覆執行若干次(迴圈),如何把一些複雜的“打包”成一個簡單的模組(函數/子程式)以便調用,等等。可以說,語言是獨立於電腦的,它只是一系列人為制定的規則,如果你願意的話自然也可以拿出紙筆自己設計一門D++之類的新語言。
不過單有規則還不行,要真正能寫出程式並投入運行,你應該讓電腦學會用上你的D++語言。目前的電腦絕大多數只能直接識別二進位的機器語言,所以通常的作法是寫一個負責翻譯的程式,它可以自動地把你輸入的D++程式轉化成二進位程式,這樣電腦就可以執行它了。這個負責翻譯的程式,通常我們稱為編譯器。當一門語言流行開之後,會有一些軟體廠商注意到:噫,D++似乎很受歡迎啊,我們應當立刻推出D++的編譯器佔領市場。於是各個廠商推出了自己的D++編譯器,為了區分,不同廠商的編譯器都有不同的名字,例如,可能會是“Visual D++”、“D++ Builder”、“Better D++”等等。
通常最原始的編譯手段是命令列方式,假如我想編譯一個hello.dpp的來源程式,那麼我可能要進入DOS命令列方式,假如編譯器的名字是dpp32,我需要鍵入類似於dpp32 hello.dpp hello.exe之類的麻煩的東西指示它。假如有多個源檔案,還要作更新編譯、連結等動作,可能還要根據不同的需要加上許多晦澀難記的參數,這樣一來就會十分麻煩。好一點的話可以寫一個稱為maikfile的檔案,它可以把這些設定儲存好,讓編譯器自己識別而不必每次鍵入。但命令列方式的來回切換還是不夠快捷,因此聰明的編譯廠商通常會為我們特別設計一個稱為“整合編譯環境(IDE)”的編譯平台:它可以看作一個附加了許多方便我們使用D++的功能的編輯軟體,例如,我們可以不必切換回命令列方式後動編譯,而只要單擊“編譯”表徵圖或者按下相應的快速鍵,編譯器就會自動為我們編譯,當然我們也可以在這個軟體中設定編譯的選項。此久,這個編輯軟體還特別加入了一些好用的功能,比如它會聰明地將D++程式中的關鍵字顯示成另一種顏色,數字又是另一種顏色……這樣做的好處是便於我們剖析器,及時發現輸入錯誤,等等。強大的編譯環境還整合了程式碼分析、跟蹤調試等功能,比命令列模式好用多了。但別忘了,真正“造”出程式的,還是那些最原始的命令列程式。
除此以外,由於現在的作業系統日趨複雜,如果從零開始編製程式,往往要做許多重複而無用的勞動。因此各個編譯廠商通常會在編譯平台中提供一套已經完成的程式庫,用於構建程式的相關聯模組的集合稱為應用程式架構,Windows下常見的應用程式架構有MFC、VCL等,還有一些跨平台架構,如Qt。架構可能整合在編譯平台中,也可以單獨發行。當然,架構的使用是可選擇的,VC中附帶了MFC,你可以使用它,也可以不用。
3.學習編程的一般步驟
3.How to Learn Progrmming Step by Step
學習語言到應用編程,大約可以分為三步:1.學習語言的文法、標準庫、思想;2.學習相關作業系統的API(API);3.學習類庫使用。有一定經驗後,三者可以交替進行,相互加深。此外還要學習一些基礎理論,像設計模式、演算法與資料結構等。
附:另外幾個常見的概念——答neverdown1983網友問
問:標準庫和類庫有什麼區別? 那個API(API)能不能解釋一下?謝謝了!
我想先說說庫(Library)吧,想必這個概念諸位都有所瞭解,在下多羅嗦幾句再說一下:所謂庫,就是許多程式碼的集合:編程的時候,會有許多常用的功能,如果每個用到這些功能的程式都要從頭寫一遍,則會出現無謂地重複勞動;因此人們把這些常用的功能編寫好,並按一定的邏輯關係組織、封裝起來,便於編程時直接調用,就成為了庫。
庫中的程式模組是怎麼放置的呢?
嗯,首先,我們很自然會想到把那些常用的功能封裝成一個個相應的函數,這樣程式要用到這些功能的時候,我們就調用相應的函數。這些函數組成的庫自然可以叫做函數庫,顯然函數庫的思想是面向過程的;
其次,我們也可以把要實現的任務封裝成一個個類(class),例如要某個庫包含檔案操作的功能,設計者可能會寫一個File類,它或許會有open、close、reset、read、write等方法,內部也可能會有一些儲存檔案資訊的資料結構,等等。這些由各種類組成的庫稱為類庫,它是物件導向的。
因此,按組織思想分,庫可以分為函數庫、類庫等。
至於標準庫與非標準庫,則是另一種分類方式。如果某個庫是C++語言標準所“規定”要有的,如STL(即標準模板庫,我們在C++中常用的vector、list之類的容器以及相關演算法都屬於STL的一部分),是語言中的一部分,則稱為C++的標準庫(被標準化了的,無論VC、C++ Builder還是其它什麼C++編譯平台,都要求包含它才算是“真正”的C++)。當然,標準庫的範圍比較窄,除此之外的諸如MFC、VCL、Qt等都是其它軟體廠商(或組織)自己編寫的,不是C++標準所規定(單純介紹C++的書也不會介紹它們),不是語言的一部分,所以不是標準庫。
API(Application Programming Interface)是作業系統為程式員提供的功能。你要在一個作業系統上編寫程式,一舉一動都要依賴作業系統:你要讀一個檔案,或者在螢幕上畫一個點,最終都是要求作業系統替你實現的,而這些“要求”的方式,或者說是“與作業系統打交道”的方式,就是通過編程介面。在DOS中,程式員要實現的功能最終是通過中斷的方式“告訴”作業系統,從而讓其替你完成的,因此可以說中斷是DOS系統的API;到了更複雜的Windows系統,由於中斷過於簡單與低級,所以Windows為程式員提供的是一系列的函數,這些函數已經被編譯好,大多放在各個隨系統一起安裝好的.dll檔案中,大多數情況下,Windows下的編譯器會將我們的程式與這些函數庫連結好;很自然地,它們就被稱為API函數。Windows的API函數成千上萬,與DOS區區十几几十條的中斷相比實在是複雜多了,從而提供了比DOS更多、更完善的服務。不過學習的時候不可能把這些函數的名稱、調用方法、參數表之類全部記得一清二楚,一般對部分最常用的函數有個大概的掌握就可以;其它的一般是隨用隨查,這方面MSDN是一個相當好(而且大概也是最權威)的資料集。