c++物件導向的三大特性:封裝、繼承和多型。
封裝:將資料和方法寫進類中,避免外界干擾和保護資料,使得**模組化。
繼承:乙個類(派生類)繼承另乙個類(基類)的所有屬性和方法,同時它還可以有另乙個類不具備的方法和屬性(可拓展)。
多型:c++多型性是通過虛函式來實現的,虛函式允許子類重新定義成員函式(覆蓋或者稱為重寫)。
建構函式:在物件定義時呼叫。建構函式與類同名,不具有返回值。
如果類中沒有定義建構函式,編譯器將自動生成預設建構函式;如果自定義了建構函式,編譯器將不再自動生成預設建構函式,但可以根據需要自行定義。
初始化列表:在建構函式函式名後可以使用初始化列表對類成員資料進行初始化,初始化順序由宣告順序決定,與列表中的順序無關。初始化列表只能使用在建構函式中。
classclassname
//使用初始化列表
classname():a(0), b(0.0
) }
拷貝建構函式:建構函式的引數是自身型別的引用,且額外引數都有預設值,實現物件的複製。
涉及到指標型別的變數複製時,存在兩種拷貝方式:深拷貝和淺拷貝
深拷貝:將指標所包含的記憶體空間中的內容也進行拷貝
c++提供的預設拷貝建構函式和賦值都是淺拷貝操作,涉及指標操作時進行重寫,避免產生空指標異常。
移動建構函式:與拷貝建構函式相似,區別在於第乙個引數是右值引用。移動建構函式不分配任何新記憶體,它接管給定的物件中的記憶體。在接管記憶體後,它將給定物件中的指標都置為nullptr。移動源物件會被銷毀,意味著將在其上執行析構函式。
classclassname
析構函式:物件被銷毀時自動被呼叫,先執行函式體,然後銷毀成員,成員按初始化順序的逆序進行銷毀。析構函式不接受引數,乙個類有唯一乙個析構函式。
classclassname
拷貝賦值運算子:對類物件進行賦值操作,將乙個物件的值複製給另乙個存在的物件。
如果類未定義自己的拷貝賦值運算子,編譯器會生成乙個。
移動賦值運算子:引數為該類型別的右值引用,將給定物件的值複製給另乙個存在的物件。與移動建構函式相同,新物件接管給定物件的記憶體,移動源物件會被銷毀。
classclassname
過載的運算子是帶有特殊名稱的函式,函式名是由關鍵字 operator 和其後要過載的運算子符號構成的。與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。
classclassname
使用關鍵字virtual宣告虛函式。虛函式是實現多型的關鍵,派生類可以重寫(覆蓋)基類的虛函式。
重寫條件:派生類的函式名稱與基類的虛函式名稱相同,引數列表也要相同,返回值也相同(若基類的函式返回基類類型別的指標或者引用,派生類可以返回相應的派生型別)
虛函式指標:指向虛函式的指標,具體是在派生類裡的實現,當派生類呼叫虛函式的時候,實際上是通過呼叫該虛函式指標從而找到介面。虛函式指標對外部是完全不可見。
虛函式列表:每個擁有虛函式的類的虛函式指標按照一定的順序排列起來構成列表。派生類重寫的虛函式會以新的虛函式指標覆蓋舊指標,派生類新宣告的虛函式會跟在表後。多重繼承會以繼承順序排列循函式指標。
靜態聯編與動態聯編
將源**中的函式名解釋為執行特定的函式**塊稱為聯編。在編譯過程中完成的聯編稱為靜態聯編(早期聯編)。虛函式需要在程式執行時才能正確地選擇虛函式**,稱為動態聯編(晚期聯編)。
建立乙個類時,可以指定新建的類繼承了乙個已有的類的資料成員和成員函式。已有的類稱為基類,新建的類稱為派生類。
派生類不繼承基類的建構函式、析構函式、拷貝建構函式、過載運算子和友元函式。
繼承允許我們依據另乙個類來定義乙個類,這使得建立和維護乙個應用程式變得更容易,也達到了重用**功能和提高執行效率的效果。
繼承中可以使用基類的指標(引用)來指向(引用)派生類的物件,反之不行。可以將派生類的指標或引用轉換為基類的指標或引用。
為了能夠使用基類的指標指向派生類的物件,並通過基類指標銷毀派生類物件,可以在基類中使用虛析構函式,此後通過基類指標delete派生類物件時,會呼叫派生類的析構函式,再呼叫基類的析構函式。
classaclass b : public
a
訪問控制
public
protected
private
基類本身tt
t派生類tt
f外部tf
f繼承型別
繼承型別有公有繼承(public)、保護繼承(protected)和私有繼承(private),通常使用公有繼承。
成員\繼承方法
public
protected
private
public
public
public
private
protected
protected
public
private
privatexx
x純虛函式:通過在虛函式宣告處分號之前新增=0將虛函式定義為純虛函式,無需提供函式的定義。
含有或未經覆蓋直接繼承純虛函式的類稱為抽象基類,抽象基類負責定義介面,故抽象基類不能被例項化,使用它來建立派生類,在派生類中對純虛函式進行重寫。
//抽象基類
classa
class b : class
a}
c 物件導向筆記
繼承形式如下 class derived class access specifier base class當乙個類派生自基類,該基類可以被繼承為 public protected 或 private 幾種型別。繼承型別是通過上面講解的訪問修飾符 access specifier 來指定的。我們幾乎...
C C 筆記 C 物件導向
1 虛函式 定義虛函式的類稱為多型類,編譯器會為多型類自動生成乙個虛函式表vtable。vtable是乙個函式指標陣列,用來描述每個類的虛函式位址。多太類同時還有乙個指向虛函式表的指標,為類的物件訪問虛函式。vtable中還應包含typeinfo的資訊,用來做rtti。派生類的vtable應該相容其...
c 物件導向筆記(1)
偶然一次看到揚中科講的c 物件導向,覺得講得挺好的,很適合初學者,筆記一下 1,類成員 字段,方法,屬性 2,成員的訪問級別 封裝 public private internal protected public class person get net3.x 簡化了屬性語法set get,編譯器會...