1.3 C++世界版圖
C++語言的發展過程,不僅是一個特性不斷增加、內容不斷豐富的過程,更是一個在應用領域中不斷攻城略地的過程。在其30余年的發展過程中,C++在多個應用領域都得到了廣泛的應用和發展。無論是在最初的UNIX/Linux操作系統上,還是在Windows操作系統上,甚至是在最近興起的嵌入式系統上,C++都占有不可取代的一席之地,如圖1-3所示。
圖1-2 C++世界三分天下
1.3.1 Windows系統下的C++開發
自從蓋茨在1985年用C/C++完成了Windows 1.0之后,C++就與Windows操作系統結下了不解之緣。不僅Windows操作系統底層是使用C/C++開發的,而且Windows操作系統上運行的大多數大型軟件也都是用C++開發的。可以說,Windows操作系統中流淌的是C++的血液。雖然現在Windows操作系統上的程序設計語言有很多,但是,C++以其自身得天獨厚的獨特優勢和歷史的積淀,在Windows平台上仍然擁有不可撼動的地位。
1. 得天獨厚的優勢
Windows操作系統本身是用C/C++開發的,兩者之間的親近關系,使得C++調用Windows API(Application Programming Interface,應用程序編程接口,通常是操作系統或編程框架所預先定義的一些函數,以便於程序員訪問系統所提供的功能)有着天然的優勢。因此,在開發與Windows操作系統相關的程序時,往往會優先考慮選擇C++語言。
2. 歷史的積淀
由於歷史的原因,有很多運行在Windows操作系統上的應用程序都是使用C++開發的,而這些應用程序現在依然還需要繼續維護和升級。因此,C++在Windows操作系統上有着先發優勢。
1.3.2 UNIX/Linux系統下的C++開發
如果說在Windows操作系統下C++還有其他的競爭者,那么在UNIX/Linux操作系統下,C++幾乎就是開發語言的不二選擇了。
作為程序設計語言,C++在UNIX/Linux操作系統下的優勢非常明顯。首先,UNIX/Linux操作系統本身是用C/C++語言開發的,這使得操作系統本身對C++開發非常友好。另外,UNIX/Linux操作系統上大多是服務器端的應用,這些應用強調的是高性能和高安全性,而這恰恰是C++語言的強項。大多數UNIX/Linux上的應用都是使用C/C++開發的,比如著名的網絡Web服務器Apache、數據庫服務器MySQL等。因此,如果想在UNIX/Linux操作系統上開發應用,在對性能提出較高要求的同時還要求有較快的開發效率,那么C++必定是首選的開發語言。
1.3.3 嵌入式系統下的C++開發
隨着各種各樣數碼產品的流行,嵌入式系統也逐漸成為了熱門的開發領域。嵌入式系統特殊的硬件限制,使得嵌入式系統對開發語言有着特殊的要求。比如,受制於執行單元的指令集較小的原因,只能實現語法相對比較簡潔的開發語言;嵌入式系統的內存容量比較小,要求對內存進行良好的管理;嵌入式系統的CPU主頻比較低,要求可執行代碼簡潔高效;同時,為了提高開發效率,要求采用高級開發語言等等。嵌入式系統對開發語言的這些苛刻要求,根本難不倒C/C++語言,而且正好是C/C++的優勢所在。C/C++的語法比較簡單,可以在嵌入式系統上得到實現;它接近底層,可以對內存進行良好的管理;其編譯生成的可執行代碼簡潔高效;其自身是高級程序設計語言,開發效率可以得到保證。C/C++很好地滿足了嵌入式系統對開發語言的苛刻要求,幾乎成為嵌入式系統開發的唯一選擇。
1.4 如何學好C++
既然C++如此強大,那么我們該如何學好C++呢?
幾乎每個C++初學者都會問這個問題。然而,這個問題並沒有一個所謂的標准答案。作為一個C++世界的導游,我可以介紹一些知識和經驗給大家,讓大家少走彎路,沿着正確的方向前進,輕松愉快地完成C++世界的奇妙之旅。只要把握好下面這兩個原則,至於具體的學習方法,則需要我們大家自己去尋找。
1.4.1 “多讀多寫多思考”是學好C++的唯一途徑
C++是一門實踐性很強的技術,我們不可能僅僅靠看幾本書就學好了C++。還記得當年我們在學習英語的時候老師總是教導我們要“多聽多說多讀多寫”嗎?同樣,學習C++也需強調“聽說讀寫”。對於編程語言而言,雖然沒有“聽”和“說”,但是“多讀”和“多寫”也是同樣適用的,再加上一個“多思考”,這才是學好C++的唯一途徑。
1. 多讀
多讀就是強調多閱讀和學習別人的優秀代碼,特別是一些優秀的開源產品(例如,文本編輯器程序notepad++、FTP文件傳輸程序FileZilla等)的源代碼。通過閱讀這些源代碼,不僅可以學習它所用到的具體的語言知識、開發技術,還可以從中學習它的設計思想、編程風格等。正所謂“近朱者赤,近墨者黑”,向高手學習,是成為高手的捷徑。
2. 多寫
多寫,就是多多地進行開發實踐。編程是一門技藝,它來自於實踐,也必須回歸到實踐中去。紙上談兵是無法學好編程的。多寫包括很多方面,比如,在開發環境中完成書本上的例子程序,重新實現網絡上的例程,開發實現一些小程序等。多讀的目的只是學習別人的知識和經驗,多寫的目的才是將別人的知識和經驗內化為自己的知識和經驗。同時,通過多寫可以在實踐中發現很多在“多讀”的過程中被隱藏的問題,讓我們的認識和理解更加深刻。同時,通過自己編寫程序、調試程序,可以獲得寶貴的第一手開發經驗,培養自己的動手能力,從而成為一個真正的高手。
3. 多思考
做到了上面的“多讀多寫”,可以讓我們成為一個不錯的開發程序員,但是卻不能讓我們成為一個專業的軟件工程師。
“多讀多寫”強調的是代碼實現的能力,但是,要想成為一個專業的軟件工程師,僅僅只會寫代碼是遠遠不夠的。我們還必須擁有設計的能力,擁有對問題進行抽象、分析、設計算法並最終用程序解決問題的能力。而“多思考”正是為了給我們補上設計這一課。
簡單地說,優秀程序的每一個組成部分(類或者函數等)都是為了解決某個問題而專門設計的。那么,面對優秀的代碼,我們需要思考的就是,這是一個什么問題?為什么要設計成這個樣子?還有沒有其他更好的方法?只有這樣,才能明白優秀的代碼為什么優秀。在遇到類似問題的時候,才會觸類旁通,設計出同樣優秀的代碼。
在這個世界上,從來就沒有哪一門程序設計語言是僅僅通過讀一兩本參考書而學會的,正如沒有哪一個人僅僅讀了《小說概論》就能學會寫小說。我們必須不斷地閱讀、學習、思考他人的優秀代碼,並且不斷地親自動手實踐,將編碼進行到底,才能真正地掌握一門程序設計語言。
1.4.2 和Google做朋友
在開發實踐中,與其說程序是編出來的,倒不如說是“搜”出來的。在實際開發的時候,如果遇到一個語法上的細節問題,就可以用Google搜索關於C++的教程;如果遇到函數使用上的問題,就可以用Google搜索這個函數的文檔;如果遇到常見的開發任務,比如打開並讀取某個文件,就可以用Google搜索已有的示例代碼。甚至當遇到程序中的疑難雜症時,還可以用Google搜索有沒有人遇到相同的問題,看看他人是如何解決這個問題的。總之,編程開發活動離不開Google。網絡就像一個大金礦,而Google就是采礦的機器。善用Google、和Google做朋友,可以幫助我們充分利用豐富的網絡資源來學好C++,用好C++。
知道更多:如何“翻牆”訪問Google
因為眾所周知的原因,雖然Google對於每個程序員來說都是最為有用的網站,可是在國內卻一直無法正常地直接訪問。為了訪問Google,程序員們不得不大費周折,有的采用收費的VPN,有的采用http代理作為中轉,有的采用內置“翻牆”功能的特殊瀏覽器。這些方法要么是太費銀子,要么是太過繁瑣。一種更加簡單實用的方法是:首先將系統的首選DNS服務器修改為42.120.21.30(OpenerDNS項目提供的DNS服務器,可以正確地解析Google的網址),然后通過訪問https://www.google.com網址,就可以以加密的HTTP協議訪問Google,從而避免被防火牆阻攔而實現對Google的正常訪問。