別的學校什麼情況我不清楚,但是在我們學校是大一上學期就學了C語言,大一下學期就學了C++。那個時候剛進入軟體學院呐,哪裡搞的明白什麼C/C++,更別說C和C++有什麼關係了,就是在不明白的情況下就開始亂用了,也就順理成章的出現了這樣的情況:大家寫出來的程式看不明白是C還是C++,於是我們就開玩笑的說他們編的都是“C+”程式。最近也看到了也總有人在面試上問:C和C++有什麼區別??於是乎,那就寫一篇隨筆吧~~~希望大家幫忙補充哦~~~
區別一:
首先,必須要提及的是我是ACM出身,搞了一年半和教練%¥#¥#%#¥~~~(呵呵,不說了~~),也就是說,我最初接觸到的是面向過程的思想,很顯然了,我的程式設計語言那個時候是C語言,後來接觸到了C++就開始了物件導向的編程,那個時候我們也編過《圖書管理系統》等這些老掉牙的東西。也就是說C語言是面向過程的語言,解決問題的思路是,把問題想象成一個過程,通過過程完成輸入到輸出的轉化。而對於C++語言呢?C++可以說是物件導向的語言,考慮問題的思路是構造一些物件模型,每個對象內部包含有方法和資料,這些對象之間可以傳遞資料來完成功能的。其實嚴格的說C++是半面向過程半物件導向的,要不怎麼出現了C#呢!!(C++++)關於面向過程和物件導向的問題,我想應該不用多解釋的,資料多了去了!!
區別二:
學習C++應該首先接觸到class吧,其實在C中也有類似的結構的感念叫struct。在C中的struct是這樣要求的只包含資料成員,不允許有成員函數,並且預設資料成員是public類型的,即在外部是可以訪問的。那麼C++也有struct啊,但是是有區別的,C++中的struct是可以有成員函數,但是C++中的預設也是public的,也就是更接近 class 了。那麼C++中為什麼要同時又struct和class呢?其實在struct和class基本是一樣的,主要有下面的四點區別:(1)class中的成員(資料和函數)預設是private,而在struct中預設是public存取權限。(2)對struct的繼承預設是public繼承,對class的繼承確預設是private繼承。(3)和template一起使用的區別,class可以替換typename但是struct不可以。(4)能否用大括弧{}初始化。對於struct不提供建構函式的話理論上是可以的,因為資料成員預設是public類型的,而對於class,如果資料成員是private存取權限的則不能,public存取權限則可以利用大括弧初始化,對於提供了建構函式的class,理論上也是可以完成初始化的。看看代碼吧:
View Code
1 #include <iostream> 2 3 using namespace std; 4 5 struct A 6 { 7 int x; 8 }; 9 10 class B11 {12 public:13 int x;14 };15 16 class C17 {18 int x;19 };20 21 class D22 {23 public:24 int x;25 D(int i){};26 };27 28 int main()29 {30 A a[3] = {1,2,3};31 B b[3] = {4,5,6};32 C c[3] = {7,8,9}; //錯誤的33 D d[3] = {10,11,12};34 return 0;35 }
區別三:
學過C++的都知道C++中有個叫做“重載”的詞兒,這在C++中是比較重要的,但是在C中是沒有的,原因要從C和C++的編譯的區別說起了,實際上函數被C++編譯和被C編譯器編譯後在符號庫中的名字是不同的,我局個例子就都明白了,比如函數bool IsEquel(int x ,int y),通過C語言編譯器編譯在符號庫中是_IsEquel,而通過C++編譯器在符號庫中就變成了_IsEquel_int_int 了,現在如果還有一個函數bool IsEquel(float x ,float y),通過C++編譯器在符號庫中變成了_IsEquel_float_float,看看經過編譯之後就變成了不同的函數,也就是重載了,而在C編譯器中則不是了,現在可能也應該明白了:為什麼要用參數個數或者類型的不同作為重載的條件了吧~~呵呵!!
區別四:
C和C++中的記憶體申請和釋放方式也是不同的,在C中使用的是malloc和free,而在C++更經常使用的是new和delete,現在說說這兩個組合的不同之處吧:malloc和free是函數,用來動態申請和釋放記憶體空間,申請的就是記憶體空間的大小,比如int *p = (int *)malloc(sizeof(int) *10) .實際上malloc主要是用於內建類型的申請和釋放,對於對象的建立用malloc則不能滿足要求,因為對象的建立要自動調用建構函式,對象在消亡之前要調用解構函式,用malloc/free是不能完成的,這種情況就要使用new/delete的組合了,應該注意的是new/delete是C++中的運算子。
小弟才疏學淺只知道這些主要的區別啦,大牛們,趕快來補充吧~~~~come on !!!
學習中的一點總結,歡迎拍磚哦^^