關於C++的一些誤解

 好久沒有在這裏寫東西了,總是忙於各種各樣的事情,呵呵,在下載MSYS的功夫寫點東西吧。

看到論壇裏的一篇文章,上面說“C++何嘗不是被誤解最多的語言呢”? 實在是無比的贊同。經過一天的思考,想了很多東西,寫出來分享一下。

誤解一:我學C了,學了好久,可以學C++了吧?

    事實上,無數的文章說到,C++和C沒有什麼關係,但是無數的人,甚至於這裏的老師在強調學C++肯定要先學C,究竟孰對孰錯呢?

    我想,強調學C++之前要學C的老師,肯定是先會了C,然後再遇到C++的人。(這也沒辦法,C畢竟比C++早了10年吧)相對於我來說,我大一的上學期直接學C++,大一下學期因爲一個機器人比賽,必須用C,才用的C,所以可能走過的路不一樣看法就不一樣。

    C++的語法兼容C的語法的一個子集,這是最中肯的說法,也是他們現在的唯一關係。要知道java,C#在一定程度上也是兼容C語法的子集的,爲什麼沒人說學C了會了,就會C#了呢?額,也許有人這麼說吧。。C寫的程序,用C++編譯器編譯不一定會通過,因爲C++具有更嚴格的類型檢查。同樣的代碼,用C和C++編譯,生成的二進制文件,也絕對不同。甚至簡簡單單的for循環,都有差別。

    當然,這些都是“術”上的問題,最嚴重的問題,應該是思想問題。

    C語言接觸不多,所以沒有什麼可說的,就說我當時寫機器人時候強迫必須用C的代碼吧。

    大部分的代碼都是形如下述這樣的:

Code:
  1. typedef struct tagSomeStruct  
  2. {  
  3.     int data1;  
  4. }SomeStruct;  
  5.   
  6. void SS_SetData1(SomeStruct* thisint value);  

    很懂C的同學應該覺得這些代碼很怪異,但是這就是思維方式的不同了。如果你精通C,寫起來C++的代碼,也會有說不出的怪異的。所以,我覺得,如果你想學C,過度到C++,倒不如直接學C++來的爽快。

誤解二:我精通VC++

    VC++,或者MFC,可以說是各種GUI類庫裏,最不面向對象的一個了,也是實現的最不C++的一個了。

    VC6.0可以說是各種現在還在用的C++編譯器中,最不標準也最不被別的編譯器兼容的一個了。。

 

    上面兩句話,可能會激起民憤,但是確實是事實。首先說第二個吧,那個比較好說,因爲微軟自己也承認。事實上,VC6.0不兼容的編譯器,包括它的後續版本,VC2003,05,08,2010。連廠商都選擇不繼續兼容了,爲什麼還有這麼多人抱着不放呢?

    MFC的問題也很神奇。呵呵,曾經聽說有人把MFC稱作Mother F*UCKING Class。說的偏激,也不失公允。具體的說法,可以參看這個文章:http://wenku.baidu.com/view/5582fb0e76c66137ee061977.html

    有一篇文章說到,不要相信任何一個精通C++的人。 我想說,那就更不要說精通VC++的人了。你只是在使用微軟提供的一個產品而言,和C++基本上沒有更多關係,甚至MFC中不鼓勵標準庫的使用,完全與C++的想法背道而馳。 哪天微軟不再支持,哪裏還有什麼VC++? 甚至,我覺得這一天並不遙遠。 爲什麼VC6使用範圍這麼廣,很大程度上是VS的後續版本對C++支持的並不很好。

    另外,更爲重要的問題是,寫程序絕對不是調API。。。曾經在羣裏有人說win32 api是程序員的必備能力,然後說每天背多少個api。。。。。何其囧也~~~別的就不多說了,相信論壇裏的兄弟們有這個能力分辨什麼是寫程序,什麼不是。

誤解三、C++是帶有類的C

     雖然C++曾經有這個名字,但是爲什麼改名字呢?

     因爲C++增加的絕對不僅僅是類。更好的類型檢查,命名空間,模板元編程,RTTI。這些都是C++所增加的東西。 要知道,C#和java的模板均是借鑑自C++的,RTTI也在一定程度上完成了反射(當然,只是完成了一部分,不過有很多類庫完成了反射,比如Qt)。至於模板元編程,也是很有意思的一個方面。

    看看下面的程序,計算Fibonacci數列的第N項:

Code:
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. template <int N>  
  6. struct Fib  
  7. {  
  8.     enum{Result = Fib<N-1>::Result+Fib<N-2>::Result};  
  9. };  
  10. template <>  
  11. struct Fib<1>  
  12. {  
  13.     enum {Result = 1};  
  14. };  
  15. template <>  
  16. struct Fib<0>  
  17. {  
  18.     enum {Result = 0};  
  19. };  
  20.   
  21. int main()  
  22. {  
  23.     cout << Fib<25>::Result << endl;  
  24.     return 0;  
  25. }  

    這個程序可是純靜態的計算哦,不佔用運行時時間。

    雖然,這種模板元編程,並不經常使用(數學庫還是會用到的,快啊),但是,至少在ADT容器的時候,這個還是很有意義的。

 

好了,就到這裏吧,還有很多很多要說的,不過看看反響先。。。

純粹原創,勿拍磚。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章