該作品是PDF文件格式請下載 福昕PDF閱讀器
學會一個程式語言,是一回事兒;學會如何以此語言設計并實作出有效的程式,又是一回事兒。C++ 尤其如此,因為它很不尋常地涵蓋了罕見的威力和豐富的表現(xiàn)力,不但建立在一個全功能的傳統(tǒng)語言(C)之上,更提供極為廣泛的物件導向(object-oriented)性質(zhì),以及對templates 和exceptions(異常狀態(tài))的支援。
從C轉(zhuǎn)向C++
對每個人來說,習慣C++需要一些時間,對于已經(jīng)熟悉C的程序員來說,這個過程尤其令人苦惱。因為C是C++的子集,所有的C的技術都可以繼續(xù)使用,但很多用起來又不太合適。例如,C++程序員會認為指針的指針看起來很古怪,他們會問:為什么不用指針的引用來代替呢?C是一種簡單的語言。它真正提供的只有有宏、指針、結(jié)構(gòu)、數(shù)組和函數(shù)。不管什么問題,C都靠宏、指針、結(jié)構(gòu)、數(shù)組和函數(shù)來解決。而C++不是這樣。宏、指針、結(jié)構(gòu)、數(shù)組和函數(shù)當然還存在,此外還有私有和保護型成員、函數(shù)重載、缺省參數(shù)、構(gòu)造和析構(gòu)函數(shù)、自定義操作符、內(nèi)聯(lián)函數(shù)、引用、友元、模板、異常、名字空間,等等。用C++比用C具有更寬廣的空間,因為設計時有更多的選擇可以考慮。
在面對這么多的選擇時,許多C程序員墨守成規(guī),堅持他們的老習慣。一般來說,這也不是什么很大的罪過。但某些C的習慣有悖于C++的精神本質(zhì),他們都在下面的條款進行了闡述。
內(nèi)存管理
c++中涉及到的內(nèi)存的管理問題可以歸結(jié)為兩方面:正確地得到它和有效地使用它。好的程序員會理解這兩個問題為什么要以這樣的順序列出。因為執(zhí)行得再快、體積再小的程序如果它不按你所想象地那樣去執(zhí)行,那也一點用處都沒有!罢_地得到”的意思是正確地調(diào)用內(nèi)存分配和釋放程序;而“有效地使用”是指寫特定版本的內(nèi)存分配和釋放程序。這里,“正確地得到”顯得更重要一些。然而說到正確性,c++其實從c繼承了一個很嚴重的頭疼病,那就是內(nèi)存泄露隱患。虛擬內(nèi)存是個很好的發(fā)明,但虛擬內(nèi)存也是有限的,并不是每個人都可以最先搶到它。
在c中,只要用malloc分配的內(nèi)存沒有用free返回,就會產(chǎn)生內(nèi)存泄露。在c++中,肇事者的名字換成了new和delete,但情況基本上是一樣的。當然,因為有了析構(gòu)函數(shù)的出現(xiàn),情況稍有改善,因為析構(gòu)函數(shù)為所有將被摧毀的對象提供了一個方便的調(diào)用delete的場所。但這同時又帶來了更多的煩惱,因為new和delete是隱式地調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的。而且,因為可以在類內(nèi)和類外自定義new和delete操作符,這又帶來了復雜性,增加了出錯的機會。下面的條款(還有條款m8)將告訴你如何避免產(chǎn)生那些普遍發(fā)生的問題。