何為物件導向?

2021-08-14 04:38:05 字數 3396 閱讀 5821

概述:所謂物件,是乙個名詞,任何乙個事物都可以稱為物件,其有對應的屬性(事物的特性)和行為(事物能幹什麼)。物件導向思想,就是面向事物的程式設計思想。

1, 面向過程

談及物件導向,不得不談的就是面向過程。物件導向是針對名詞而言,面向過程則是針對行為動作的處理。

面向過程是一種以過程為中心的程式設計思想。所謂過程,就是步驟。當要解決問題或實現目標時,就要進行分析,得到解決所需要的步驟,然後利用函式將這些步驟一步步實現。在處理時,依次呼叫這些函式即可。

當開發程式規模較小且功能固定時,面向過程的方法有其優勢,因為其實現步驟清晰,按照分析的思路可以很好的組織程式。

2, 物件導向

2.1何為物件?

物件是人們要進行研究的任何事物,從最簡單的證書到複雜的飛機等均可看做物件,它不僅能表示具體的事物,還能表示抽象的規則、計畫或事件(摘自《c++ primer》)。

物件具有狀態和行為。狀態即屬性,乙個物件可用資料值等來描述其狀態;行為即操作,用於改變物件的狀態值。將屬性和操作封裝起來就組成了物件。物件是對客觀事物的抽象,將具有一致的屬性和行為封裝在一起就形成了類,即具有相同屬性和行為的物件的抽象就是類。類與物件的關係,總的來講,類是物件的抽象,物件是類的例項。

(1)每乙個物件都是某乙個類的例項;(2)每乙個類在某乙個時刻都有零或更多的例項;(3)類是靜態的,它們的內容在程式執行前已經定義好,而物件是動態的,它們在程式執行時可以被建立和刪除;(4)類是生成物件的模板。

2.2 物件導向概念

物件導向是面向乙個名詞(事物)的處理,該事物有屬性和行為。定義好事物的屬性和行為後,針對事物進行操作,進而完成功能。

2.3 基本特徵

(1)封裝

所謂封裝,就是將屬性和行為包裝起來,只提供介面以供呼叫,隱藏了物件的內部實現細節,起到了資料保密的作用。一方面,外部程式不能隨意訪問物件的內部屬性,避免了外部錯誤對其的影響;另一方面,當物件內部進行修改時,物件只是通過介面提供服務,減小了其對外部的影響。

一味地強調封裝保密,可能會使程式變得臃腫,增加開銷。c++中定義了三種可見性:公有(public)、保護(protected)、私有(private),增加了靈活性。公有,成員變數或函式可以被以任何方法訪問;保護,只有其本身以及子類可以訪問,其他不能訪問;私有,只能被其本身訪問。

(2)繼承

繼承,顧名思義,就是兒子繼承老子的遺產。使用現有類的所有功能,並在其基礎上對這些功能進行擴充套件。通過繼承建立的新類稱為「子類」或「派生類」,而現有的、被繼承的類稱為「基類」或「父類」。子類繼承了基類的屬性和行為,即「兒子繼承老子的遺產」,同時在繼承的基礎上可進行擴充套件。

單繼承,即單一繼承,乙個子類只有乙個直接基類。

多繼承,乙個子類有兩個或兩個以上的直接基類。這種情況下,子類可以繼承多個基類的屬性。

1, 2, 

3, 

(3)多型

c++中,多型是乙個介面多種實現,通過虛函式來實現。在基類函式前新增virtual關鍵字,在子類中對該函式重寫,執行時將會根據物件的實際型別而不是指標的型別來呼叫相應的函式。若物件的型別是子類,呼叫子類的函式;若物件型別是基類,則呼叫基類的函式。

注:1,用virtual關鍵字宣告的函式為虛函式,虛函式肯定是類的成員函式;2,純虛函式是虛函式再加上「=0」;3,抽象類是指包括至少乙個純虛函式的類。

具體可參考:

(4)抽象

物件是對客觀事物的抽象,類是對具有一致屬性和行為的物件的抽象

3,物件導向與面向過程的區別

面向過程是分析出解決問題所需要的步驟,然後利用函式將這些步驟一一實現,使用時在依次呼叫函式;物件導向是把構成問題事物分解成各個物件,建立物件的目的不是為完成某乙個步驟,而是為描述某個事物在整個解決問題的步驟中的行為。因此,可以說面向過程是基於動作的處理,而物件導向是基於名詞事物的處理,

以下例子作解釋,要把大象裝進冰箱裡,有幾個步驟:

(a)把冰箱門兒開啟。

(b)把大象裝進去。

(c)把冰箱門兒關上。

上面每乙個步驟,程式設計師都會用乙個「函式」來實現。「函式」是一些**的集合體,每個函式可以實現乙個功能。比如我要定義乙個開啟冰箱門的函式: openthedoor()。

所有函式定義好了之後,依次呼叫就可以了:

openthedoor();

pushelephant();

closethedoor();

需求完成,順利交工,這是面向過程的處理。但是你以為這樣就結束了?如若還需要如下的功能需求呢。

「我要把大象裝微波爐裡」

「我要把獅子也裝冰箱裡」

「我要把大象裝冰箱,但是門別關,敞著就行」

如果還是用面向過程的方法來應付,每次需求的變更,程式設計師就要把整個系統通讀一遍,找出可用的函式(如果沒有就再定義乙個),最後依次呼叫它們。最後系統越來越雜亂無章難以管理,程式設計師不堪重負,紛紛操起刀走上了犯罪的道路。

物件導向的世界裡,到處都是物件。物件不光有「資料」和「能力」,還可以接受命令。例如你可以讓「狗」這個物件「吃**」,就可以把「吃**」的命令發給「狗」讓其執行,然後我們就實現了「狗吃**」的需求。

現在物件有了,如何進行物件導向的程式設計呢?很簡單,依次向不同的物件傳送命令就可以了。回到上面的例子,用物件導向來實現,我們會先定義乙個「冰箱」物件,它的「資料」就是當前的冷凍溫度,或者該冰箱已經有了多少頭大象,「能力」就是開門、關門。還有乙個「大象」物件,它的「資料」可以是大象的智商、體積,「能力」就是「自己跑到冰箱裡去」。然後我們依次:

(a)向冰箱下達「開門」的命令。

(b)向大象下達「進冰箱」的命令。

(c)向冰箱下達「關門」的命令。

但請注意:物件導向也是有乙個個過程組合起來的,其具有封裝性,需要很大的空間。這個很好理解,再面向事物的處理,最終都是要歸結到具體步驟上去。不論是「開啟冰箱門」,還是「向冰箱下達開門的命令」,最終都需要開冰箱門,只是解決問題的角度不同。

面向過程與物件導向的優缺點:

(1)      面向過程

優點:流程化使得程式設計任務明確,在開發之前基本考慮了實現方式和最終結果;效率高,

面向過程強調**的膽小精悍,善於結合資料結構來開發高效率的程式。流程明確,具體步驟清楚,便於節點分析。

缺點:需要深入的思考,耗費精力,**重用性低,擴充套件能力差,維護起來難度比較高,對複雜業務來說,物件導向的模組化難度較高,耦合度也比較高。

(2)      物件導向

優點:結構清晰,程式的模組化,結構化,抽象化,更加符合人類的思維方式;封裝

性,將事務高度抽象,從而便於流程中的行為分析,也便於操作和自省;容易擴充套件,**重用率高,可繼承,可覆蓋;利用介面將資料與**實現隔離,實現了一定的保密性;實現簡單,可有效地減少程式的維護工作量,軟體開發效率高。

缺點:效率低,物件導向在面向過程的基礎上高度抽象,從而和**底層的直接互動非

常少機會,不適合底層開發和遊戲甚至多**開發;複雜性,對於事務開發而言,事務本身是面向過程的,過度的封裝導致事務本身的複雜性提高。

物件導向何為多型?

前言 物件導向程式設計過程中少不了 1 封裝 2 繼承 3 多型 三個特性,其中多型又是怎麼理解的呢?擯棄教科書式回答,多型語義是多種形態的縮寫,在物件導向程式設計的思想中,萬物皆物件 那麼我們知道,物件的行為和屬性由模板類定義,而通過模板類 class or inte ce 我們可以控制物件在ru...

物件導向 何為模組

何為模組?乙個模組就是包含了python定義和宣告的檔案,檔名就是模組加上.py的字尾.但其實import載入的模組分為四個通用類別 1.使用python編碼的 py檔案 2.一杯編譯為共享庫或dlld的c或c 擴充套件 3.包好一組模組的包 4.使用c編寫並鏈結到python直譯器的內建模組 為何...

何為POD物件?

在c 中,我們把傳統的c風格的struct叫做pod plain old data 物件。一般來說,pod物件應該滿足如下特性。對於pod型別t的物件,不管這個物件是否擁有型別t的有效值,如果將該物件的底層位元組序列複製到乙個字元陣列 或者無符號字元陣列 中,再將其複製回物件,那麼該物件的值與原始值...