C 物件模型探索 系列之類與物件概述

2021-10-14 07:07:04 字數 2384 閱讀 9122

類與物件簡介

我們知道c語言中,資料與處理資料的操作(函式)是分開進行宣告。c++中通過抽象資料型別(abstact data type, adt)來將資料與函式繫結在一起。這種封裝方式並不會給c++的布局帶來成本,與c語言的一致。c++在記憶體布局以及訪問時間上主要受virtual帶來的影響:

c++封裝的類中,主要分為兩大塊:成員變數、成員函式。下面我們會對這兩大塊進行分析。

c++類物件模型的記憶體布局:

c++類物件記憶體分布模型可以看到,影響類物件的大小或者說記憶體分布,主要是在非靜態成員變數與虛函式模組。其它的都是類統一分布,不會對物件的大小有所改變。

類與物件的關聯與區分

關於類與物件的區別:我想是不是可以這麼解釋,物件是類的例項化。對於單個類的例項化物件的記憶體分布大小只與非靜態成員變數與虛函式有關(注:這裡不包含繼承關係,只討論單個類情況)。

靜態變數、成員變數屬於類還是物件?

在這裡我為什麼沒有把靜態的成員變數與成員函式叫做靜態成員函式或者靜態成員變數,主要是因為靜態的與非靜態的初始化有著不同的意義。對於靜態的說,類就可以當做與作用域空間,類似於namespace的概念。

靜態函式、成員函式、虛函式屬於類還是物件?

靜態成員變數靜態成員函式對於物件來說,都不會在佔據物件的記憶體空間,相當於作用域namespace一致。成員函式也不佔據物件的記憶體空間,成員函式只屬於類。

相關測試案例類與物件

#include

using

namespace std;

class

base

void

memberfunction()

public

:static

int static_member_variable;};

intmain

(void

)

#include

using

namespace std;

class

base

int member_variable;

// 只有乙個int成員變數的物件模型,所佔4個位元組};

intmain

(void

)

#include

using

namespace std;

class

base

int static_member_variable;

// 只有乙個int成員變數的物件模型,所佔4個位元組};

class

derive

:public base // 單繼承

;class

base2

;class

multiderive

:public base,

public base2

;int

main

(void

)

#include

using

namespace std;

class

base

;class

derive

:virtual

public base

;int

main

(void

)

上述的幾種情況,分別介紹類與物件在各個狀態下的所佔據的記憶體空間布局。通過驗證,我們可以得出:類物件模型所佔的記憶體空間布局主要依靠非靜態成員變數與虛函式,繼承體系下主要是虛繼承。類中成員函式、靜態成員函式、靜態成員變數都不會占用物件的記憶體布局。 小結

關於c++類物件模型中,簡單介紹幾種對於類物件模型記憶體布局所佔的影響。類中成員函式與成員變數是主要分布內容。而物件模型中記憶體布局只與非靜態成員變數與虛函式有關。 參考

物件作用域

探索C 物件模型

前兩篇部落格主要了解了多型和繼承的基礎,可是當我們在學習多型和繼承的時候,難免會碰到很多關於c 物件模型的問題,例如菱形繼承中的資料冗餘如何解決,虛基表是如何解決菱形繼承中資料冗餘問題等,這一篇部落格我們以c 中多型與繼承為基礎,探索c 物件模型。首先我們先來看看虛函式,虛函式就是在函式名前面加vi...

C 學習 物件模型之類及物件記憶體模型

使用c 開發一年多,從今天開始系統性的總結下c 一些知識點,畢竟c 語言特性複雜而龐大,很難短時間全部掌握。首先類可以模擬c語言的struct結構體,單純的宣告乙個類a,如果a沒有被例項化,那麼a是不會占用記憶體空間。這裡的類可以理解為一種特殊資料結構型別。再來談談物件,乙個類例項化後就變成乙個物件...

C 之類與物件

都說c 是乙個完全物件導向的語言,我 那天很自豪的也和我說了,好像這個語言很令人振奮。以前學習vb的時候總是感覺很吃力,因為自己對 基本根本沒有親和力,在以前如果給自己一大批 讓自己按著敲,那麼這個對於當時的我來說肯定是世界上最幸福的事情了。很喜歡安靜的敲 的感覺 現在越來越能體會到,是被人賦予靈魂...