C 物件導向模型分析(1)

2021-09-28 19:53:19 字數 2178 閱讀 9188

前言:在上篇文章中已經討論了c++的靜態成員變數和靜態的成員函式。c++靜態成員變數成員函式。

c++物件模型可以概括為以下2部分:

語言中直接支援物件導向程式設計的部分,主要涉及如建構函式、析構函式、虛函式、繼承(單繼承、多繼承、虛繼承)、多型等等。

對於各種支援的底層實現機制。

在c語言中,**「資料」和「處理資料的操作(函式)」是分開來宣告的,也就是說,語言本身並沒有支援「資料和函式」之間的關聯性。**在c++中,通過抽象資料型別(abstract data type,adt),在類中定義資料和函式,來實現資料和函式直接的繫結。

概括來說,在c++類中有兩種成員資料:static、non-static;三種成員函式:static、nonstatic、virtual。

c++中的class從物件導向理論出發,將變數(屬性)和函式(方法)集中定義在一起,用於描述現實世界中的類。但是從計算機的角度,程式依然由資料段和**段構成,這一點和c語言是一樣。

所以c++編譯器是如何完成物件導向理論到電腦程式的轉化? how 換句話:c++編譯器是如何管理類、物件、類和物件之間的關係。

我們引入乙個**來簡單的做個測試:

#include

"iostream"

using

namespace std;

class

testclass1

;class

testclass2

//4void

setk

(int val)

//4protected

:private:}

;struct teststruct1

;struct teststruct2;//

intmain()

輸出結果是

要分析完這個原因,必須明白sizeof的特性 c++ 類的sizeof大小分析

通過上面的案例,我們可以的得出幾個結論:

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

成員變數:

普通成員變數:儲存於物件中,與struct變數有相同的記憶體布局和位元組對齊方式

靜態成員變數:儲存於全域性資料區

成員函式:儲存於**段中。

這樣就存在乙個問題:很多物件共用一塊**?**是如何區分具體物件的那?

#include

"iostream"

using

namespace std;

class

testclass1

;int

getmyval()

;static

void

printfval()

private

:int myval;};

intmain()

#include

"stdlib.h"

#include

"stdio.h"

struct testclass1

;void

testclass1_ini

(testclass1 *pthis,

int val)

inttestclass1getmyval

(testclass1 *pthis)

void

testclass1printfval()

intmain()

c++類物件中的成員變數和成員函式是分開儲存的。c語言中的記憶體四區模型仍然有效!

c++中類的普通成員函式都隱式包含乙個指向當前物件的this指標。

靜態成員函式、成員變數屬於類

靜態成員函式與普通成員函式的區別

靜態成員函式不包含指向具體物件的指標(共有)

普通成員函式包含乙個指向具體物件的指標(物件判斷)

C 物件導向模型

摘要 c 物件導向模型的主要特徵是 1 類和封裝性 2 繼承性 3 多型性。多型性在前兩者和虛函式的基礎上實現,而虛函式正是實現物件導向的核心機制。關鍵字 虛函式 繼承 多型 在物件導向的程式設計中,系統被看成由多個物件組成,通過物件之間的通訊形成了系統。其主要特徵是 1 類和封裝性 2 繼承性 3...

C 物件導向模型

摘要 c 物件導向模型的主要特徵是 1 類和封裝性 2 繼承性 3 多型性。多型性在前兩者和虛函式的基礎上實現,而虛函式正是實現物件導向的核心機制。關鍵字 虛函式 繼承 多型 在物件導向的程式設計中,系統被看成由多個物件組成,通過物件之間的通訊形成了系統。其主要特徵是 1 類和封裝性 2 繼承性 3...

物件導向模型分析(繼承,多型)

include include using namespace std class a struct b int main 類中的成員函式位於 段中 呼叫成員函式時物件位址 this 訪問成員變數 成員函式通過物件指標訪問成員變數 c 語法隱藏了物件位址的傳遞 繼承物件模型 include incl...