前言:在上篇文章中已經討論了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...