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