C++:听说C++很难学?该怎么学习C++?
C++以其復(fù)雜的語法、指針、內(nèi)存管理、泛型編程等特性難倒了一大批IT學(xué)子。小編以CSharp入門,中途轉(zhuǎn)C++的時候痛苦過一段時間,不過隨著業(yè)務(wù)能力的精進,已經(jīng)逐漸愛上這門功能強大、靈活的語言了。
下面就分享一下學(xué)習(xí)經(jīng)驗
如何學(xué)習(xí)C++
關(guān)于如何學(xué)習(xí)C++,這個問題光嘴講是沒用的,還是需要自己動眼、動手、動腦。總結(jié)下來就無非這三個步驟:
學(xué)
學(xué),不管是看書、看視頻、還是參參加培訓(xùn)都可以,至少要系統(tǒng)化且持續(xù)性的去學(xué)習(xí)這門語言。個人建議如果有條件參加培訓(xùn)是最好的,如果沒有可以看視頻學(xué)習(xí)。但是不管是哪種方式,我都推薦大家一定要看書,跟著書本學(xué)習(xí)。不管你是培訓(xùn)還是看視頻,思路都是跟著別人走的,只有看書才會有自己的理解,才更深刻。
?
?
抄
抄,此處意為對著教程上的代碼抄或者半key半抄,至少要將項目通過自己的手實現(xiàn),并且能正常運行。這個過程是十分痛苦的。很多人可能在學(xué)知識的時候覺得自己都會,但是一到自己key的時候就捉襟見肘了,甚至對著抄debug時仍是一大堆錯誤,這段時間是懷疑人生的時間,一定要堅持、堅持、再堅持。
比如最簡單的helloword、文件讀取、標準流輸入輸出等
int main() {printf("hello word") ;cout<<"hello word";int a ;cin>>a }寫
等熟練到一定程度,就需要自己是獨立實現(xiàn)一個小功能或者開發(fā)一個小項目了,這中間一定會遇到很多問題,可以查資料、查教材、咨詢其他人等。等你能獨立實現(xiàn)自己想實現(xiàn)的功能的時候,那么恭喜你已經(jīng)入門了,后面會越來越順利。
C++知識難點總結(jié)
下面總結(jié)一些C++學(xué)習(xí)的難點
指針
關(guān)于指針已經(jīng)講過很多次了。理解指針你需要先理解計算機內(nèi)存和內(nèi)存地址概念,還有*和&運算符。
比喻式理解:
內(nèi)存可以理解為土地,內(nèi)存地址理解為土地編號,當我們的程序在創(chuàng)建變量和對象時,計算機會充當規(guī)劃局的角色為變量和對象劃分一塊有編號的土地存放變量和對象,這就叫內(nèi)存,而編號就叫內(nèi)存地址。土地有使用期限(70年),期限后收回,計算機中變量和對象釋放時也會釋放內(nèi)存被回收。
指針:指針本身也是一個變量,類似int或者float類型,只不過int存放的是10、146等這樣的整型數(shù)據(jù),而指針變量存放的是內(nèi)存的地址。
*運算符:取內(nèi)存地址上所存對象。
&運算符:取對象所在內(nèi)存的地址。
指針指向:我們常說的某某指針指向誰,意思是,這個指針變量存放著那個對象在計算機內(nèi)存中的地址。
指針示意圖
泛型編程
C++的泛型是基于模板實現(xiàn)的。不管是類模板或是函數(shù)模板,都不是真正的類或函數(shù),只是一個編譯器用來生成代碼的藍圖。
為什么需要泛型編程
最簡單的一個例子,假設(shè)你實現(xiàn)了一個鏈表的類,可以用來動態(tài)存儲int型數(shù)據(jù)。但是現(xiàn)在又有一個需求是動態(tài)存儲string類型的數(shù)據(jù),這時候你怎么辦呢?重新為存儲string數(shù)據(jù)的鏈表單再實現(xiàn)一個類?這顯然是不符合代碼重用性原則的,這時候你可能會想到能不能將數(shù)據(jù)類型用參數(shù)的方式傳進去。這就是C++泛型編程的由來;
函數(shù)模板
數(shù)據(jù)的類型也可以通過參數(shù)來傳遞,若在函數(shù)定義時可以不指明具體的數(shù)據(jù)類型,當發(fā)生函數(shù)調(diào)用時,編譯器才根據(jù)傳入的實參進行自動地推斷數(shù)據(jù)類型,這樣就實現(xiàn)了函數(shù)的模板。利用虛擬的類型來作為一個標識符來占位,等發(fā)生函數(shù)調(diào)用時再根據(jù)傳入的實參來反向推斷出真正的類型。
void change(T& a,T& b) {T temp = a;a = b ;b = temp ; }上面的代碼實現(xiàn)了一個兩個數(shù)交換的通用模板函數(shù),T類型就是那個占位標識符。該模板實現(xiàn)了一個函數(shù)可以交換任意數(shù)據(jù)類型的兩個參數(shù)。
測試一下
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類型參數(shù)可以有多個:template<typename T1, typename T2.....>
類模板
類模板中定義的類型參數(shù)可以用在類聲明和類實現(xiàn)中。類模板的目的同樣是將數(shù)據(jù)的類型參數(shù)化。
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++感興趣的話,可以加一下我們的學(xué)習(xí)交流Q群:637 ?935 ?295,免費領(lǐng)取一套學(xué)習(xí)資料和視頻課程喲~
STL
C++的泛型本來就是為了STL而推出的,STL(標準莫板塊) 包含常用數(shù)據(jù)結(jié)構(gòu)(如鏈表、可變長數(shù)組、排序二叉樹)和算法(如排序、查找)的模板。它是一個十分強大且實用的庫。
STL中容器即實現(xiàn)在類模板的基礎(chǔ)上。算法如排序、查找等算法是實現(xiàn)在函數(shù)模板的基礎(chǔ)上。
C++STL容器分順序容器和關(guān)聯(lián)容器。順序容器包括:可變長動態(tài)數(shù)組 vector、雙端隊列 deque、雙向鏈表 list。它們的元素與位置順序有關(guān),與元素大小無關(guān)。關(guān)聯(lián)容器包括:set、multiset、map、multimap。關(guān)聯(lián)容器內(nèi)的元素是排序的,元素的順序直接關(guān)聯(lián)元素本身,沒有物理順序。
任何容器都自帶迭代器函數(shù),他們是:
begin():返回指向容器中第一個元素的迭代器。
end():返回指向容器中最后一個元素后面的位置的迭代器。
rbegin():返回指向容器中最后一個元素的反向迭代器。
rend():返回指向容器中第一個元素前面的位置的反向迭代器。
總結(jié)
以上是生活随笔為你收集整理的C++:听说C++很难学?该怎么学习C++?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle取出对应时间间隔内的数据 b
- 下一篇: 用python机器学习实现新闻关键词的抽