C 多型及C和C 的區別

2022-05-30 02:33:08 字數 2900 閱讀 1142

c和c++大的區別:

c是面向過程的,資料與演算法分開。它的重點在於演算法和資料結構。側重於計算機底層操作。

c++是物件導向的,主要特點是類,封裝和繼承。與c的區別主要為 :類、繼承和多重繼承、運算子過載、類模板、c++標準庫、模板庫。

c++是c的超集,也可以說c是c++的子集,因為c先出現。按常理說,c++編譯器能夠編譯任何c程式,但是c和c++還是有一些小差別。

例如c++增加了c不具有的關鍵字。這些關鍵字能作為函式和變數的識別符號在c程式中使用,儘管c++包含了所有的c,但顯然沒有任何c++編譯器能編譯這樣的c程式。

c程式設計師可以省略函式原型,而c++不可以,乙個不帶引數的c函式原型必須把void寫出來。而c++可以使用空引數列表。

c++中new和delete是對記憶體分配的運算子,取代了c中的malloc和free。

標準c++中的字串類取代了c標準c函式庫標頭檔案中的字元陣列處理函式。

c++中用來做控制態輸入輸出的iostream類庫替代了標準c中的stdio函式庫。

c++中的try/catch/throw異常處理機制取代了標準c中的setjmp()和longjmp()函式。

物件導向有三大特徵:封裝性、繼承性、多型性

1.物件導向和面向過程區別

面向過程程式設計:所謂的面向過程程式設計就是函式的定義和呼叫。簡單地說,過程就是程式執行某項操作的一段**,函式是最常用的過程。

物件導向程式設計:物件導向程式設計就是物件加訊息。第一,程式一般由類的定義和使用兩部分組成,而類的例項即物件;第二,程式中的一切操作都是通過物件傳送訊息來實現的,物件接收訊息後,啟動有關方法完成相應的操作。

2.什麼是物件

物件可以理解為:用現實生活中來表述是屬性+行為,用程式語言來表述是資料(變數)+操作(函式);

物件需要有以下四點特徵:

①每乙個物件必須有乙個名字以區別與其他物件(類的例項)。對於物件來說,每乙個物件的資料成員都有其自己獨立的儲存空間,不同物件的資料成員占有不同的儲存空間,而不同物件的成員函式是占有同乙個函式**段的。

②用屬性來描述他的某些特徵(資料賦值)。

③有一組操作,每個操作決定物件的一種行為(函式呼叫)。

④物件的操作可以分為兩類:一類是自身所承受的操作,另一類是施加於其他物件的操作。

3.物件導向的優點:

①提高程式可重用性:通過繼承

②改善程式可維護性:不改變介面而維護介面內部程式實現,不影響使用者。

③跟好的支援大型程式設計:分模組設計,做自己的介面,然後整合到乙個系統中去。

4.什麼是多型

多型是指不同的物件收到相同的訊息時產生多種不同的行為方式。c++支援兩種多型性,即編譯時的多型性(過載:函式/運算子過載)和執行時的多型性(虛函式)。

一般來說多型分為兩種:

靜態多型:也稱為編譯時多型,主要包括引數多型,過載多型和強制多型。引數多型:採用引數化模板,通過給出不同的型別引數,使得乙個結構有多種型別。如 c++語言中的函式模板和類模板屬於引數多型。引數多型又叫靜態多型,它的執行速度快,異常少,呼叫在編譯時已經確定。過載多型:同乙個名字在不同的上下文中所代表的含義不同。典型的例子是運算子過載和函式過載。強制多型:編譯程式通過語義操作,把操作物件的型別強行加以變換,以符合函式或操作符的要求。程式語言中基本型別的大多數操作符,在發生不同型別的資料進行混合運算時,編譯程式一般都會進行強制多型。程式設計師也可以顯示地進行強制多型的操作。如 int+double,編譯系統一般會把 int 轉換為 double,然後執行 double+double 運算,這個int->double 的轉換,就實現了強制多型,即可是隱式的,也可顯式轉換。強制多型屬於靜態多型。

動態多型:也稱執行時多型,主要包括:包含多型。包含多型的基礎是虛函式。主要是通過類的繼承和虛函式來實現,當基類和子類擁有同名同參同返回的方法,且該方法宣告為虛方法,當基類物件,指標,引用指向的是派生類的物件的時候,基類物件,指標,引用在呼叫基類的方法,實際上呼叫的是派生類方法。

靜態多型實現

靜態多型靠編譯器來實現,簡單來說就是編譯器對原來的函式名進行修飾。可以根據函式引數的型別,個數,以及修飾函式const,這就使得函式可以過載。同理,模板也是可以實現的,針對不同型別的實參來產生對應的特化的函式,通過增加修飾,使得不同的型別引數的函式得以區分。

動態多型的實現

動態多型靠執行時的型別檢查,從而來進行函式的繫結。宣告乙個類時,如果類中有虛方法,則自動在類中增加乙個虛函式指標,該指標指向的是乙個虛函式表,虛函式表中存著每個虛函式真正對應的函式位址。動態多型採用一種延遲繫結技術,普通的函式呼叫,在編譯期間就已經確定了呼叫的函式的位址,所以無論怎樣呼叫,總是那個函式,但是擁有虛函式的類,在呼叫虛函式時,首先去查虛函式表,然後在確定呼叫的是哪乙個函式,所以,呼叫的函式是在執行時才會確定的。

5.什麼是封裝

封裝就是把資料和實現操作的**(函式)集中起來放在物件內部(類),並盡可能的遮蔽物件的內部細節,不能從外部直接訪問或修改這些資料(如類中的 private 資料)及**(如類中函式的**在外部呼叫函式時是不可以修改的,是能使用其提供的功能)。使用乙個物件的時候只需要知道它向外界提供的介面形式(函式名+引數)而無需知道他的資料結構細節和實現操作的演算法。

封裝的含義:一是將有關的資料和操作**封裝在乙個物件中,各個物件相互獨自、互不干擾。而是將物件中的某些資料與操作**對外隱藏,只留下少量介面,以便於外界聯絡,接收外界訊息。

6.什麼是訊息 

乙個物件與另乙個物件之間的互動稱之為訊息。物件之間的聯絡只能通過訊息傳遞來進行,且具有以下 3 個性質:

①同乙個物件可以接收不同形式的多個訊息,做出不同的相應。

②相同形式的訊息可以傳遞給不同的物件,所做出的相應可以是不同的。

③對訊息的相應並不是必須的,物件可以響應訊息,也可以不響應。

實現訊息傳遞的方法:

呼叫物件中的函式就是向該物件傳送乙個訊息,要求該物件實現某一行為(功能、操作)。物件所能實現的行為(操作),在程式設計中成為方法,他們是通過呼叫相應的函式(c++中成為成員函式)來實現的。

C 的繼承和多型的區別

c 的繼承和多型的區別 狼之行 繼承 是指子類按照一定方式繼承基類的成員及函式。如果此時定義乙個基類的指標,並把子類的物件傳給這個基類指標.假如子類和基類都有乙個相同函式。那麼這個指標呼叫這個函式則到底呼叫的是基類的函式還是子類的函式呢?答案是 基類的函式。因為函式的呼叫取決於基類的指標型別,而不是...

C 多型及多型模型

c 多型及多型模型1 虛函式 類的成員函式前面加上virtual關鍵字,則這個成員函式是虛函式 虛函式是存在 段的,虛函式的指標是存在虛表中的 注意 必須是類的成員函式,靜態成員函式不能定義成虛函式 2 重寫 覆蓋 在子類中定義了乙個和父類中完全相同的成員函式 函式名,引數,返回型別完全相同,但協變...

c 基礎(六)多型及過載和重寫的區別

多型是物件導向三大特徵之一,是最強大,也是相對來說比較難的乙個特徵。除了大型的專案架構中大量的使用了多型,有些設計模式其實也是多型的乙個體現。那麼多型到底是什麼,它是怎麼在通過 體現出來的呢?在程式設計中,有乙個名詞叫重寫 override 實現重寫的這一過程就是多型的一種體現。那麼如何實現重寫呢?...