C 語言總結(三)

2021-08-02 00:25:03 字數 2756 閱讀 2539

在c語言中,變數和函式」分開來宣告的」,也就是說,語言本身並沒有支援「資料」和「函式」之間的關聯性我們吧這種方法稱為「程式性的」,由一組「分布在各個以功能為導航的函式中」的演算法驅動,他們處理的是共同的外部資料。

在c++中,實現了封裝,資料和處理資料的函式是分開儲存的。

c++類物件中的變數和函式是分開儲存的。

靜態資料成員並不儲存在類物件中;非靜態成員函式不儲存在類物件中;靜態成員函式也不儲存在類物件中。

c++規定,this指標是隱含在物件成員函式內的一種指標。當乙個物件被建立後,它的每乙個成員函式都含有乙個系統自動生成的隱含指標this,用以儲存這個物件的位址,也就是說雖然我們沒有寫上this指標,編譯器在編譯的時候也是會加上的,因此this也稱為」指向本物件的指標」,this指標並不是物件的一部分,不會影響sizeof的結果

this指標永遠指向當前物件

靜態成員函式內部沒有this指標,靜態成員函式不能操作非靜態成員變數

this指標的使用

用const修飾的成員函式時,const修飾this指標指向的記憶體區域,成員函式體內不可修改本類的任何普通成員變數

當成員變數型別符前用mutable修飾除外

const修飾的物件被稱為常物件

友元函式是一種特權函式,c++允許這個特權函式訪問私有成員。

友元類注意

運算子過載,就是對已有的運算子進行定義,賦予其另一種功能,以適應不同的資料型別。

運算子過載只是一種語法上的方便,也就是它只是另一種函式呼叫的方式

在c++中,可以定義乙個處理類的新運算子,這中定義 很像乙個普通的函式定義,只是函式的名字由關鍵字operator及其緊跟的運算子組成。差別僅此而已,它像任何其他函式一樣也是乙個函式,當編譯器遇到適當的模式時,就會呼叫這個函式。

定義過載的運算子就像定義函式,只是該函式的名字是operator@,這裡的@代表了被過載的運算子,函式的引數個數取決於兩個因素

c++最重要的特徵是**重用,通過繼承機制可以利用已有的資料型別來定義新的資料型別,新的類不僅擁有舊類的成員,還擁有新定義的成員。

派生類中的成員,包含兩大部分:

派生類定義格式:

class 派生類名 : 繼承方式 基類名

三種繼承方式:

public : 公有繼承

private : 私有繼承

protected : 保護繼承

從繼承源上分:

單繼承:指每個派生類只繼承乙個基類的特徵

多繼承:指多個基類派生出乙個派生類的繼承關係,多繼承的派生類直接繼承了不止乙個基類的特徵。

繼承中的構造和析構

繼承中同名成員的處理方法

任何時候重新定義基類的任何乙個函式,子類中這種函式的任何版本都會被隱藏(非覆蓋,可通過類作用域運算子呼叫)

不能自動繼承的函式

在繼承過程中,如果沒有建立這些函式,編譯器會自動生成他們

我們可以從乙個類繼承,我們也可以同時從多個類繼承,這就是多繼承。但是由於多繼承是非常受爭議的,從多個類繼承可能會導致函式、變數等同名導致較多的歧義。

多繼承帶來的一些二義性的問題,可以使用顯示指定那個基類的版本。

菱形繼承和虛繼承

兩個派生類繼承同乙個基類而又有某個類同時繼承者兩個派生類,這種繼承被稱為菱形繼承,或者叫做鑽石繼承。

這種繼承會帶來一些問題:比如產生二義性,重複繼承相同的函式和資料。

對於這種問題所帶來的兩個問題,c++為我們提供了一種方式,採用虛基類。

採用虛繼承的時候,編譯器做了一些幕後工作,使得派生類中增加了乙個vbptr,vbptr指向了一張表,這張表儲存了當前的虛指標相對於虛基類的首位址的偏移量

當使用虛繼承的時候,虛基類是被共享的,也就是在繼承體系中無論被繼承了多少次,物件記憶體模型中均只會出現乙個虛基類的子物件。即使共享虛基類,但是必須要有乙個類來完成基類的初始化,同時還不能夠重複進行初始化。c++標準中選擇在每一次繼承子類中都必須書寫初始化語句,但是虛基類的初始化是由最後的子類完成,其他的初始化語句都不會呼叫。

多型是物件導向程式設計語言中資料抽象和繼承之外的第三個基本特徵。

多型提供介面與具體實現之間的另一層隔離,從而將「what」和「how」分離開來。多型性改善了**的可讀性和組織性,同時也使建立的程式具有可擴充套件性,專案不僅在最初建立時期可以擴充套件,最後當專案在需要有新的功能時也能擴充套件。

物件可以作為自己的類或者作為它的基類的物件來使用,還能通過基類的位址來操作它,取乙個物件的位址(指標或引用),並將其作為基類的位址來處理,這種稱為向上型別轉換。

也就是說:父類引用或指標可以指向子類物件,通過父類指標或引用來操作子類物件。

c++動態多型性是通過虛函式來實現的,虛函式允許子類重新定義父類成員函式,而子類重新定義父類虛函式的做法稱為覆蓋,或者稱為重寫。

對於特定的函式進行動態繫結,c++要求在基類中宣告這個函式的時候使用virtual關鍵字,動態繫結也就是對virtual函式起作用。

c++如何實現動態繫結

當編譯器發現我們的類中有虛函式的時候,編譯器會建立一張虛函式表,把虛函式的函式入口位址放到虛函式表中,並且在類中秘密增加乙個指標,這個指標就是vpointer,這個指標指向物件的虛函式表。在多型呼叫的時候,更具vptr指標,找到虛函式表來實現動態繫結。

多型成立的條件

在基類中加入至少乙個純虛函式,使得基類稱為抽象類

C語言總結(三)

二級指標也是指標變數,指標都是儲存位址的變數,而二級指標是儲存所指向的一級指標變數的位址,通過二級指標的解引用可以得到一級指標變數。二級指標作為函式引數 作用 在函式外部頂乙個指標p,在函式內給指標賦值,函式結束後對指標p神效,那麼我們就需要二級指標。pt1 0x003 pt2 0x002 p 0x...

C語言總結(三結構)

結構有三種,順序結構,選擇結構,迴圈結構。這三種就可以滿足所有程式設計的框架。選擇結構有兩種if和 if.else 的巢狀使用非常靈活,當然 if也可以單獨使用,題目中總會有 else 的判斷,規則就是和最近的 if配對。switch witch 表示式 其語義是 計算表示式的值。並逐個與其後的常量...

c語言 c語言常見程式設計題總結(三)

30.求乙個數的二進位制序列中1的個數。include int main printf count d n count return 0 include int main num num 2 num num 1 i 1 printf count d n count return 0 x x x 1 ...