1、空類:
#pragma once
class cnullclass
;
檢視cnullclass例項的大小:
int _tmain(int argc, _tchar* ar**)
輸出結果顯示,cnullclass例項的大小為1,即空類的例項只佔乙個位元組,且該位元組的內容並無實質意義。
2、只包含方法成員的類
#pragma once
class c******class
;#include "stdafx.h"
#include "******class.h"
c******class::c******class()
c******class::~c******class()
void c******class::memthod1()
#include "stdafx.h"
int _tmain(int argc, _tchar* ar**)
執行結果:
由此可知,乙個類的成員函式並不影響類的實際大小。
3、包含資料成員的類
class conememberclass
~conememberclass(){};
void foo();
void setdata2(int data2);
private:
int m_ndata;
int m_ndata2;
};void conememberclass::foo()
void conememberclass::setdata2(int data2)
int _tmain(int argc, _tchar* ar**)
執行結果:
記憶體結構如下:
可見,這種情況下,物件的儲存內容為資料成員的值,按照宣告中的順序。
4、簡單繼承類:
class csonclass :
public conememberclass
;csonclass::csonclass()
csonclass::~csonclass()
void csonclass::foo()
int _tmain(int argc, _tchar* ar**)
執行結果:
son class member - data : 3
記憶體結構為:
在記憶體中,首先存放的是基類的成員,然後是派生類的成員。如果派生類繼續向下派生,則其子類的資料繼續存放在後續位址中。
5、虛繼承的類:
#include "onememberclass.h"
class virtualinheritclass : virtual public conememberclass
;
執行結果:
記憶體結構:
可見,在虛繼承的情況下,類的最前面多了8個位元組的資料,這些位元組中儲存了乙個指標變數,指向乙個關於虛基類偏移量的陣列,偏移量是關於虛基類資料成員的偏移量。
另外對於某乙個類繼承自多個父類(b和c),這些父類又虛擬繼承自乙個共同的父類(a)的情況,記憶體結構如:(偏移量指標)(b的資料成員)(偏移量指標)(c的資料成員)(本物件的資料成員)(基類a的資料成員)。虛擬繼承利用虛基類偏移量表指標,使得即使某各類被重複繼承,基類的成員也只存在一次。
6、帶有虛函式的情況
第一種,乙個空類中宣告了乙個虛函式:
class cvirtualnull
;cvirtualnull::cvirtualnull()
cvirtualnull::~cvirtualnull()
void cvirtualnull::foo()
在這種情況下,cvirtualnull物件的大小為4,其內容只有乙個指標,指向該類的虛函式表。
第二種,某個子類繼承了乙個宣告了虛函式的父類:
在單繼承情況下,當子類自己定義了虛函式時,依然只有乙個虛函式表(繼承自父類),子類的虛函式指標將新增到這個虛函式表的後面。但當多繼承時,子類中可能包含多個虛函式表,分別對應每乙個父類。
第三種,包含虛函式類的虛繼承
class virtualinheritance;};
class sonclass1 : public virtual virtualinheritance;};
class sonclass2 : public virtual sonclass1
;};
在 visual studio中的輸出結果為:
對於virtualinheritance類,其包含乙個虛函式表+自身成員,大小為8。
對於sonclass1類,由於是虛擬繼承因此包含乙個虛函式偏移指標;由於自身存在虛函式,因此包含乙個指向虛函式表指標;隨後是自身的資料成員,最後是完整的父類物件。sonclass2情況與此類似。
總結:
1,普通單繼承,只需將自身成員變數的大小加上父類大小(父類中 有虛函式,子類中不管有沒有)若父類沒有虛函式,則子類大小需要加上指向虛表的指標大小。
2,普通多繼承,若幾個父類都有虛表,則子類與第乙個父類公用乙個虛表指標,其他有幾個有虛函式的父類則就有幾個虛表指標。
3,虛擬單繼承,此時若子類有虛函式則加上乙個自身的虛表指標的大小,(若沒有則不加)再加上自身的成員變數大小,還要加上乙個虛類指標ptr_sonclass_fatherclass,最後加上父類的大小。
4,多重虛擬繼承,此時若子類有虛函式則加上乙個自身的虛表指標的大小,(若沒有則不叫)再加上自身的成員變數大小,還要加上 乙個公用的虛類指標(不管有幾個虛擬父類,只加乙個),在加上所有父類的大小。
5、普通、虛擬混合多繼承,此時子類的大小為自身大小(若子類或普通父類有虛函式,則為成員變數+虛表指標大小;若都沒虛函式,則就為成員變數大小),加上乙個虛類指標大小,在加上虛擬父類的大小,在加上普通父類的大小(除虛表指標,因為它和子類公用乙個虛表指標)。
C 陣列 溫故而知新
using system using system.collections.generic using system.linq using system.text namespace 陣列 陣列初始化器只能在宣告陣列變數時使用,不能在宣告陣列之後使用 int iii new int 用花括號初始化陣...
C 溫故而知新,好吃
這一周,在業餘的時候,學習和 了c 中的知識點,一木不成林,一水難成海。1.net 是乙個開發平台,它幹著秦始皇的事,統一了程式設計類庫,提供了網路通訊標準可擴充套件標記語言的完全支援。方便你我他,大家使好它。microsoft.net 是microsoft xml web services平台。2...
溫故而知新 C語言 遞迴
遞迴。是的,差不多就是這種感覺。上面就是類似遞迴的顯示表現。2017 10 24更新 遞迴這個問題放了很久。也沒有寫。大概是自己還沒有好好理解吧。在這裡寫下自己理解的全部。一 何為遞迴。字面意義,分開看。有傳遞。有回歸。或者歸還。淺顯的理解就是呼叫自己。那麼遞迴可以呼叫自己,肯定是有一些約束的條件。...