C++中物件導向的理解,中物件導向理解
1、對於OO(物件導向)的含義,並不是每個人的看法都是相同的。即使在現在,如果問十個人,可能會得到15種不同的答案。幾乎所有的人都會同意繼承和多態是OO中的概念。大多數人還會再加上封裝。還有一些人會加上異常處理,而可能會沒有人將模板也包含進去。問題的關鍵在於:對於某個特性是否是屬於OO的,往往都存在著不同的觀點,而每一種觀點都有著熱情的擁護者。
2、C++的標準化工作對C++最重要的貢獻就是:對功能強大的抽象機制提供了更有力的支援,從而降低了軟體的複雜性。C++並不僅僅只是一種物件導向的語言。它能夠支援好幾種編程風格,包括物件導向編程風格和泛型程式設計風格。這些編程風格都是非常重要的,因為每一種編程風格都提供了很靈活的方法來通過抽象機制對代碼進行組織。物件導向編程使我們能夠把對象的狀態以及處理這些狀態的函數綁定在一起,而封裝和繼承則使我們能夠管理相互依賴性,並使能夠通過更清晰和更容易的方式來重用代碼。泛型程式設計則是一種較新的風格,它能夠使我們編寫出一些函數和類,它們能夠對其他一些“未定義的、沒有關聯的和未知類型”的函數和對象進行操作,從而為降低程式中耦合性和相互依賴性提供了一種獨特的方式。當前,在其他的一些語言中也提供了對泛型的支援,但是都沒有像C++中對泛型的支援這樣強。事實上,現在的泛型程式設計可能都要歸功於C++獨特的模板形式。今天,在C++中提供了許多功能強大的方式來表達抽象機制,而由此帶來的靈活性就是C++標準化中最重要的成果。
3、在C++中沒有模組系統(無論是完整的還是不完整的);它缺乏其他一些重要的特性,例如記憶體垃圾收集機制,它有靜態類型檢查,但卻並不一定是“強”類型檢查。
1、強/弱類型是指類型檢查的嚴格程度的。語言有無類型,弱類型和強型別三種。無類型的不檢查,甚至不區分指令和資料。弱類型的檢查很弱,僅能嚴格的區分指令和資料。強型別的則嚴格的在編譯期進行檢查。
強型別定義語言:強制資料類型定義的語言。也就是說,一旦一個變數被指定了某個資料類型,如果不經過強制轉換,那麼它就永遠是這個資料類型了。舉個例子:如果你定義了一個整型變數a,那麼程式根本不可能將a當作字串類型處理。強型別定義語言是型別安全的語言。
弱類型定義語言:資料類型可以被忽略的語言。它與強型別定義語言相反, 一個變數可以賦不同資料類型的值。
2、動態類型語言:動態類型語言是指在運行期間才去做資料類型檢查的語言,也就是說,在用動態類型的語言編程時,永遠也不用給任何變數指定資料類型,該語言會在你第一次賦值給變數時,在內部將資料類型記錄下來。
靜態類型語言:靜態類型語言與動態類型語言剛好相反,它的資料類型是在編譯其間檢查的,也就是說在寫程式時要聲明所有變數的資料類型,C/C++是靜態類型語言的典型代表,其他的靜態類型語言還有C#、JAVA等。
強型別定義語言在速度上可能略遜色於弱類型定義語言,但是強型別定義語言帶來的嚴謹效能夠有效避免許多錯誤。另外,“這門語言是不是動態語言”與“這門語言是否型別安全”之間是完全沒有聯絡的!
3、封裝
封裝是保證軟體組件具有優良的模組性的基礎,封裝的目標就是要實現軟體組件的“高內聚、低耦合”,防止程式相互依賴性而帶來的變動影響。在物件導向的程式設計語言中,對象是封裝的最基本單位,物件導向的封裝比傳統語言的封裝更為清晰、更為有力。物件導向的封裝就是把描述一個對象的屬性和行為的代碼封裝在一個“模組”中,也就是一個類中,屬性用變數定義,行為用方法進行定義,方法可以直接存取同一個對象中的屬性。
第一、良好的封裝能夠減少耦合。
第二、類內部的實現可以自由地修改。
第三、類具有清晰的對外介面。
封裝的好處很好理解,我們的房子就是一個類的執行個體,室內的裝飾與擺設只能被室內的居住者欣賞和使用,如果沒有四面牆的遮擋,室內的所有活動在外人面前一覽無遺。由於有了封裝,房屋內的所有擺設都可以隨意地改變而不用影響他人。然而,如果沒有門窗,一個包裹得嚴嚴實實的黑箱子,即使它的空間再寬闊,也沒有實用價值。房屋的門窗,就是封裝對象暴露在外的屬性和方法,專門供人進出,以及流通空氣、帶來陽光。
4、繼承
在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並可以加入若干新的內容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動共用父類資料和方法的機制,這是類之間的一種is--a關係,提高了軟體的可重用性和可擴充性。
第一、子類擁有父類非private的屬性和功能;
第二、子類具有自己的屬性和功能,即子類可以擴充父類沒有的屬性和功能;
第三、子類還可以以自己的方式實現父類的功能(方法重寫)。
對於建構函式,它不能被繼承,只能被調用。繼承會破壞封裝,父類實現細節暴露給子類。這其實是增大了兩個類之間的耦合性,並且是強耦合的關係。
5、多態
同一操作作用於不同的類的執行個體,將產生不同的執行結果,即不同類的對象收到相同的訊息時,得到不同的結果。多態是物件導向程式設計的重要特徵之一,是擴充性在“繼承”之後的又一重大表現 。對象根據所接受的訊息而做出動作,同樣的訊息被不同的對象接受時可能導致完全不同的行為,這種現象稱為多態性。
虛方法是按照其運行時類型而非編譯時間類型進行動態綁定調用的。
6、抽象
抽象就是找出一些事物的相似和共性之處,然後將這些事物歸為一個類,這個類只考慮這些事物的相似和共性之處,並且會忽略與當前主題和目標無關的那些方面,將注意力集中在與當前目標有關的方面。
第一、抽象類別不能執行個體化;
第二、抽象方法是必須被子類重寫的方法;
第三、如果類中包含抽象方法,那麼類就必須定義為抽象類別,不論是否還可以包含其他一般方法。
7、介面
介面是把隱式公用方法和屬性群組合起來,以封裝特定功能的一個集合。一旦類實現了介面,類就可以支援介面所指定的所有屬性和成員。聲明介面在文法上與聲明抽象類別完全相同,但不允許提供介面中任何成員的執行方式。所以介面不能執行個體化,不能有構造方法和欄位;不能有修飾符;不能聲明為虛擬或靜態等。還有實現介面的類就必須要實現介面中的所有方法和屬性。一個類可以支援多個介面,多個類也可以支援相同的介面。
抽象類別可以給出一些成員的實現,介面卻不包含成員的實現,抽象類別的抽象成員可被子類部分實現,介面的成員需要實作類別完全實現,一個類只能繼承一個抽象類別,但可實現多個介面等等。
C與C++中面向過程與物件導向的程式設計怎形象的理解?
面向過程的是以功能模組為單位,典型的是函數和過程,
物件導向的是以類/對象為單位,典型的是類
物件導向是對面向過程的發展,它通過類把相關的資料和操作捆綁在一起的
簡單的說一下吧
如果你要做個航空系統的網站,如乘客這裡,用物件導向的思想,你把所有乘客的屬性,方法等全部寫出來,不管項目是否需要這些功能。
而面向過程是你想到哪裡屬性方法就寫哪些。
當你這個項目需要加一些乘客的功能的時候,如果是用物件導向的思想的話,那麼直接在那個功能裡面寫代碼就是了,而面向過程的話則需要重新寫,這樣一來麻煩很多。不能體現程式本身的一些重用,封裝等等效能。
面向過程的代碼實現要比物件導向的快很多,因為他是想到什麼就寫什麼~
懂一些沒?
C++中是物件導向,C是面向過程,那這個對象與過程是什?
物件導向指的是把屬性和方法封裝成類,執行個體化對象後,要完成某個操作時,直接調用類裡面相應的方法。面向過程則不進行封裝,要完成什麼功能需要詳細把演算法寫出來。舉個例子來說,我要完成買東西這個任務,物件導向的實現方法就是,先對手下的人辦個培訓,教他們怎麼去買(相當於定義類的屬性和方法),以後要讓他們買東西,只要喊“張三(或者李四,相當於執行個體化對象),你用上次我教你的方法去買個東西”,這樣就可以了。而面向過程的方法則不進行培訓,每次要去買東西,都找張三過來,再教他怎麼去買,但是下次再喊他去買,又要重新教一次。