什麼是面向對象編程?它與面向過程編程的異同有哪些?
其實說來學習編程也快7個年頭了,由小學開始,學basic,到pascal,再到c、php,現在已經大一下學期了。說來慚愧,由於個人比較不務正業,到現在也只能寫一些控制台下的程序,或者做一兩個php寫的小小博客。一直以來我都有一個巨大的疑問,什麼是面向對象?什麼是面向對象編程?以前總是聽說,c屬於面向過程的語言而c++則屬於面向對象,在看過知乎上的一些回答以後,我感覺面向對象說得更像是一種方法,而非語言本身。那麼,什麼是面向對象編程?他與面向過程編程的異同有哪些?
面向某個東西,就表明這個東西是主導因素。
面向對象,那麼對象就是主導因素。因此我們首先實現的不是函數,而是「類」,也即對象。首先我們知道世界上有很多類,比如人類,爬蟲類,魚類。而人類中還有超人類,變異人類,巨人類等等(僅供參考)。
在面向對象時,我們實現程序,就是先實現某個類,比如「超人類」。然後我們實現它其中的一個方法,比如「cry」。這個cry方法是源自於它的父類「人類」的。如果你不實現它,那麼超人類哭起來也和普通人類沒有什麼不同。這就是面向對象中的「繼承」。
而在面向過程的編程時,我們只知道方法「cry」,我們首先實現了它,而不考慮任何的其他要素。假設這個cry函數實現了人類的cry。過了一段時間,我覺得超人類可以用一滴眼淚讓人起死回生,那麼應該怎麼編程呢?一般來說,在cry里寫肯定就行不通了,得用superman_cry函數來替代。而人類的cry怎麼辦?我們把它改寫成了human_cry。- 這個時候調用者就頭疼了:什麼時候調用human_cry,什麼時候調用superman_cry呢?
- 而且是不是每個類想要cry,就要加一個函數呢?
- 假如我想實現超人類的其他行為,又該怎麼做呢?是不是用superman_beat,superman_eat這樣來增加一系列函數呢?
- 而人類中的函數失效了以後,超人類涉及到調用人類的函數又怎麼辦呢?
明白了嗎?在面向對象時,對象是主導,你只需要調用person.cry()函數,而不需要擔心他是人類,超人類,或者是更細節的嬰兒時期、青年、壯年、抑或老年。而在面向過程時,你必須給這些諸多可能進行分門別類的一個一個判斷,寫出眾多的函數:human_cry,human_kid_cry,superman_kid_cry。在可能越來越多,項目越來越大時,函數就以指數級增長了。
面向過程非常不利於解耦,對維護也有非常大的麻煩——往往寫出代碼的人都不能很好的搞定自己的代碼。
在面向對象中還有很多概念,比如組合,泛型等,這又是後話了。「c++則屬於面向對象」,這個說法如果不是錯誤的至少也是不恰當的面向對象是以數據為主導,面向過程是以動作為主導比如以樓上說的洗衣服為例
面向過程是這樣思考的
洗(你,衣服)面向對象則是這樣思考你.洗(衣服)樓上們解釋的通俗且專業,我就說一下我的簡單理解:
面向對象:對象就是物體,這種編程思想就是設定一個有一定功能的物體,然後利用這個物體的功能做你想做的事情。(這個物體有attributes,比如名字啊,年齡啊等等等等,有methods,比如吃喝拉撒睡等等等等,功能==methods)面向過程:你想幹嘛,就直接寫個功能,然後做你想做的事情。借樓上的例子,你想寫個程序洗衣服,面向對象就是設定一個人,把這個對象賦予拿衣服,搭車,交易,取衣服,回家這所有的過程的功能。當你想洗衣服的時候,創造這個對象的實例出來,然後命令他gogogo就好了。
面向過程,你就得寫拿衣服,搭車,交易,取衣服,回家這所有的過程。如果你下一次還想洗衣服,就得再寫一遍這個過程。很麻煩,易出錯。簡而言之,面向對象就是一種偷懶的方法。推薦閱讀:
※C++中為什麼有delete[]這種寫法?
※關於指針數組的初始化的一個問題?
※C++ string + 號返回的是右值,為什麼下面這段代碼不報錯?
※為什麼C++的庫函數的定義會這麼複雜?
※如何才能寫出沒有bug的程序?