在學習了C語言和C++之后,這兩者之間的區別我們需要仔細的捋一捋!
一、面向過程語言和面向對象語言
我們都知道C語言是面向過程語言,而C++是面向對象語言,說C和C++的區別,也就是在比較面向過程和面向對象的區別。
1.面向過程和面向對象的區別
(1)面向過程:面向過程編程就是分析出解決問題的步驟,然后把這些步驟一步一步的實現,使用的時候一個一個的依次調用就可以了。
(2)面向對象:面向對象編程就是把問題分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描述某個事物在整個解決問題的步驟中的行為。
舉個例子:(玩五子棋)
(1)用面向過程的思想來考慮就是:開始游戲,白子先走,繪制畫面,判斷輸贏,輪到黑子,繪制畫面,判斷輸贏,重復前面的過程,輸出最終結果。
(2)用面向對象的思想來考慮就是:黑白雙方(兩者的行為是一樣的)、棋盤系統(負責繪制畫面)、規定系統(規定輸贏、犯規等)、輸出系統(輸出贏家)。
面向對象就是高度實物抽象化(功能劃分)、面向過程就是自頂向下的編程(步驟劃分)
2.面向過程和面向對象的優缺點
在學習一些比較抽象的概念時,由于我們的理解能力很有限,有時候一些比較恰當的例子也是有助于我們學習的,因此對二者的優缺點比較,還是先舉例子,后總結吧!
(1)用面向過程寫出來的程序就像一份蛋炒飯,也就是米飯和炒的菜均勻的混合在了一起,因此蛋炒飯入味均勻,不會像蓋澆飯那樣,可能有時候吃的菜多飯少,還有時候菜少飯多。但是如果你不喜歡吃蛋炒飯,只想吃肉炒飯,那么原來做的這份蛋炒飯就得倒掉了,重新做一份肉炒飯,廚師就得辛苦了!
(2)用面向對象寫出來的程序就像一份蓋澆飯,也就是米飯和蓋菜分別做好,將蓋菜放在米飯上面,蓋澆飯雖然沒有蛋炒飯那樣入味均勻,但是如果給了你一份土豆絲蓋飯,你又不想吃了,換成牛肉蓋飯,廚師只需要將米飯上面的土豆絲倒掉,重新做一份牛肉放在上面就好了。
那么到底蛋炒飯和蓋澆飯哪個好吃呢?
我覺得各有優劣,誰也不能說到底哪個好,畢竟蛋炒飯的餐館和蓋澆飯的餐館都很多,而且生意都很不錯,存在即為合理!
如果非要將二者進行一個高地的比較的話,那就得先設定一個場景了!
蓋澆飯的好處就是”菜”“飯”分離,從而提高了制作蓋澆飯的靈活性。飯不滿意就換飯,菜不滿意換菜。用專業術語來說就是”可維護性“較好,”飯” 和”菜”的耦合度比較低。
蛋炒飯將”蛋”“飯”攪和在一起,想換”蛋”“飯”中任何一種都很困難,耦合度很高,以至于”可維護性”比較差。
基于上述的例子,二者的優劣總結如下:
面向過程語言
優點:性能比面向對象高,因為類調用時需要實例化,開銷比較大,比較消耗資源;比如單片機、嵌入式開發、 Linux/Unix等一般采用面向過程開發,性能是最重要的因素。
缺點:沒有面向對象易維護、易復用、易擴展
面向對象語言:
優點:易維護、易復用、易擴展,由于面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統 更加靈活、更加易于維護
缺點:性能比面向過程低
二、具體語言的區別
1.關鍵字不同
C99有32個關鍵字
C++98有63個關鍵字
一些關鍵字的細微區別:
(1)struct:在C語言中struct定義的變量中不能有函數,而在C++中可以有函數。
(2)malloc :malloc函數的返回值為void*,在C語言中可以賦值給任意類型的指針,在C++中必須強制類型轉換,否則報錯。
(3)struct和class:class是對struct的擴展,struct默認的訪問權限是public,而class默認的訪問權限是private。
2.后綴名不同
C源文件后綴.c,C++源文件后綴.cpp,在VS中,如果在創建源文件時什么都不給,默認是.cpp。
3.返回值
C語言中,如果一個函數沒有指定返回值類型,默認返回int類型;C++中,如果一個函數沒有返回值則必須指定為void。
4.參數列表
在C語言中,函數沒有指定參數列表時,默認可以接收任意多個參數;但在C++中,因為嚴格的參數類型檢測,沒有參數列表的函數,默認為 void,不接收任何參數。
5.缺省參數
缺省參數是聲明或定義函數時為函數的參數指定一個默認值。在調用該函數時,如果沒有指定實參則采用該默認值,否則使用指定的參。(C語言不支持缺省參數)
(1)半缺省參數
void FunTest(int _iParam1, int _iParam2 = 0 )
{}
void FunTest(int _iParam1, int _iParam2 = 0 , int _iParam3/* = 0*/)
{}
void FunTest(int _iParam1, int _iParam2 /* = 0*/,int _iParam3 = 0)
{}
(2)全缺省參數
void FunTest(int _iParam1 = 0, int _iParam = 1)
{ }
//注意:慎用缺省函數,否則會產生二義性
void FunTest ()
{}
void FunTest (int a = 10 )
{}
//假如使用不帶實參方式調用FunTest()函數時,編譯器將不知道調用哪一個,產生二義性
注意:
(1)在半缺省的情況下,帶缺省值的參數必須放在參數列表的最后面。
(2)缺省參數不能同時在函數的聲明和函數定義中出現,二者只能選其一。
(3)缺省值必須是常量或者全局變量。
(4)缺省參數必須通過值參或常參傳遞。
6.函數重載
函數重載:函數重載是函數的一種特殊情況,指在同一作用域中,聲明幾個功能類似的同名函數,這些同名函數的形參列表(參數個數、類型、順序)必須不同,返回值類型可以相同也可以不同,常用來處理實現功能類似數據類型不同的問題。(C語言沒有函數重載,C++支持函數重載)。
來看個例子:
//下面兩個函數算函數重載嗎?
void FunTest6()
{ } int
FunTest6()
{
return 0;
}
//答案是不能,因為僅僅返回值類型不同,不能構成重載
-
C語言
+關注
關注
180文章
7601瀏覽量
136251 -
C++
+關注
關注
22文章
2104瀏覽量
73503 -
面向對象
+關注
關注
0文章
64瀏覽量
9978
發布評論請先 登錄
相關推薦
評論