有很多朋友是在校的學(xué)生,甚至還有高中生還有研究生,還有沒上過大學(xué)的,還有很低學(xué)歷的。正因如此,我才感受到,教導(dǎo)的有必要性。有些朋友,我也是因為很忙,也就沒有仔細(xì)的去教導(dǎo),雖然給出了一些基礎(chǔ)的建議,其實我更希望能夠掏心掏肺的把我的學(xué)習(xí)經(jīng)驗建議的都告訴他們。如果你要問我為什么要這樣做,我只想給一個理由,那就是,我走了太多的彎路,以至于一路那么艱苦,所以,我盡量使他們不再重蹈覆轍。 (文章略長各位看官請耐觀看)
學(xué)編程最重要的是實踐,就是寫代碼、看別人寫的代碼、再寫代碼,你看再多的書,不寫代碼,你還是不會編程。但是寫代碼也要講究方法循序漸進(jìn),不能剛學(xué)了幾天語法,就想寫個操作系統(tǒng)什么的,樹立這種不切實際的目標(biāo)只會讓你的自信受到嚴(yán)重打擊迷失自我。同時小編推薦一個學(xué)C/C++的學(xué)習(xí)群627819188無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!群內(nèi)有很多干貨和技術(shù)分享!
關(guān)于C++言語的選擇,許多人也會在疑問,C++是否盛行,是否有用,是否一貫?zāi)軌蜓稣踢@一門言語讓自己順風(fēng)順?biāo)?。有些人是渾渾噩噩的就學(xué)了,底子上就是學(xué)校開設(shè)的課程,就這樣稀里糊涂的開始學(xué)了,然后稀里糊涂的結(jié)束了,終究都不知道C++有些什么,不過學(xué)校里學(xué)得C++也確實不夠深入。還有一些人是徜徉在學(xué)與不學(xué)之間,沒有踏出這一步就再考慮未來,是否有些太超前,導(dǎo)致什么都要評估一下,終究什么都學(xué)不出結(jié)果,也學(xué)欠好,終究總結(jié)一個結(jié)論就是,學(xué)的東西沒用。還有一些人就是,知道C++確實挺好的,既能深化底層,又能便當(dāng)開發(fā)高級軟件,是因為C++是面向?qū)ο蠛兔嫦蜻M(jìn)程的綜合體,天然兩者的利益都具有。然后就學(xué)了,學(xué)了點語法,然后學(xué)了面向?qū)ο?,然后學(xué)了點高級點的模板等,然后就覺得學(xué)完了,不知道再繼續(xù)學(xué)什么了。
這些情況,多數(shù)人都有過。也有很人疑問,終究怎樣展開,怎樣學(xué)習(xí)?希望各位可以通過本篇文章找到目標(biāo)和方向,不再和我從前一樣,走太多的彎路,受過太多的折磨。
興趣才是源源不斷的驅(qū)動力,這個由我的經(jīng)歷現(xiàn)已見證了這一實踐,我還會繼續(xù)堅持下去。那些咨詢我的朋友,很多也是應(yīng)為興趣而學(xué)習(xí)的,所以我更是覺得有必要指導(dǎo)。雖然我水平不是很高,但也正是以一個初學(xué)者和入門者以及自學(xué)者的視點,才華讓他們切切實實的得到清楚的方向。那下面就具體說說C++展開方向和學(xué)習(xí)方面,只是建議,給為都應(yīng)該要找到最適合自身情況的方式。
C言語和C++言語的聯(lián)絡(luò),可以參考《C言語和C++言語的聯(lián)絡(luò)對比分析》。下面針對怎樣學(xué)習(xí)C++做些分析和建議。
學(xué)編程與專業(yè)無關(guān),與性別年紀(jì)也沒有關(guān)系,只需你想學(xué),是真的喜歡,就可以學(xué)好。當(dāng)然,為了避免少走彎路,請多學(xué)習(xí)別人的經(jīng)驗和建議,也是讓自己少走彎路的一個正確的做法。還有,也有人問數(shù)學(xué)不好,編程能不能學(xué)好?這個問題其實和學(xué)歷是同一類問題。
只要是正常人,有正常的思維邏輯,都是能夠?qū)W編程的。當(dāng)然,如果是有興趣,則會學(xué)得更好。如果再加上有人教導(dǎo),那就更好了。
為什么說有正常的思維邏輯就能夠?qū)W編程了呢?當(dāng)然,編程的基礎(chǔ)語法,只需你找到一本適合的書,或許有一個好人教導(dǎo)你,這是不成問題的。當(dāng)然,如果暫時都沒有,網(wǎng)上這么多資源,這么多信息,你必定能夠找到你要的信息。
所謂編程,就是編寫一個依照我們思維工作的程序。所以其間心就是,我們的思維。編程的邏輯就是我們的思維邏輯。編程不僅是要從日子中的思維中加以運用,再學(xué)習(xí)別人的履歷時,你還會學(xué)到更多的思維,開闊自己的思維,更好的教導(dǎo)自己的日子。然后進(jìn)一步優(yōu)化自己的編程思維,循環(huán)往復(fù)。
當(dāng)然,這只是一個最基本的條件,光有這些思維,并不能讓自己真的就能成為合格的程序員。否則,全世界的人都是程序員了。但是全世界的人都是有成為程序員的潛力。下一步,我們就是要學(xué)好編程的東西。這樣我們才華實在成為程序員。這個東西就是編程言語。至于什么言語,到了終究其實并不重要,但是為了長遠(yuǎn)的展開,我建議學(xué)習(xí)C++,特別適宜在校學(xué)生。因為在校生能夠運用滿足的時間來學(xué)習(xí)基礎(chǔ)。當(dāng)然如果就業(yè)人員可以花業(yè)余時間來學(xué)習(xí)C++的話也是很不錯的,但是學(xué)編程你就要有耐性不怕吃苦,不然你什么都學(xué)不成。
為什么我建議學(xué)習(xí)C++言語呢?
關(guān)于編程言語本身,要在作業(yè)和往后的展開中,你有必要學(xué)會一些底子的東西。面向進(jìn)程是全部言語的基礎(chǔ),面向?qū)ο笫乾F(xiàn)在開發(fā)的必備基礎(chǔ),而模板和泛型編程,又是許多言語直接或直接完結(jié)的高級東西,Java也用容器,C++的STL中也有容器,其實本質(zhì)就是一個,只不過,Java可能對其進(jìn)行了封裝,供給了更多的特性算了,但是思維和本質(zhì)是一樣的。一同,因為Java對其進(jìn)行了封裝,你要學(xué)會運用它是很簡略的,但是要深化了解就不那么簡略了,因為封裝了,就變得復(fù)雜了。而C++則是直接的顯露,很原始的。只需學(xué)懂了容器,才華實在用好,而Java即使不懂也能用的很好,這也是前面說的Java上手快深化難,而C++則是上手難,深化簡略。容器的本質(zhì)都弄了解了,用法就再簡略不過了,然后學(xué)其他深化的也變得很簡略了。要是再去用Java的容器,直接秒掉。也真是因為C++供給了這么多的特性,作為長遠(yuǎn)的展開,一次性把這些全部學(xué)會,融匯貫通,語言就不是阻止你前行的絆腳石了。再學(xué)其他東西,簡直就不費吹灰之力了。所以,關(guān)于言語,把C++的每個部分學(xué)好,就不要在言語等級上羈絆,那就是要展開到系統(tǒng)等級了。也只需在系統(tǒng)等級知曉,那就是很優(yōu)異的程序員了。當(dāng)然,在各個運用方面,也是成為優(yōu)異的人才的,但是,系統(tǒng)有必要很知曉,否則,總會欠火候。不論什么時分,你編寫的程序,都是在系統(tǒng)工作的,你不可避免這個問題,當(dāng)然在你腦子里工作的程序就不在此議論范圍了。
學(xué)習(xí)C++,如果是初學(xué)者,不論是在校學(xué)生,仍是畢業(yè)了的,仍是低學(xué)歷的,或許沒有讀過書的,也不論是從前學(xué)過的,仍是沒學(xué)過的,或許從前學(xué)過C的,請都仔細(xì)學(xué)習(xí)一遍《C++ Primer Plus》這本書,這本書是針對初學(xué)者的,說明很具體很全面,一步一步的解釋,程序?qū)嵗⒉蛔鰡握{(diào)的數(shù)學(xué)運算,而是日子的小比如,然后增加喜好和下降難度。這本書七百多頁,因為我C言語基礎(chǔ)厚實,也學(xué)過了Java的面向?qū)ο蟮乃季S(最初學(xué)Java就是去學(xué)面向?qū)ο蟮乃季S的),然后花了一個月,把這本書仔細(xì)的學(xué)了,當(dāng)然,面向進(jìn)程部分就許多略過了,和C言語底子一樣,只是參看不一樣的當(dāng)?shù)亍忻恳粋€字都看的很仔細(xì),包括書后的習(xí)題都底子練習(xí)了,作用也正確。不過后邊的高級部分,因為當(dāng)時基礎(chǔ)不可,所以就沒有一個個做了,只是了解其思維。但是,如果沒學(xué)過C言語,也不要緊,那就直接學(xué)習(xí)這本書吧。這本書學(xué)完后,如果要進(jìn)階,能夠?qū)W習(xí)《高效C++》。
當(dāng)然,學(xué)的時分,著手編程是必不可少的,不著手是學(xué)欠好的,書上的練習(xí),盡量都做出來,不要查答案,也不用對答案,你獨立考慮,處理問題了,符合要求,就是答案。編程中沒有標(biāo)準(zhǔn)答案,千萬不要綁縛自己的思維。實在做不出來能夠參看答案和提示,分析好后再根據(jù)思維,重新做,而不是默寫代碼,千萬不要默寫代碼,而是根據(jù)答案中的思維去完結(jié),這樣才華真的學(xué)會著手編程,因為這問題是有朋友問過我的,他說自己對著書寫的出來,不看書就寫不出來,問題就出在這兒,我當(dāng)時沒有仔細(xì)分析,因為沒時間,希望他能看到這個吧。自己根據(jù)思維寫出來了,你就真的掌握了思維的精華,也就能夠活絡(luò)的變通了,而不是像練習(xí)班里讓學(xué)員默寫代碼,那是一種很可笑的做法。但是,要常常寫代碼,把這些思維用熟,讓它成為自己的思維,這樣就成功了。往后就不會沒有思路了,因為思維現(xiàn)已轉(zhuǎn)化為自己的了。
語言方面的學(xué)習(xí)問題都解釋清楚了。下一部分的展開方向就是操作系統(tǒng)。
關(guān)于操作系統(tǒng),先不是編程的問題了,而是操作系統(tǒng)的原理問題。這是程序員有必要掌握的知識。不要覺得這些原理單調(diào),也不要覺得那些思維過期了,書中的思維是沒有過期的,雖然簡略,但是現(xiàn)在的系統(tǒng)都是根據(jù)這些底子思維的。如果這些底子思維都不了解,更甭說去學(xué)習(xí)現(xiàn)在的系統(tǒng)了,那簡直就是噩夢。了解了書中的理論還不可,有必要一同改動自己的思維,以操作系統(tǒng)的工作邏輯來看操作系統(tǒng),而不是依你的思維來看,因為它是現(xiàn)已存在的東西,即使不合理,它也存在,你有必要接受,而不是你覺得應(yīng)該怎樣樣,除非你自己去寫一個操作系統(tǒng),來擬定它的規(guī)則。至于學(xué)習(xí)的書,能夠參看湯子灜的《計算機操作系統(tǒng)》。這是全部操作系統(tǒng)的通用理論。然后你能夠去學(xué)習(xí)《Windows程序設(shè)計》和《Windows中心編程》深化學(xué)習(xí)Windows編程知識,或許學(xué)習(xí)Linux系統(tǒng)等,當(dāng)然,如果真心想深化研討,建議學(xué)習(xí)Linux系統(tǒng),因為它是開源的,你能看到系統(tǒng)全部內(nèi)核的代碼,深化學(xué)習(xí),而Windows是封閉的,你看不到。不過,如果你要在Windows途徑上展開和找作業(yè),那建議學(xué)習(xí)好,學(xué)好后還能夠?qū)Ρ葘W(xué)習(xí)Linux系統(tǒng),更好的了解它,然后更能前進(jìn)操作系統(tǒng)的知識水平,而不限于哪一種操作系統(tǒng)。然后就是各種運用等級的,比如圖形方面的,網(wǎng)絡(luò)通信方面的,等等。但是系統(tǒng)是它們的基礎(chǔ),所以有必要先學(xué)好,才華更好的學(xué)習(xí)它們,當(dāng)然這是建議,能夠根據(jù)自己的情況做調(diào)整。
然后就是最實踐的問題。
學(xué)完了首先是要找工作。C++是一門比較難的語言,不是一瞬間就能學(xué)好的,急于求成只會欲速則不達(dá)。如果花時間學(xué)好了的話自然可以找到一份薪酬不錯的工作。C++方面的工作有很多,但是公司找不到水平高的C++的人才。半吊子是搞不好C++的,所以要學(xué)好,工作是沒問題的,不學(xué)好,也不要說C++沒前途,只能說自己學(xué)的還不夠。至于薪酬的問題,是跟技術(shù)水平成正比的,技術(shù)含量高的,待遇自然好,需求投入的時間和精力就非常多,這個毋庸懷疑。所以,不要懷疑C++找不到工作的問題,只需懷疑自己學(xué)好了沒有的問題。相同也不要懷疑薪酬待遇的問題,只需懷疑自己水平問題。
當(dāng)然,C++基礎(chǔ)學(xué)好了,還是不夠的。它只是一門語言,不要把它想得太崇高了。實在能夠發(fā)揮最好的作用的,仍是要與實際結(jié)合,還有學(xué)會其他的開發(fā),比如結(jié)構(gòu),類庫什么的。初學(xué)者一般都是從事Windows開發(fā),當(dāng)然也有準(zhǔn)備從事Linux開發(fā),關(guān)于服務(wù)器方面的開發(fā),基本上是用Linux了。所以根據(jù)自己的發(fā)展方向,進(jìn)行選擇吧。不論是哪個系統(tǒng),操作系統(tǒng)的基礎(chǔ)理論有必要學(xué)好,因為它是全部現(xiàn)在操作系統(tǒng)的通用理論。然后再深入學(xué)習(xí)。Linux方面的我水平不高,雖然學(xué)過了Linux系統(tǒng),也在自己的電腦裝過Windows/Linux雙系統(tǒng),但是也只是限于Linux系統(tǒng)的運用層面,開發(fā)層面不清楚。學(xué)習(xí)Linux系統(tǒng)的運用。
語言不是問題了,但是在開發(fā)項目時,卻是遠(yuǎn)遠(yuǎn)不可的。開發(fā)項目是要高效率處理問題的。因為公司是盈利的,而且還要最大化盈利,是不允許出現(xiàn)大型紕漏的。鑒于Windows是微軟的操作系統(tǒng)產(chǎn)品,因此,東西最好仍是運用微軟的。因為這樣的話,能夠和系統(tǒng)做到最高效的對接,提高程序效率和兼容問題。MFC覆蓋了編程中全部的方面。當(dāng)然,在這之前,需學(xué)會Windows編程,也就是API編程,因為MFC的功率和有些功用是API的簡略封裝,簡略的意思就是把一個API函數(shù)放在MFC函數(shù)中,將API函數(shù)需求的句柄作為MFC類中的一個成員變量,然后減少了函數(shù)的一個參數(shù)。還有的功用,基本就沒有MFC類或許類成員函數(shù)對應(yīng),因此就有必要運用API函數(shù)來處理。一同MFC是一個類庫,仍是一個程序結(jié)構(gòu)。
所謂的程序結(jié)構(gòu),就是將Windows程序的流程進(jìn)行了封裝,然后在MFC中能夠輕松的編程而不用重視內(nèi)部許多細(xì)節(jié)。有人會說MFC開發(fā)的程序功率很低。說它功率低是因為MFC是一個結(jié)構(gòu)等級的,因此考慮問題都是很高很遠(yuǎn)的,有些方面就要考慮到很全面,就對程序增加了許多一般用不上的東西,導(dǎo)致程序效率過低。之前我也是這么認(rèn)為了的,然后產(chǎn)生了對MFC的小看,信賴從底層開發(fā)更能體現(xiàn)技術(shù)。但是這種主見是差錯的。功率低不低,其實不關(guān)東西的問題,表面上看,確實如此,如果以默許導(dǎo)游配備生成了一個程序,會參與許多不用要的東西,程序效率就變得低了,但是,如果是一個高手,很清楚MFC,每個部分是干什么的摸得一覽無余,試想,編出來的程序效率能低嗎?我想,因為是跟操作系統(tǒng)同源,所以實行功率更高,因為許多東西能夠直接是系統(tǒng)的內(nèi)核的東西,而其他類庫,因為Windows是封閉的,不能夠做到深化內(nèi)核的一些東西,因此就運用用戶態(tài)的東西仿照內(nèi)核的,因此效率也就變低了。就像Java的虛擬機工作程序,如果能在Windows中的程序直接工作,免掉了中心的變換,效率就高了。這兒的議論是很迷糊的,只是告訴我們,真正清楚了,就不存在效率低的問題。所以,希望我們糾正一個思維,東西沒好壞,只需開發(fā)者水平高低的問題,在實踐的開發(fā)中,我們還有必要學(xué)好用好一個或許多個東西,一同還要深化,要知曉。
在學(xué)習(xí)MFC之前,當(dāng)然C++必定是要學(xué)好的,一同Windows API編程也有必要學(xué)好。MFC只需C++才華運用的類庫,有些初學(xué)者還不知道。當(dāng)然這都是建議,必需根據(jù)自身實際情況。當(dāng)然,如果這兩個不先學(xué)好,MFC想要學(xué)好就真難了,MFC就像C++一樣,也是才學(xué)過人的。因為涵蓋了C++、Windows,還有MFC本身的文檔視圖結(jié)構(gòu)和一些其他的機制,直接學(xué)MFC。Windows的學(xué)習(xí),能夠看《Windows程序設(shè)計》,MFC初學(xué)能夠?qū)W《MFC Windows程序設(shè)計》。這些都是適宜初學(xué)者的。MFC的深化能夠?qū)W習(xí)侯捷的《深化淺出MFC》。這些都學(xué)好了,底子的開發(fā)都不成問題了。
要想進(jìn)一步學(xué)習(xí),就要學(xué)習(xí)更多具體領(lǐng)域的開發(fā),就要學(xué)更多的東西了。推薦一下STL(C++的標(biāo)準(zhǔn)模板庫)和Boost庫,這些庫在實踐開發(fā)中常常運用。MFC中有容器庫,比如CArray,它是先于STL出現(xiàn)的,也很好用,想Java的容器運用一樣,很便當(dāng)。但是真要學(xué)好容器,仍是學(xué)習(xí)STL。STL是后來增加到C++的,是一個標(biāo)準(zhǔn)的模板庫,當(dāng)然容器也是標(biāo)準(zhǔn)的,不同的容器有不同的分類,而不是想MFC的容器庫一樣,一個容器類完結(jié)了各種容器,運用方便,但是了解起來就不是那么簡單了。STL中vector和map是不同的容器,用法也不一樣,所以,學(xué)會STL,你就能夠很清楚容器的內(nèi)部原理,運用起來就左右逢源。
容器的內(nèi)部結(jié)構(gòu)就是數(shù)據(jù)安排中的東西,比如樹,鏈表等,正是這些結(jié)構(gòu),才使得容器能夠很簡略完結(jié)了動態(tài)增加,和各種特性。然后STL中的各種算法,當(dāng)然是與容器分隔的,通過適配器將容器和算法連接起來,使算法能夠操作容器,這也就是泛型編程的思維的作用。算法中則是數(shù)據(jù)結(jié)構(gòu)中的算法作為基礎(chǔ),STL側(cè)重功率第一,而這些算法都是世界頂級大師的創(chuàng)造。因為重視功效率,因此在差錯控制上就很少,所以運用時有必要注意,否則出現(xiàn)的差錯你都看不懂。
而STL是根據(jù)模板的,因此,想要學(xué)好STL,C++的模板需求有深化的學(xué)習(xí),還有數(shù)據(jù)結(jié)構(gòu)的知識。當(dāng)然,C++的其他基礎(chǔ)知識也是必要的。數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)嚴(yán)蔚敏的《數(shù)據(jù)結(jié)構(gòu)》。書中說明的很精練,初學(xué)者要準(zhǔn)備學(xué)不止一遍的準(zhǔn)備,兩遍三遍都是很有必要的。即使有人教導(dǎo),即使有教師說明,實在的學(xué)會和領(lǐng)悟到精華,還需求自己深入的了解和實踐,而不是知道了鏈表怎樣增加一個節(jié)點那么簡單。各種算法不是只是了解了就完事了,需求將其間的精華吸收?;蛟S自己最算法再加以改造,進(jìn)一步提升效率。要知道,書中的算法都是人想出來的,千萬不要信賴聲威,要應(yīng)戰(zhàn)聲威。
當(dāng)然,STL只是初學(xué)者加深的一個選擇,建議學(xué)好。即使暫時不學(xué),把MFC中的容器類學(xué)會了,運用上是沒有問題的,想要做到登峰造極,那就有必要學(xué)習(xí)這些東西了。STL就說這么多,然后就是具體的領(lǐng)域的學(xué)習(xí),數(shù)據(jù)庫開發(fā)的學(xué)習(xí),計算機圖形(GDI)開發(fā)、網(wǎng)絡(luò)開發(fā)(Socket編程)等等,這些就根據(jù)公司需求做什么就學(xué)什么。但是最好之前就有些基礎(chǔ)的,而不是什么也不知道。
這些的學(xué)習(xí),首先要學(xué)習(xí)基礎(chǔ)的理論,比如,網(wǎng)絡(luò)開發(fā),TCP/IP協(xié)議都不知道,必定不能開發(fā)一個好的程序的,知道了基礎(chǔ)理論后,再學(xué)習(xí)相應(yīng)的編程開發(fā)知識,用到什么學(xué)什么。此部分說的各個領(lǐng)域的能夠先了解基礎(chǔ),然后再用到再學(xué),但是,前面說的基礎(chǔ),有必要是作業(yè)之前就要掌握,否則,作業(yè)中就有得你受了。不要簡略的信賴別人說什么不要等什么都學(xué)好的再去作業(yè),但是我要告訴你,不要一點基礎(chǔ)都沒有就去就業(yè)。
聯(lián)系客服