當前位置:
首頁 > 知識 > 談談C語言C加加學習的經驗

談談C語言C加加學習的經驗

十幾年前,剛開始學習C++時,一開始狂啃了不少經典的C++書籍:《C++ Primer》,《C++標準程序庫》,《Effective C++》等等的小十本書,花費的時間和精力甚多,然而回想起來,C++語言的學習,在當時並沒有一個人去指導我應該怎麼學,應該學什麼。到了十幾年後的今天,看起來C++的這個問題仍然沒有太多的改變,於是萌生了寫這篇文章的想法。

在我看來,C++學習最大的問題在於:C++里提供太多的開發範式,可是缺少實踐指南。用知乎網友空明流轉的話說:

開發範式多

抽象層次多

最佳實踐多

非最佳實踐隱患多

比如C++中的繼承,除了一般的繼承之外,還提供了protected繼承、private繼承、虛擬繼承等等,很遺憾其中的大部分都是很少使用的。

再比如C++中的模板,在我看到的大部分公司里跑的項目,外面開源的成功項目,只需要掌握到類似STL這樣的最簡單的模板就已經足夠,但是很遺憾,光是模板這個知識點,C++就有很多本相關的書籍來講述,如果深入進去真不是一時半會兒能夠爬的出來的。模板玩多了還會走火入魔,寫出模板滿天飛的代碼來變成了炫技,可是在真正的項目合作中,需要考慮的是你的代碼的可維護性。

再舉例子來說明「非最佳實踐隱患多」這個觀點。在Google的C++編程規範裡面,提到了一條**使用explicit修飾那些僅有一個參數的構造函數,避免隱式轉換的發生**就是一個例子。比如這種情況下:

#include

class Test {

public:

Test(int i) {

printf("in test
");

}

};

void f(Test t) {

}

int main() {

f(1);

return 0;

}

在上面的代碼中,函數f的參數是Test類,這個類有一個構造函數是傳入int參數,所以當你調用f(1)時,這裡面發生了一個使用int參數生成Test類對象的隱式轉換。隱式轉換之所以危害大,是因為其中的行為太難去發現,所以在Google的C++規範中提到了很多避免這些隱式轉換的做法,在Google的人看來,一個程序的行為應該是明確的顯著的,不能偷偷摸摸的做一些事情給查找問題帶來困難。

可是很遺憾,類似的實踐指南真的很少,一般的C++語法書,只會告訴你這樣那樣的語法特性,沒有告訴你這些語法特性會帶來哪些可能的問題。

以上可以看到,C++提供的需要語法特性,在實踐中用到的只是其中的一小部分,而且這些語法特性中的很多坑沒有人提示你是不是該繞過,此時就需要一個更加實踐一些的學習指南,列舉出哪些是你應該學習的C++了。

下面來說說就我看到的國內公司C++項目組使用到的C++特性,也就是說我認為如果能熟練掌握了這些是足以勝任這些工作的:

基本的語句、表達式、函數、名字空間等,這些當然是繞不過的了。

基本的面向對象、繼承的概念,得知道什麼是覆蓋、重載、虛擬基類、虛擬函數。

STL的概念和使用,包括幾種iterator的概念,基本的演算法,需要熟練至少幾個最常見容器如list、map、vector、set的使用。

不需要去跟進到C++11這些更新的C++規範的語言特性,目前在國內大部分的C++崗位,C++98的標準就足以勝任。

簡單一點的理解,以上的知識點大概就是C + 最基本的Class + STL

另外,每個語言的初學者當然也包括C++初學者,都會有一個誤區:為了學語言而去學語言。這個誤區導致了以下幾個問題:

不是目標導向的,他們在學這門語言之前並不知道自己確切的目的是想用來做什麼,只是為了學而去學。

濫用語言特性,既然學了這個語言的這些特性,總想著要用上,後面更是變成了純粹的炫技。

我的建議是,學習一門語言,應該是業務方嚮導向的,比如你想使用這門語言用來開發遊戲,做客戶端軟體還是用來寫伺服器。有了具體的方向,再具體來看圍繞著這個方向展開學習具體的知識點,這其中語言的學習只是其中的一個部分。

說了前面的話,現在來總結一下我個人認為比較實用的C++學習路線:

選一本不那麼厚的C++語法書,大概300頁左右,要求把C++中最重要常用的知識點在這本書里都講到,目的在於能夠快速的對這麼語言有一個大體的了解。在我看過的C++書籍中,《Essential C++》個人認為是最符合這個條件的。學習一門知識時,能在剛開始快速掌握其中最常用的大部分知識點是很重要的,如果這個過程太長,人容易疲勞學習的熱情被消磨,也找不到重點。我以前就是犯了類似的錯誤,當年花了一年多來啃那本大部頭的《C++ Primer》。

看《Effective C++》,這本書是講訴C++最佳實踐的書籍中最好的一本,把裡面的每一個item都搞懂,不懂就查閱相關的資料去學習,以這裡面提到的item來驅動你在前面基本的語言了解之後再深入一些的學習C++知識,重要的是這本書里講到的點都是很實際用到的知識點和坑。

有了前面兩個基礎,基本的語法、坑、實踐指導都有大體的了解了,可以開始根據想做的業務方向去選擇那個方向相關的優秀開源項目,以項目方向和代碼閱讀來驅動學習了。

這裡還需要提到另一個資料,Google的C++編程規範,一般的編程規範基本都是在說變數的命名,文件的組織這些,Google的這個規範是一份工業項目的實踐指南,裡面提到了很多C++項目應該怎麼做和不應該怎麼做,看過的幾份Google的開源C++項目,如Leveldb、Tcmalloc、glog都是按照這份指南來實踐的,如果有機會對照著看效果會更好。

當然,這上面只是最簡單精鍊的入門指導,書也只推薦了兩本,如果需要更深入當然還是需要繼續看其他的資料的,只是我認為有了以上的準備就可以去接觸實際具體的項目了,而不用繼續在一堆C++理論書中埋頭了。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 C加加 的精彩文章:

循環隊列C語言實現數據結構
c語言排序演算法之快速排序,輕鬆掌握快排
C語言編程,首先你得懂這些!虛擬機及配置環境篇
C語言編程——模擬系統刪除文件
c語言演算法之遞歸,遞歸其實很簡單

TAG:C加加 |

您可能感興趣

從C語言實戰談C語言編程,談談C/C加加今後發展!
C語言/C加加編程學習—代碼訓練之神奇星空動態繼承
C語言/C加加編程學習—坦克大戰小遊戲製作代碼
C/C加加新手應該怎麼學習,如何學習才有發展
C語言/C加加編程學習,怎樣判斷某一文件是否存在
C語言/C加加編程嵌入式基礎學習之volatile關鍵字
中軟國際哈爾濱ETC:C語言和C加加 哪個效率更高
C語言C加加編程快速入門系列
C/C加加高級講師多年經驗總結學習路線,希望幫到正迷茫的你
三所俄羅斯大學將增加加密貨幣課程和學位
寄語加加·養成良好的生活習慣
有哪些適合新手練手的C/C加加項目
C加加 大神 John Carmack 的編程傳說
C/C加加大神 編寫聊天機器人 試試手
無處不在的加加林:俄羅斯有個加加林市,還有加加林街
新功能:Android P將增加加密DNS連接
生活很無趣?聯想Lecoo三寶來幫你的生活加加料
Sa花油麵膜|PICK對面膜,為你的夏日魅力加加分
永遠的英雄——加加林
英國匯款服務平台TransferGo增加加密貨幣交易