根據InfoQ 程式語言 2 月排行榜,統計發現,學習門檻最高的程式語言是 C++。那麼如何學好這門又難、門檻又高的語言呢?
前面我們介紹過C++。
C++是一種面向物件的計算機程式設計語言,由美國AT&T貝爾實驗室的本賈尼·斯特勞斯特盧普博士在20世紀80年代初期發明並實現,最初它被稱作“C with Classes”(包含類的C語言)。它是一種靜態資料型別檢查的、支援
多重
程式設計正規化的通用程式設計語言,支援過程化程式設計、資料抽象、面向物件程式設計、泛型程式設計等多種程式設計風格。
C++是C語言的繼承,進一步擴充和完善了C語言,成為一種面向物件的程式設計語言。
C++以其複雜的語法、指標、記憶體管理、泛型程式設計等特性難倒了一大批IT學子。小編以CSharp入門,中途轉C++的時候痛苦過一段時間,不過隨著業務能力的精進,已經逐漸愛上這門功能強大、靈活的語言了。
下面就分享一下學習經驗:
關於如何學習C++,這個問題光嘴講是沒用的,還是需要自己動眼、動手、動腦。總結下來就無非這三個步驟:
1。學
學,不管是看書、看影片、還是參參加培訓都可以,至少要系統化且持續性地去學習這門語言。個人建議如果有條件參加培訓是最好的,如果沒有可以看影片學習。但是不管是哪種方式,我都推薦大家一定要看書,跟著書本學習。不管你是培訓還是看影片,思路都是跟著別人走的,只有看書才會有自己的理解,才更深刻。
2。抄
抄,此處意為對著教程上的程式碼抄或者半key半抄,至少要將專案透過自己的手實現,並且能正常執行。這個過程是十分痛苦的。很多人可能在學知識的時候覺得自己都會,但是一到自己key的時候就捉襟見肘了,甚至對著抄debug時仍是一大堆錯誤,這段時間是懷疑人生的時間,一定要堅持、堅持、再堅持。
比如最簡單的helloword、檔案讀取、標準流輸入輸出等
int main()
{
printf(“hello word”) ;
cout<<“hello word”;
int a ; cin>>a
}
3。寫
等熟練到一定程度,就需要自己是獨立實現一個小功能或者開發一個小專案了,這中間一定會遇到很多問題,可以查資料、查教材、諮詢其他人等。等你能獨立實現自己想實現的功能的時候,那麼恭喜你已經入門了,後面會越來越順利。
下面總結一些C++學習的難點
指標
關於指標已經講過很多次了。理解指標你需要先理解計算機記憶體和記憶體地址概念,還有*和&運算子。
比喻式理解:
記憶體可以理解為土地,記憶體地址理解為土地編號,當我們的程式在建立變數和物件時,計算機會充當規劃局的角色為變數和物件劃分一塊有編號的土地存放變數和物件,這就叫記憶體,而編號就叫記憶體地址。土地有使用期限(70年),期限後收回,計算機中變數和物件釋放時也會釋放記憶體被回收。
指標:指標本身也是一個變數,類似int或者float型別,只不過int存放的是10、146等這樣的整型資料,而指標變數存放的是記憶體的地址。
*運算子:取記憶體地址上所存物件。
&運算子:取物件所在記憶體的地址。
指標指向:我們常說的某某指標指向誰,意思是,這個指標變數存放著那個物件在計算機記憶體中的地址。
泛型程式設計
C++的泛型是基於模板實現的。不管是類模板或是函式模板,都不是真正的類或函式,只是一個編譯器用來生成程式碼的藍圖。
為什麼需要泛型程式設計呢?
最簡單的一個例子,假設你實現了一個連結串列的類,可以用來動態儲存int型資料。但是現在又有一個需求是動態儲存string型別的資料,這時候你怎麼辦呢?重新為儲存string資料的連結串列單再實現一個類?這顯然是不符合程式碼重用性原則的,這時候你可能會想到能不能將資料型別用引數的方式傳進去。這就是C++泛型程式設計的由來;
函式模板
資料的型別也可以透過引數來傳遞,若在函式定義時可以不指明具體的資料型別,當發生函式呼叫時,編譯器才根據傳入的實參進行自動地推斷資料型別,這樣就實現了函式的模板。利用虛擬的型別來作為一個識別符號來佔位,等發生函式呼叫時再根據傳入的實參來反向推斷出真正的型別。
void change(T& a,T& b)
{
T temp = a; a = b ;
b = temp ;
}
上面的程式碼實現了一個兩個數交換的通用模板函式,T型別就是那個佔位識別符號。該模板實現了一個函式可以交換任意資料型別的兩個引數。
測試一下
int a = 10,b = 20 ;
change(a,b);