|
在一些論壇上經(jīng)常會(huì)看到一些各語(yǔ)言的優(yōu)劣比較,知道自己所學(xué)語(yǔ)言的優(yōu)劣也好,但是如果一味停留在這個(gè)層面就沒有用了。任何語(yǔ)言都只是工具而已。重要的是使用工具的人!就我個(gè)人的經(jīng)驗(yàn)來(lái)講,真正處于業(yè)界搞開發(fā)的人都愿意使用成熟的、為自己所熟知的技術(shù)來(lái)完成工作。而新手都喜歡用一些比較新的技術(shù)來(lái)做開發(fā),而且喜歡追求新奇(從界面很容易看出來(lái),花花綠綠的界面多半出自新手)。其實(shí),安于用一些效率可能低下、擴(kuò)展性和維護(hù)性差的方法來(lái)解決問(wèn)題并不是開發(fā)人員的錯(cuò)。他們只是在完成工作而已。但是作為一個(gè)真正有上進(jìn)心的開發(fā)人員,我們應(yīng)該使用更優(yōu)雅和高效的編程技術(shù),這才是我們逐漸變成編程“大牛”的好習(xí)慣。老是停留在原地,很容易被淘汰的。在軟件開發(fā)這個(gè)行當(dāng),尤其如此。無(wú)論是對(duì)學(xué)生,還是一線開發(fā)人員,我覺得都不應(yīng)該產(chǎn)生“書讀夠了”的感嘆!我有時(shí)候喜歡將以前看過(guò)的書翻出來(lái)再看,每次總能體會(huì)到一些新東西。有關(guān)C++語(yǔ)言的書籍更是如此,而且我覺得我所起的題目不是很好。為什么?因?yàn)槲矣X得學(xué)習(xí)語(yǔ)言還只是新手跨入軟件開發(fā)“地獄”的第一步,單單學(xué)習(xí)語(yǔ)言本身是遠(yuǎn)遠(yuǎn)不夠的,還要學(xué)習(xí)相關(guān)的程序庫(kù)(C++當(dāng)然首選是先學(xué)習(xí)C++標(biāo)準(zhǔn)程序庫(kù))、相關(guān)的平臺(tái)技術(shù)(如.NET),說(shuō)得更遠(yuǎn)一點(diǎn),還要鍛煉對(duì)目標(biāo)問(wèn)題的分析、歸納能力等等。工作之前,技術(shù)路線自己作主,工作之后,絕大多數(shù)程序員將被公司技術(shù)路線左右。所以,趁現(xiàn)在還有時(shí)間,可以學(xué)一些自己感興趣的。如果想搞軟件開發(fā),特別是電力系統(tǒng)軟件的開發(fā),學(xué)好C++不會(huì)令我們失望。當(dāng)我們進(jìn)入C++的前門,然后經(jīng)過(guò)一段黑暗之路,再?gòu)暮箝T出來(lái)到達(dá)光明頂后,我們會(huì)體味到“一覽眾山小”的感覺。
推薦書籍:
《編程高手箴言》---------- 梁肇新(用過(guò)超級(jí)解霸的都應(yīng)該知道吧,^_^)寫的第一本書,其中有幾章還是值得一讀的。在這本書中,梁告訴我們,學(xué)東西要耐心,要耐得住“寂寞”,走自己的路,讓別人去“說(shuō)”吧!
最近比較忙,原來(lái)打算緊扣主題講講一些具體的C++語(yǔ)言的細(xì)節(jié)的,但還是抽不出大段的時(shí)間了。所以,現(xiàn)在只能再漫談一些關(guān)于C++的故事了。
C++源于C語(yǔ)言,還記得很久以前學(xué)習(xí)C語(yǔ)言的時(shí)光(那是一段快樂(lè)而充實(shí)的時(shí)光),可是現(xiàn)在學(xué)習(xí)C++,并不是在C的基礎(chǔ)上加上了類而已,如果這樣認(rèn)為,我們是耍不好C++的。因此,C++絕不是C的升級(jí)或擴(kuò)充,我們應(yīng)該把C++當(dāng)作一門新語(yǔ)言來(lái)學(xué)習(xí)(C++之父Bjarne Stroustrup語(yǔ))。 寫程序首先希望是程序能正確執(zhí)行,其次是效率能夠被接受,再次就是易于維護(hù)。C++是一個(gè)難學(xué)易用的語(yǔ)言。C++提供了太多可選擇的東西,而且使用使用C++來(lái)寫程序可以有四種思考模式:基于過(guò)程、基于對(duì)象、面向?qū)ο蠛头盒汀N覀兪褂靡环N語(yǔ)言來(lái)寫程序,并不意味著就是使用語(yǔ)言本身,換句話說(shuō),我們更多的時(shí)候是使用程序庫(kù)在寫程序。比如MFC、STL、ATL、VCL等等。其中要使用C++來(lái)寫出結(jié)構(gòu)優(yōu)美、性能卓越、代碼簡(jiǎn)潔、易于維護(hù)的代碼,首推C++標(biāo)準(zhǔn)程序庫(kù)。STL對(duì)效率做了嚴(yán)格的要求,而且使用STL寫出來(lái)的程序簡(jiǎn)潔美觀(前段時(shí)間我特意貼了一個(gè)要求對(duì)若干整數(shù)進(jìn)行排序的帖子,其實(shí)目的就是用來(lái)展示STL的簡(jiǎn)潔優(yōu)雅)。一旦習(xí)慣使用泛型思維來(lái)考慮問(wèn)題,我們能夠充分體會(huì)到模板帶來(lái)的美!對(duì)于數(shù)值計(jì)算來(lái)說(shuō),C++標(biāo)準(zhǔn)程序庫(kù)可以充分滿足現(xiàn)代化服務(wù)和商業(yè)計(jì)算對(duì)數(shù)據(jù)、信息的即時(shí)回應(yīng)的要求。
我覺得學(xué)好一門語(yǔ)言最重要的就是實(shí)踐。也就是多“寫”!“工程經(jīng)驗(yàn)之積累”對(duì)已具有一段開發(fā)時(shí)間的程序員而言,非常重要!只有在不斷的積累中,我們才能漸漸體會(huì)到C++語(yǔ)言中的一些背后的東西。對(duì)于這點(diǎn),沒有大量程序代碼寫作經(jīng)驗(yàn)的菜鳥,也可以借助《Effective C++》先攢一些經(jīng)驗(yàn)值。《Effective C++》是一本好書!。Meyers的書絕對(duì)值得一讀,Meyers可以說(shuō)當(dāng)今C++社群中數(shù)一數(shù)二的技術(shù)專家。
推薦網(wǎng)站:www.royaloo.com
C++提供了操作符new來(lái)在堆上分配內(nèi)存,操作符delete來(lái)釋放內(nèi)存。有些情況下,我們需要對(duì)內(nèi)存的分配和釋放進(jìn)行更好的控制。許多程序創(chuàng)建和釋放一些重要類的大量的對(duì)象,如tree nodes,linked lists links,points,lines,messages,etc.使用通用的內(nèi)存分配器如new和delete來(lái)進(jìn)行這些對(duì)象的分配和釋放有時(shí)將支配程序的運(yùn)行時(shí)間和內(nèi)存需求。
兩方面的因素:通用內(nèi)存分配操作的運(yùn)行和空間的耗費(fèi)以及不同對(duì)象大小引起的內(nèi)存碎片。類使用定制的內(nèi)存分配器將加快模擬器、編譯器和類似程序的執(zhí)行速度。
例外一種需要更好的內(nèi)存控制的情況是:需要在有限資源的情況下長(zhǎng)時(shí)間不間斷運(yùn)行的程序。實(shí)時(shí)系統(tǒng)經(jīng)常需要用最少的耗費(fèi)來(lái)獲取有保證的可預(yù)期的內(nèi)存。這也就導(dǎo)致了更好的內(nèi)存控制的需要。一般來(lái)說(shuō),這些程序都避免使用動(dòng)態(tài)的內(nèi)存分配,而使用特殊目的的內(nèi)存分配器來(lái)管理有限資源。
此外,還有一些情況下由于硬件或系統(tǒng)的要求,需要將對(duì)象放在指定的內(nèi)存位置。這也需要進(jìn)行定制的內(nèi)存管理(通過(guò)重載new來(lái)加以實(shí)現(xiàn))。 在C++ Release 2.0中,為了滿足以上需求,內(nèi)存管理機(jī)制做了相應(yīng)的修改。主要是引進(jìn)了operator new [] 和 operator delete []。
new操作符的作用范圍(Scope for operator new Functions)
操作符(Operator) 范圍(Scope)
::operator new Global
class-name::operator new Class
operator new的第一個(gè)參數(shù)必須是類型size_t(在STDDEF.H中定義的類型),返回類型
為void *。
當(dāng)分配內(nèi)建(built-in)類型的對(duì)象、未包含用戶自定義的new操作符函數(shù)的類對(duì)象、任何類型的數(shù)組時(shí),使用全局new操作符函數(shù)。當(dāng)在類中自定義new操作符時(shí),分配該類對(duì)象的內(nèi)存時(shí),調(diào)用該類的new操作符。如下:
#include #include class Blanks { public: Blanks(){} void *operator new( size_t stAllocateBlock, char chInit ); }; void *Blanks::operator new( size_t stAllocateBlock, char chInit ) { void *pvTemp = malloc( stAllocateBlock ); if( pvTemp != 0 ) memset( pvTemp, chInit, stAllocateBlock ); return pvTemp; } int main() { Blanks *a5 = new( 0xa5 ) Blanks;//創(chuàng)建對(duì)象Blanks,并且初試化為0xa5 return a5 != 0; } new操作符可以重載,而delete卻不行。因?yàn)榈鹊叫枰尫诺臅r(shí)候,我們所能得到的就是一個(gè)指針。而且該指針可能不是原先的對(duì)象類型指針(有可能進(jìn)行了類型轉(zhuǎn)換)。實(shí)際上,當(dāng)使用new獲得一個(gè)指向一片內(nèi)存的指針時(shí),在該片內(nèi)存前有一個(gè)指示器(indicator),記錄實(shí)際分配的內(nèi)存數(shù)量。當(dāng)調(diào)用delete時(shí),可以獲知需要釋放的內(nèi)存大小。數(shù)組的釋放(Deallocating Arrays):
void f( ) { X* p1 = new X[10]; //... delete [] X; }
為什么不使用delete [10] X;來(lái)釋放內(nèi)存?Bjarne Stroustrup稱這種做法容易導(dǎo)致錯(cuò)
誤,而將記錄元素個(gè)數(shù)的任務(wù)放在delete的實(shí)現(xiàn)中了。
至于為什么C++中未內(nèi)建垃圾收集器(Garbage Collection)的原因,看《C++語(yǔ)言的設(shè)計(jì)和演化》(En) Bjarne Stroustrup 機(jī)械工業(yè)出版社(俗稱:D&E)可以得到答案。
此外,C++標(biāo)準(zhǔn)庫(kù)中提供了一種智能型指針auto_ptr,這種指針可以幫助我們防止“被異常拋出時(shí)發(fā)生資源泄漏”。但是缺點(diǎn)是該智能型指針不能指向數(shù)組,因?yàn)槠鋬?nèi)部釋放內(nèi)存是通過(guò)delete而非delete [] 來(lái)進(jìn)行的。所以,只能使用其來(lái)指向一個(gè)單個(gè)對(duì)象。
模板部分是C++中比較難的部分,也是C++的魅力所在。以下文字是我以前看過(guò)的,具體出處不清楚了。今天稍微整理了一下,作為模板介紹的一個(gè)單元。
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!