後台開發核心技術02物件導向C

2021-10-05 12:48:55 字數 4529 閱讀 4896

簡介:本文章主要從物件導向程式設計的三大特點來敘述:封裝、繼承、多型

1)struct 和 class 在c++中唯一的區別就是預設的訪問許可權不同,struct預設訪問許可權是public的,而class是private的;

2)乙個類中如果定義了全是預設引數的建構函式,那麼就不能再定義過載函式了。(二義性)

3)靜態成員靜態成員是類的成員,而不是某個物件的成員,類的靜態成員擁有一塊單獨的儲存區,不管建立了多少該類的物件,靜態成員都是唯一的乙個,共享的,這就為不同的物件提供了一種相互通訊的辦法(與不同程序間共享記憶體的程序通訊方式類似)。注意 :靜態成員的定義必須出現在類的外部且只能定義一次,所以在標頭檔案中定義靜態變數容易引起重複定義的錯誤;無論是基類還是派生類都可以改變靜態變數的值,說起來挺複雜,其實**表述簡單的多:

#include

using

namespace std;

class

base

;int base::var=10;

class

derived

:public base

;//派生類是空的,直接繼承

記憶體的占用:類的一般資料成員是不占用記憶體空間的,只有在定義物件時才會為物件的資料成員分配空間。但是類的靜態資料成員不屬於某乙個物件,在所有物件之外單獨開闢一段記憶體來存放。

靜態成員函式:與普通成員函式的根本區別是:非靜態成員函式有 this 指標,靜態成員函式沒有 this 指標。靜態成員函式一般是用來處理靜態資料成員的,因為靜態資料成員不屬於某乙個物件,所以不能用 this 指向靜態資料成員,只能用靜態成員函式來處理;

4)物件的儲存空間:乙個比較權威的定義:非靜態成員變數綜合加上編譯器為了cpu計算做出的資料對齊處理和支援虛函式所產生的負擔 的總和。

下面來看看資料成員、成員函式、建構函式、析構函式、虛函式的空間占用情況:

#include

using

namespace std;

class

cbox

;//空的

int main()

//執行結果是 1

空型別物件不包含任何資訊,大小應該為0,但是當宣告該型別的物件的時候,它必須在記憶體占用一定空間,否則無法生成物件,c++每個空型別的例項占用 1 byte;

class

cbox

;int

main()

//執行結果 12

三個int 型成員變數,3*4byte=12byte。

class

cbox

;int

main()

//執行結果 12

三個普通資料成員加乙個靜態成員,結果仍然是12,由此可見,靜態成員並不占用物件的記憶體,而是乙個單獨的記憶體;

class

cbox;~

cbox()

;};int

main()

//執行結果 1

三個函式,乙個析構函式,乙個建構函式,乙個普通函式,結果仍然是 1 ,說明函式是不占用物件空間的,所有物件共用乙個函式位址,函式單獨占用空間。

class

cbox;}

;int

main()

//執行結果 8

乙個虛函式,占用空間8,事實上,編譯器為了支援虛函式,會產生額外的負擔,這正是虛函式表的指標大小(

64位的機器中指標變數佔8byte),同樣,繼承虛基類也是一樣有虛表,虛指標。

析構函式與建構函式的執行順序

在同乙個環境下(比如都在區域性函式中),先建立的物件先構造,後建立的物件後構造,先構造的後析構,後構造的先析構。如果在函式中定義的靜態區域性物件,則程式在第一次呼叫時構造,直到main函式退出或者呼叫exit函式結束程式時,才呼叫析構函式。

5)繼承

公用繼承:基類的公用成員和保護成員在派生類中保持原有訪問的屬性,其私有成員仍為基類私有;

私有繼承:基類的公用成員和保護成員在派生類中成了私有成員,其私有成員仍然為基類私有;

受保護的繼承:基類的共用成員和保護塵緣在派生類中成了保護成員,其私有成員仍然為基類私有;

派生類的建構函式和析構函式:

派生類資料成員由:基類資料成員和派生類新增成員共同組成,派生類的資料成員中還有可能包含其他類的物件;因此構造派生類的物件時,必須對基類資料成員、新增資料成員和成員物件資料成員進行初始化。派生類建構函式的一般格式為:

派生類::派生類 (引數): 基類名1> (參數列1>), ..

.... ,基類名n> (參數列n>),

子物件名1>(參數列n+1>), ..

.... ,

子物件名m>(參數列n+m>)

注意點:1、對基類成員和子物件成員的初始化必須在成員初始化表中進行,新增成員的初始化既可以在成員初始化表中進行,也可以在建構函式體中進行。2、構造順序:先呼叫基類建構函式,再呼叫子物件建構函式,最後對派生類的建構函式體構造。

6)派生類的建構函式與析構函式的呼叫順序:

1 、 基類建構函式。如果有多個基類,則建構函式的呼叫順序是某類在類派生表中的出現順序,而不是他們在成員初始化表中的順序。

2 、 成員類物件建構函式。如果有多個成員類物件,構造順序是在類中被宣告的順序,而不是在初始化列表中的順序。

3 、 派生類建構函式

而析構函式與建構函式恰恰相反!

7)類的多型

虛函式配合類的繼承使用,實現多型;

虛函式:虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。

由於基類指標可以指向派生類中的基類部分,加上派生類重新定義的虛函式把基類的虛函式同名覆蓋了,實現了乙個型別的指標指向不同類的函式產生不同的響應,這就是多型。

第一行執行的是基類,第二行執行的是派生類,實現了多型。記住一點,虛函式的主要作用是在繼承的過程中可以同名覆蓋

8)純虛函式

純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類必須要定義自己的實現方法。實現方法:在函式原型後加 「=0」,如下:

//虛函式的定義

virtual

void

fun();

//純虛函式的定義

virtual

void

fun()=

0;

含有純虛函式的類稱為抽象類,它不能生成物件。

9)析構函式和建構函式的虛構函式

首先,建構函式不能宣告為虛函式!析構函式一般宣告為虛函式;

建構函式:在編譯器構造物件時,必須知道物件的確切型別,才能正確的生成物件;其次,在建構函式執行之前,物件並不存在,無法使用指向此物件的指標來呼叫建構函式。

析構函式:當派生類物件經過乙個基類的指標被刪除了,這時候基類指標指向的只是派生類中的基類部分,同時析構函式也是執行的派生類中的基類部分,會導致派生類的新增資料部分沒有被銷毀,造成記憶體洩漏。

物件導向核心技術

只支援單繼承 即乙個子類只能繼承乙個父類 child extends parents重寫父類 重寫時不能降低方法的修飾許可權範圍,父類的protected可以改為public 但不能private parents a new child 父類宣告,子類實現 child a new parents 這...

java物件導向核心技術

1 內部類 內部類可以節省編譯後的位元組碼,class檔案的大小,而在實現監聽的時候,採用內部類很容易實現,但使用內部類會導致結構不清晰。1 成員變數內部類 public class out private int i 0 private void g private class inner voi...

後台開發 核心技術與應用實踐

常用類庫 在c 中,臨時物件都是const型別的。可以使用union 聯合 判斷系統是大端 big endian 還是little endian 小端 只能把列舉賦值列舉變數,不能把元素的數值直接賦值列舉變數。共用體以最長的位元組為準,考慮記憶體對齊。結構體以內建型別的最小公倍數對齊。編譯階段 g ...