談談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語言演算法之遞歸,遞歸其實很簡單
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增加加密貨幣交易