怎麼理解 C 語言是面向過程的語言,C++ 是面向對象的語言。?

題主對 C 語言和 C++ 已經有一定了解,但對於 C++ 比 C 語言多出來的面向對象不能很深刻理解,希望大家能給出一針見血的回答,最好讓外行人也能聽懂。


面向對象、面向過程的關鍵詞是「面向」。

如果你是面向北邊站著的,並不意味著你沒法看到南邊,而是看南邊比看北邊費力。

---

C 語言的文件(FILE * / fopen / fclose / fwrite / ...)、字元串(char * / strcmp / strlen / atof / ...)就是最好的封裝的例子。但同樣的東西用 C++ 來做,實現起來更直觀方便。

C 語言也可以用結構體和函數指針來實現繼承、多態,但正常人都會告訴你,有這功夫還不如直接用 C++ 算了,因為 C++ 在語法層面提供了對面向對象編程更好的支持。


這麼說吧,來實現這樣一件事

司機老王開賓士

面向過程是

——司機老王開賓士

面向對象是

1.設計一個稱為司機的類Driver,他具有開車這一功能(函數),稱為void DriveCar(Car car);

2.同時,不分先後,設計一個稱為車的類 Car;

3.實例化一個類型為司機的對象,稱為老王 Driver LaoWang ;

4.實例化一個類型為車的對象,稱為賓士 Car Benz;

此時,我們客戶端實現 Laowang.DriveC(Benz),就實現了司機老王開賓士這件事

咋一看,沒啥區別,然而,我忽然讓你做

1.司機老張開林肯,面向過程就得痛苦地重新開始做,而面向對象改動面少得多;

2.司機老張開坦克,我在面向對象的思想里,司機類添加void DriveTank(Tank tank),增加一個坦克類Tank,其它類似,也是非常靈活的;

3.三條腿的司機老張開九個輪子的車,這就需要從原來的Driver和Car進行繼承等工作,也比面向過程的代碼重用性和維護性好得多

不一而足,我實在沒法再詳細展開了。


只是方便做與不方便做而已。

實際上,C++完全可以不用對象那套東西,光用函數、模板;而C也可以通過一些基礎庫和宏構建出對象系統(比如GObject)。


面向過程就是什麼事都自己做,面向對象就是什麼事都指揮對象去做


因為用C寫的代碼,如果你從main開始往下看基本能看懂80%的話,那用C++寫的從main看起,會發現不僅達不到80%,連50%都夠嗆達到了…

代碼爛的C++常常讓你找不到真正執行的方法在哪兒,而代碼爛的C再爛也還是能讓你相對較容易的把流程梳理清楚。

這就是面向過程和面向對象的一大區別,手藝不好的碼農還是少碰OO免得害人,over.


其實題主只是沒能理解C++中類和對象。

比如int a

大家都知道int是整型,其實相當於一個類。但是這個類實際是不存在的,我們不會用類。要通過a來實例化,a就是一個對象。

c++中類的形成使用了封裝的概念,相當於把對象有的屬性放在一個盒子里,封起來,形成一個類。要用的時候再調用出來即可,所以說c++面向對象編程。


C同樣可以實現面向對象機制,而且更加細膩與高效,當然bug也更多。


推薦閱讀:

gcc環境下不能使用gets怎麼辦?
怎麼理解C語言的複雜聲明?
C語言中的指針為什麼要區別出指向不同數據類型的指針?
怎樣判斷浮點數是否相等並保證同一性?
對於一個很複雜的常量表達式,編譯器會算出結果再編譯嗎?

TAG:編程語言 | C編程語言 | 計算機技術 | C | CC |