幾分鐘教您玩轉(zhuǎn)C++程序
許多編程人員學(xué)習(xí)C++程序總結(jié)經(jīng)驗(yàn)為,有的覺得C++語言是一門獨(dú)立的語言,并不是在C語言的基礎(chǔ)上,可以直接學(xué)習(xí)C++不必先從C下手,希望通過本文的介紹能給大家?guī)碛杏玫闹R(shí)。
C++是個(gè)強(qiáng)大的語言,可以用于做別的語言做不了的工作。但是,這種強(qiáng)大功能是有代價(jià)的。開始使用C++時(shí),你可能會(huì)遇到內(nèi)存溢出和訪問失效等問題,使程序死機(jī)。這里用最簡(jiǎn)短的篇幅介紹C++語言基礎(chǔ)。C++語言本身有專著介紹,這種書還特別厚,所以別指望我能用三言兩語說清楚。讀者學(xué)完本書并使用C++ Builder一般時(shí)間之后,***對(duì)C++語言再作更深入的了解。
C++可以最充分地利用面向?qū)ο缶幊?OOP)的優(yōu)勢(shì)。OOP不只是一個(gè)新名詞,而有它的實(shí)際意義,可以生成可復(fù)用的對(duì)象。新術(shù)語 對(duì)象(object),和前面介紹的構(gòu)件一樣,是完成特定編程任務(wù)的軟件塊(構(gòu)件是對(duì)象,但對(duì)象不全是構(gòu)件,稍后會(huì)解釋這點(diǎn))。
對(duì)象只向用戶(使用對(duì)象的編程人員)顯示必須的部分,從而簡(jiǎn)化對(duì)象的使用。用戶不必知道的所有內(nèi)部機(jī)制都隱藏在幕后。這一切都包括在面向?qū)ο缶幊痰母拍钪小OP可以用模塊化方法進(jìn)行編程,從而避免每次從頭開始。
C++ Builder程序是面向OOP的,因?yàn)?FONT>C++ Builder大量使用構(gòu)件。生成構(gòu)件后(你生成的或C++ Builder內(nèi)置的構(gòu)件),就可以在任何C++ Builder程序中重復(fù)使用。構(gòu)件還可以擴(kuò)展,通過繼承生成具有新功能的新構(gòu)件。最妙的是,構(gòu)件隱藏了所有內(nèi)容細(xì)節(jié),使編程人員能集中精力充分利用構(gòu)件。
入門簡(jiǎn)介
在C++之前先有C語言,C++是建立在C語言之上的,稱為“帶類的C語言”。這個(gè)C語言基礎(chǔ)在當(dāng)今的C++程序中仍然很重要。C++并不是取代C,而是補(bǔ)充和支持C。本章余下部分和下幾章主要介紹C++中來源于C語言的部分。
實(shí)際上,這里介紹的是C語言,第2課"C++基礎(chǔ)"中才轉(zhuǎn)入C++。讀者不必關(guān)心哪個(gè)來自C,哪個(gè)來自C++,因?yàn)檫@些全在C++中。C++語言很難按順序介紹,因?yàn)槲覀円榻B的所有特性都是交叉的。我準(zhǔn)備的一次介紹一塊,然后拼湊起來。到第3課"高級(jí)C++"結(jié)束,你將對(duì)C++語言有個(gè)完整的了解。一下子沒有掌握某個(gè)概念也沒關(guān)系,有些概念必須經(jīng)過實(shí)踐才能完全了解。
為什么啰嗦這么一大通呢?就是因?yàn)椋恢币詠矸簽E于程序員社群的“語言之爭(zhēng)”,背后真正的原因其實(shí)并不在于語言實(shí)質(zhì)上的優(yōu)劣,而在于觀察者的眼睛。在觀察者的眼睛里面,語言并非一門工具,而是自己花了N多時(shí)間(其中尤數(shù)C++為最)來“修煉”的技能,對(duì)于這樣的技能,被否定無疑等同于自己被否定。
所以,從心理學(xué)上講,語言并不是工具(盡管一直有這么一種呼吁),而是信仰。這樣的信仰在越是花得時(shí)間久的語言上越是激烈。有趣的是,幾乎所有的“熱鬧”的社群都有這樣的現(xiàn)象,Java、Python、Ruby…莫不如是;因?yàn)榫退阏Z言本身不復(fù)雜,程序員仍然還是要投入大量的精力去學(xué)習(xí)各種各樣的框架類庫(想想Java的那些框架?)。因此這些語言社區(qū)的信仰未必不比C++社群的強(qiáng)烈。
然而,一旦弄清我們?yōu)槭裁磿?huì)把語言當(dāng)成信仰,就非常有助于擺脫在看待語言時(shí)的“自我服務(wù)偏見”,從客觀的角度去看待問題。——“當(dāng)你看到的是支持某個(gè)意見的證據(jù)時(shí),試著去想一想有哪些證據(jù)是不支持它的”。
那么為什么要擺脫自我服務(wù)偏見?說小了,是為了成為一個(gè)更優(yōu)秀的程序員(誰也不希望因?yàn)槠姸ナ褂靡婚T低效的語言乃至不妥當(dāng)?shù)恼Z言)。說大了是節(jié)省生命(因?yàn)槠娍赡軐?dǎo)致越陷越深,浪費(fèi)時(shí)間)。 所以,如果你能夠理性的思考我們將要討論的問題,避免自我服務(wù)偏見(就當(dāng)你從來沒有花時(shí)間在C++上一樣)。那么我們便可以開始討論真正的問題了。
現(xiàn)在,幾乎每個(gè)學(xué)習(xí)C++程序的都知道C++的核心問題是其復(fù)雜性;甚至本身不在C++社群的,也知道這是事實(shí)。群眾的眼睛是雪亮的,何況這還是個(gè)太顯而易見的事實(shí)。
但看了無數(shù)篇闡述C++復(fù)雜性的文章,和爭(zhēng)論C++復(fù)雜性的吐沫星子(包括我前段時(shí)間寫的兩篇關(guān)于C++的總結(jié))。我始終都有一個(gè)感覺——沒分析透,就跟盲人摸象一樣。正如“Why C++”的一位讀者批評(píng)的,我在文章里面沒有寫明到底哪些是C++的“非本質(zhì)復(fù)雜性”。
當(dāng)然,我自己憑感覺就能知道,而接觸C++一段時(shí)間的人大致也能知道,但新手乃至非新手則對(duì)我所謂的“非本質(zhì)復(fù)雜性”根本沒有一個(gè)具體的認(rèn)識(shí),這就使得那篇“Why C++”脫離了原本的意圖——面向所有C++使用者和學(xué)習(xí)者。
同樣的原因,在寫了“你應(yīng)當(dāng)如何學(xué)習(xí)C++”一文之后,當(dāng)孟巖先生邀請(qǐng)我給《程序員》寫一個(gè)系列的文章,介紹一下我在接觸C++的過程中的態(tài)度和認(rèn)識(shí)轉(zhuǎn)變時(shí),我雖然非常高興的答應(yīng)了,但直到現(xiàn)在3個(gè)月過去了還是顆粒無收。
為什么?因?yàn)槲矣X得真正本質(zhì)的問題沒有被清晰的觸摸到;所以直到現(xiàn)在我都沒有動(dòng)筆,免得廢話說了一大堆,除了能被當(dāng)成小說讀讀之外,對(duì)真正考慮是否要學(xué)習(xí)乃至使用C++的人未必有什么實(shí)際用處。
然而,這么個(gè)念頭一直都放在潛意識(shí)里面。前一陣子和Bjarne通信,談到了關(guān)于C++復(fù)雜性的一些想法,在郵件里面總結(jié)了一下C++的復(fù)雜性來源,感覺思路清晰了許多。而這篇文章要達(dá)到的目的,正是傳達(dá)對(duì)C++的復(fù)雜性的一個(gè)具體而明確的認(rèn)識(shí),有了這個(gè)認(rèn)識(shí)作為支持,我們便可以推導(dǎo)出學(xué)習(xí)C++的***(實(shí)踐者)的方法。
為什么要學(xué)習(xí)(并使用)C++
顯然,如果找不出要學(xué)習(xí)C++程序的理由,那么談什么“正確的學(xué)習(xí)方法”等于是廢話。
首先重復(fù)一句Bjarne的話:“我們的系統(tǒng)已經(jīng)是極度復(fù)雜的了,為了避開C++的復(fù)雜性而干脆不用C++(Linus的做法),無異于因噎廢食。”在所有可用C和C++的領(lǐng)域,C++都是比C更好的語言。當(dāng)我說“更好的”時(shí)候,我說的是C++擁有比C更安全的類型檢查、更好的抽象機(jī)制、更優(yōu)秀的庫。
當(dāng)然,凡事都有例外,如果你做的項(xiàng)目1)不大。2)編碼中用不到什么抽象機(jī)制,甚至ADT(抽象數(shù)據(jù)類型,例如std::complex這種不含多態(tài)和繼承的)也用不到,RAII也用不到,異常也用不到。3)你連基礎(chǔ)庫(如,簡(jiǎn)化資源管理的智能指針、智能容器)都用不著。
【編輯推薦】