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