關於C 類的問題總結(一)

2021-03-31 08:56:58 字數 2261 閱讀 8031

自己在學習c++的過程中曾經碰到了許多問題,尤其是對類的學習。所以自己通過做了一些試驗,將其總結了一下,算是自己的乙個學習

總結,同樣也是想給那些正在被這些問題迷惑的人起到拋磚引玉的作用。如果在文章中有一些不對的地方,或者你有你自己的看法,歡迎批評

指標。希望我們可以共同進步。

1.空類的大小

例如:class a {};

類a的大小是多少?等於0麼?

下面我們通過乙個試驗來說明問題,程式如下:

#include

using namespace std;

class a

;int main()

;int main()

;int main()

;class b : public a

};int main()

在我的電腦上程式的輸出結果是:

size of a is = 12

address of a is = 0012ff74

size of b is = 16

address of b is = 0012ff64

the member of b address is:

address of b::m_test1 is = 0012ff64

address of b::m_test2 is = 0012ff68

address of b::m_test3 is = 0012ff70

address of b::m_trick is = 0012ff6c

注意這個結果,m_test1,m_test2,m_trick是從類a中繼承來的,m_test3是派生類的成員變數,因為如果派生類中成員變數是緊接著基類,那

麼應該m_test3的位址是0012ff6d而不應該是0012ff70,所以可以知道派生類的成員變數並不是緊接著基類成員變數後面定義的,而為什麼m_test3

的位址是0012ff70是因為在m_trick後面有3個位元組的記憶體對齊。

4.含有虛函式的類繼承

如果類中含有虛成員函式,那麼記憶體的結構會是怎樣的呢?我們通過分析程式來看看:

#include

using namespace std;

class a

virtual void fun2()

virtual void fun3()

};int main()

int gettest1() const

int gettest2() const

virtual void fun() {}

};int main()

int gettest1() const

int gettest2() const

};int main()

在我的電腦裡輸出結果是:

address of virtual pointer is = 0012ff7c

value at vritual pointer is = 0046c0c0

value at first entry of virtual table is = 0040128f

executing vritual funciton

a::fun

嗯,呼叫了虛函式,果真是通過vptr指向vtbl,vtbl儲存了虛函式的位址。

那問題又來了,虛函式是如何在記憶體中排列的?是如何來判斷虛函式表的長度的?答案是null,我們通過程式來看看:

#include

using namespace std;

typedef void (*fun)(void);

class a

在我的電腦上的輸出結果是:

address of virtual pointer is = 0012ff7c

value at vritual pointer is = 0046c15c

value at first entry of virtual table is = 00401294

value at 2nd entry of virtual table is = 004010dc

value at 3rd entry of virtual table is = 00000000

value at 4th entry of virtual table is = 663a3a41

因為我們定義了兩個虛函式,所以輸出到第三個虛函式的位址時,輸出的是0,這樣我們可以知道,確實是我剛才說的,須函式表通過null來

判斷其長度。

關於多層繼承的情況我將在後續的文章中給出。

(待續。。。)

關於C 類(一)

在類內部 宣告成員函式是必須的 在類內部定義的成員函式預設是 inline的。當建構函式寫在函式體內,該建構函式就是 inline的。若使用編譯器自動生成的預設建構函式 或自己定義乙個未進行任何操作的預設建構函式 則類中的每個成員,使用與初始化變數相同的規則來進行初始化。1 類成員,執行該型別的預設...

關於C與C 的問題總結

關於c與c 的學習總結。在c 中更強調語言的實用性,所有的變數都可以在需要使用時在定義。而在c語言中變數都必須在作用域開始的位置定義!1.在c語言中const變數只是唯讀變數,有自己的儲存空間。2.在c 中的const常量有可能分配儲存空間 當const常量為全域性變數,並且需要在其他檔案中使用 當...

關於C 巢狀類的相關問題

最近學習c 模仿的一段 過載指標運算子,有個極其重要的規則,過載函式必須返回乙個物件或者引用,並且該物件或引用對應的類中也要有過載指標的運算子。在物件呼叫 時,返回的如果是物件或引用,將繼續呼叫 直至返回乙個指標。如下 template class callinmutithread lockprox...