小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

學(xué)習(xí)經(jīng)驗(yàn) | C++的學(xué)習(xí)之路

 深藍(lán)學(xué)院 2022-09-08 發(fā)布于北京

在談如何學(xué)習(xí)C++之前,我想先簡單聊一下C++是一個(gè)什么樣的語言。

C++無疑是一個(gè)公認(rèn)的比較難上手、難精通的語言,C++賦予了程序員極高的自由度,同時(shí)也包括了幾乎所有的編程范式,這使得程序員可以自由地操作計(jì)算機(jī)的內(nèi)存,在代碼里嵌入?yún)R編,設(shè)計(jì)復(fù)雜的繼承關(guān)系、控制編譯器完成一些運(yùn)算~~(甚至可以控制編譯狀態(tài)來達(dá)成某些魔法)~~

這往往要求C++程序員要有扎實(shí)的語言基礎(chǔ),還要有一定的計(jì)算機(jī)原理相關(guān)的知識,否則當(dāng)我們深入C++時(shí),就會發(fā)現(xiàn)C++時(shí)時(shí)刻刻都在懲罰我們薄弱的基礎(chǔ)和對底層的無知,所以在學(xué)習(xí)C++的過程中,最重要的就是一定要徹底搞懂學(xué)到的語法和其背后的原理。

當(dāng)然過分深挖語言細(xì)節(jié)可能會導(dǎo)致初學(xué)者在最開始遇到過多的概念,所以在學(xué)習(xí)初期一個(gè)好的檢驗(yàn)方法是判斷自己對這些概念的理解是否可以自圓其說,即便理解不到位也不要緊,隨著對C++的持續(xù)學(xué)習(xí),之前不正確的理解必然會被慢慢糾正。


在初學(xué)時(shí)最好先選定一個(gè)小的學(xué)習(xí)范圍

總體來看,C++包括了四大塊內(nèi)容:

  • 面向過程的類C語言的部分

  • 以類為核心的面向?qū)ο蟛糠?/span>

  • 面向編譯器編程的模板部分

  • C++標(biāo)準(zhǔn)庫

初學(xué)者往往會對這些豐富的功能感到無所適從,并且可能會遇到一些自己無法解決的bug,C++的學(xué)習(xí)還沒開始就已放棄……

C++保證了零成本抽象,這意味著沒有使用到的特性不會產(chǎn)生開銷,這也意味著如果你不用那些高級的功能,那么你就可以當(dāng)他們不存在。所以劃定一個(gè)小的學(xué)習(xí)范圍開始接觸C++,這是一個(gè)比較好的學(xué)習(xí)策略,可以相對容易的完成學(xué)習(xí)目標(biāo),并且避免使用過多不了解的語法,而導(dǎo)致出現(xiàn)一些復(fù)雜的問題。

如果你有C語言的基礎(chǔ),那么可以把主要精力放在C++面向?qū)ο蟛糠值膶W(xué)習(xí);如果你剛開始接觸程序設(shè)計(jì),那么我覺得先學(xué)C語言可能更加合適。C++和C的關(guān)系非常密切,并且C++的面向過程部分和C語言基本一致,從C開始,可以幫助你暫時(shí)避開C++本身的復(fù)雜性來學(xué)習(xí)C++面向過程的部分。

2寫代碼

編程最重要的就是要實(shí)際去寫代碼,不要紙上談兵,我不認(rèn)為有人可以只通過看書學(xué)會任何一門語言。在某種意義上,我覺得寫代碼要比看書重要得多,一個(gè)比較高效的學(xué)習(xí)過程,應(yīng)該是先通過看書了解基本用法后,立刻去寫代碼。在寫代碼的時(shí)候遇到問題,或者想要使用別的用法的時(shí)候,再去看書上的相關(guān)內(nèi)容,效果會好很多。如果你只是單純的看了一遍書,那大概看完后你對很多用法依舊很模糊。

另外一點(diǎn)是如果你希望你的C++能力逐步提高,就一定要去主動(dòng)使用自己不會的用法,切勿一直呆在舒適圈內(nèi)。在大多數(shù)人的印象中C++是一門面向?qū)ο蟮木幊陶Z言,面向?qū)ο笃鋵?shí)是指一種程序設(shè)計(jì)的方法,也并非C++獨(dú)有概念。如果你的C語言基礎(chǔ)比較扎實(shí),你也可以用C語言設(shè)計(jì)出面向?qū)ο蟮某绦?,只不過用起來要繁瑣一些。

在學(xué)習(xí)面向?qū)ο蟛糠值闹R時(shí),首先要保證的一點(diǎn)是,你確實(shí)具備了面向?qū)ο蟮木幊趟枷?。想要達(dá)到這一目的,你的思考方向應(yīng)該主要放在如何使用面向?qū)ο蠹夹g(shù)來組織具有一定體量的代碼,并且要去體會面向?qū)ο髱淼暮锰?,這樣才能夠真正學(xué)懂面向?qū)ο笳Z言。

因?yàn)槊嫦驅(qū)ο蟛⒎鞘荂++獨(dú)有的功能,目前大部分的高級語言都是支持面向?qū)ο蟮?,所以其?shí)面向?qū)ο蟮拇蟛糠指拍疃际窍嗤摹++提供的面向?qū)ο蟮墓δ苤?。比較難理解的應(yīng)該就是虛函數(shù)和多繼承,前者可能需要多花一些時(shí)間來徹底搞懂,畢竟這是一個(gè)經(jīng)常會使用到的功能;至于多繼承不了解的話也沒什么影響,實(shí)際很少用到,如果你具有其它面向?qū)ο笳Z言的編程經(jīng)驗(yàn),那么學(xué)習(xí)此部分應(yīng)該不算是一件很難的事情。

大多數(shù)的C++程序員,對于C++的掌握會止步于面向?qū)ο?,通常來說掌握這些已經(jīng)足夠應(yīng)付日常工作了。

但是如果我們?nèi)ビ^察一下從C++03到C++20之間的功能變化,你就會發(fā)現(xiàn)C++一直在完善和強(qiáng)化模板相關(guān)的功能,這說明模板是C++的重要組成部分,也恰恰是模板使得C++成為了一門難學(xué)難精通的語言。

在學(xué)習(xí)模板之前,我們需要明確一個(gè)極其重要的概念,就是編譯期和運(yùn)行期,顧名思義編譯期就是指程序編譯的時(shí)候,運(yùn)行期也是同理。我們一般理解的編譯其實(shí)就是將我們的代碼轉(zhuǎn)換為匯編代碼的過程,但C++可以在編譯的時(shí)候做更多事情,而這些事情大多就是通過模板來完成的??梢哉f模板就是C++編譯期和運(yùn)行期的分割線,在學(xué)習(xí)C++模板時(shí)我們一定要搞明白哪些是在編譯期做的,哪些運(yùn)行期完成的,這對于模板的學(xué)習(xí)至關(guān)重要。

3學(xué)習(xí)模板相關(guān)知識

接下來我想著重說明一下模板解決了什么樣的問題

我們首先考慮在函數(shù)接口設(shè)計(jì)時(shí),需要兼容不同類型數(shù)據(jù)輸入的情況,而且對于這些數(shù)據(jù)類型具有相同的處理方法。在這種情況下如果不使用模板,那么你需要為每一種類型設(shè)計(jì)專門的重載函數(shù),這就造成了大量的代碼復(fù)制,降低了代碼的可維護(hù)性。而如果你使用模板就可以一勞永逸的解決這件事情。這樣的用法稱作“模板泛型編程”,主要解決接口兼容性問題。

當(dāng)然我們也可能會遇到另一種情況,假設(shè)你現(xiàn)在需要用一個(gè)變量表示一張600*400的RGB圖片數(shù)組的長度(你可以100%確定圖片的尺寸無論在現(xiàn)在還是未來都不會改變),那么你大概率會寫成 `int length = 600*400*3` 而不會寫成 `int length = 760000` 這兩種寫法會產(chǎn)生同樣的用匯編代碼,這也就是說 `600*400*3` 的運(yùn)算在編譯期已經(jīng)計(jì)算出來了,這可以認(rèn)為是模板元編程的一個(gè)啟蒙思想,只是在元編程中問題不再是簡單的幾個(gè)整數(shù)相乘,它可能是計(jì)算幾個(gè)矩陣相乘的結(jié)果也可能會帶有判斷邏輯,可以看出元編程主要解決的是在不降低程序運(yùn)行性能的同時(shí),還提高代碼的靈活性和可維護(hù)性。

希望通過上面的例子能夠讓你明白模板的作用,模板相關(guān)的概念往往都比較難以理解,所以如果你還不熟悉面向?qū)ο蟛糠值闹R,那么最好就當(dāng)模板不存在,或者簡單的將模板理解為一個(gè)特殊的宏。

如果你已經(jīng)對C++有了一定了解,那么就可以考慮開始學(xué)習(xí)模板相關(guān)的知識了。學(xué)好模板很重要的一點(diǎn)是熟悉C++的類型系統(tǒng),因?yàn)樵诜盒湍0逯?,更多的是對類型的操作。如果對于類型系統(tǒng)不夠熟悉就可能會寫出很多bug,并且自己也很難找到問題根源在哪。

從個(gè)人的感覺來說,通過對模板的學(xué)習(xí)會讓你更加深刻的理解C++的類型系統(tǒng)。從模板開始你將會接觸到大量的C++語言概念,并且這些概念都是十分重要的,這與面向?qū)ο蟛糠值膶W(xué)習(xí)有很大的不同。

在模板的學(xué)習(xí)中,經(jīng)常出現(xiàn)的那些關(guān)鍵概念和關(guān)鍵名詞是必須要去搞清楚意思的(這些概念和名詞往往是來自C++標(biāo)準(zhǔn)本身),你需要多去網(wǎng)上查閱資料或仔細(xì)研讀書上的例題,并且要多加練習(xí),有必要的話還要設(shè)計(jì)一些實(shí)驗(yàn)程序來驗(yàn)證自己的理解。如果你覺得這一部分確實(shí)學(xué)起來非常困難,那大概是你前期的基礎(chǔ)沒有打好,或者是你確實(shí)缺少使用場景,這時(shí)你應(yīng)該暫停模板的學(xué)習(xí),去好好鞏固基礎(chǔ),或者等到有使用場景的時(shí)候再來學(xué)習(xí)模板部分。

4C++的標(biāo)準(zhǔn)庫

最后就是C++的標(biāo)準(zhǔn)庫,標(biāo)準(zhǔn)庫提供了很多好用的工具,可以幫助我們減少“造輪子”的時(shí)間??傮w來說,標(biāo)準(zhǔn)庫的使用方法學(xué)習(xí)起來還是比較容易的,在學(xué)習(xí)時(shí)主要關(guān)注容器和迭代器還有泛型算法的用法即可。這一部分網(wǎng)上的資料是比較豐富的,無論是用法還是內(nèi)部實(shí)現(xiàn)原理都有詳細(xì)的講解,此處就不再展開說明了。

5通過開源代碼學(xué)習(xí)C++

最后想說一下如何通過開源代碼來學(xué)習(xí)C++。如果你之前在GitHub上查找過開源項(xiàng)目,不難發(fā)現(xiàn),大部分的項(xiàng)目都大量使用了模板,更是有很多的純模板庫。所以對于C++而言,我不太推薦在沒有模板基礎(chǔ)的情況下去看開源項(xiàng)目,除非你確實(shí)找到了一個(gè)感興趣并且沒有使用模板的項(xiàng)目(一般這種項(xiàng)目都是比較老的項(xiàng)目,語言標(biāo)準(zhǔn)一般是C++98/03),但這也并不是說只有對模板有較深的理解,才能去看開源項(xiàng)目學(xué)習(xí)。

實(shí)際上你只要知道模板的一些基本語法和特性,就可以去嘗試閱讀開源項(xiàng)目。我比較推薦的是一些比較短的僅頭文件的模板庫(如果你不想看到過多的新特性,最好選語言標(biāo)準(zhǔn)為C++11的庫),通常來說這樣的項(xiàng)目比較適合初學(xué)者,讀起來也比較有成就感,通過學(xué)習(xí)開源項(xiàng)目會極大的提高你對C++的理解,但是選擇適合自己的才是最重要的。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多