C++:听说C++很难学?该怎么学习C++?
C++以其復雜的語法、指針、內存管理、泛型編程等特性難倒了一大批IT學子。小編以CSharp入門,中途轉C++的時候痛苦過一段時間,不過隨著業務能力的精進,已經逐漸愛上這門功能強大、靈活的語言了。
下面就分享一下學習經驗
如何學習C++
關于如何學習C++,這個問題光嘴講是沒用的,還是需要自己動眼、動手、動腦。總結下來就無非這三個步驟:
學
學,不管是看書、看視頻、還是參參加培訓都可以,至少要系統化且持續性的去學習這門語言。個人建議如果有條件參加培訓是最好的,如果沒有可以看視頻學習。但是不管是哪種方式,我都推薦大家一定要看書,跟著書本學習。不管你是培訓還是看視頻,思路都是跟著別人走的,只有看書才會有自己的理解,才更深刻。
?
?
抄
抄,此處意為對著教程上的代碼抄或者半key半抄,至少要將項目通過自己的手實現,并且能正常運行。這個過程是十分痛苦的。很多人可能在學知識的時候覺得自己都會,但是一到自己key的時候就捉襟見肘了,甚至對著抄debug時仍是一大堆錯誤,這段時間是懷疑人生的時間,一定要堅持、堅持、再堅持。
比如最簡單的helloword、文件讀取、標準流輸入輸出等
int main() {printf("hello word") ;cout<<"hello word";int a ;cin>>a }寫
等熟練到一定程度,就需要自己是獨立實現一個小功能或者開發一個小項目了,這中間一定會遇到很多問題,可以查資料、查教材、咨詢其他人等。等你能獨立實現自己想實現的功能的時候,那么恭喜你已經入門了,后面會越來越順利。
C++知識難點總結
下面總結一些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);cout<<a<<"|"<<b;string c = "i love u",d = "i love u too";change(c,d);cout<<c<<"|"<<d;template<typename T>或template<class T>都可以,并且T類型參數可以有多個:template<typename T1, typename T2.....>
類模板
類模板中定義的類型參數可以用在類聲明和類實現中。類模板的目的同樣是將數據的類型參數化。
template<class T1,typename T2> class MyClass { public:MyClass(T1& a ,T2& b):a_(a),b_(b){} ;T1& Func1();void Func2(T2& x); private:T1 a_;T2 b_ ; };template<class T1,typename T2> T1& MyClass<T1,T2>::Func1() {T1 temp = this->a_ ;return &temp ; }template<class T1,typename T2> void MyClass<T1,T2>::Func2(T2& x) {this->b_ = x ; }如果大家對C/C++感興趣的話,可以加一下我們的學習交流Q群:637 ?935 ?295,免費領取一套學習資料和視頻課程喲~
STL
C++的泛型本來就是為了STL而推出的,STL(標準莫板塊) 包含常用數據結構(如鏈表、可變長數組、排序二叉樹)和算法(如排序、查找)的模板。它是一個十分強大且實用的庫。
STL中容器即實現在類模板的基礎上。算法如排序、查找等算法是實現在函數模板的基礎上。
C++STL容器分順序容器和關聯容器。順序容器包括:可變長動態數組 vector、雙端隊列 deque、雙向鏈表 list。它們的元素與位置順序有關,與元素大小無關。關聯容器包括:set、multiset、map、multimap。關聯容器內的元素是排序的,元素的順序直接關聯元素本身,沒有物理順序。
任何容器都自帶迭代器函數,他們是:
begin():返回指向容器中第一個元素的迭代器。
end():返回指向容器中最后一個元素后面的位置的迭代器。
rbegin():返回指向容器中最后一個元素的反向迭代器。
rend():返回指向容器中第一個元素前面的位置的反向迭代器。
總結
以上是生活随笔為你收集整理的C++:听说C++很难学?该怎么学习C++?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle取出对应时间间隔内的数据 b
- 下一篇: VC实现动画应用两则