C 物件模型 關於物件的概述

2021-05-21 22:44:34 字數 995 閱讀 9786

一、c++物件模型中,非靜態資料成員被配置於每乙個物件之內,而靜態資料成員以及靜態與非靜態成員函式都是北被放置在所有class object之外的。其他的virtual function (虛函式) 則是以下面兩個步驟來支援:

1. 每個類產生一堆指向虛函式的指標放置在虛表之中;

2. 每個class object之內被新增了乙個指標vptr,指向相關的虛表。vptr的設定和重置都由建構函式、析構和拷貝分配運算子自動完成。每乙個class關聯的type_info object通常放在**的第乙個slot處。

(在程式內部,對虛函式的訪問全部都是被轉換成vptr對虛表的訪問。)

二、多型的性質只有通過指標或者引用才能發揮作用;

多型的主要用途是經由乙個共同的藉口來影響型別的封裝,這個介面通常被定義在乙個抽象的base class中。

三、表現乙個類物件需要的記憶體空間由以下幾點決定:

1. 其非靜態資料成員的總和大小;

2. 加上任何由於系統最小表示大小的記憶體填充需求而附加的空間;

3. 加上為了支援virtual而由內部產生的任何額外負擔。

乙個指標不管它指向哪一種資料型別,指標本身所需的記憶體大小是固定的乙個word。加上繼承和多型以後,記憶體空間就要首先附加上基類的記憶體空間,然後再開始子類的記憶體空間計算。(子類只有乙個虛表)

四、 子類指標和父類指標有什麼不同呢?

ap所涵蓋的位址只包含b物件中的父類a所有的部分,而bp所涵蓋的位址包含整個b物件。ap是不能直接畜類b中的任何成員的,唯一例外的是通過virtual機制來實現。即ap呼叫虛函式時候,被賦予b類虛函式的特性。

可是初始化函式在將乙個物件拷貝到另乙個物件的時候,為什麼a的vptr沒有指向b的虛表呢?原來編譯器在初始化和制定操作之間做了仲裁,編譯器必須確保如果某個物件含有乙個或更多的vptrs,那些vptrs的內容不會被基類的初始化或者改變。至於為什麼a會呼叫a::fun(),這個在上面已經介紹過了。

上面內容是在閱讀《c++物件模型》時的讀書筆記,做乙個簡單的總結,以便整體的理解和以後的回顧。

C 物件模型 關於物件

關於物件 有兩種資料成員 static 和nonstatic 以及三種成員函式 static nonstatic 和virtual c 物件模型對記憶體空間和訪問時間做了優化,nonstatic 的資料成員被置於類物件之內,而 static 資料成員被置於類物件之外。函式則全部放在物件之外。下面的程...

C 物件模型 關於物件

為什麼要寫c 一欄的部落格呢?其實是為了加深理解和敦促學習,我發現只要離開寫部落格,人就變得懶散起來,每天寫的 零零散散,c 這門課程是在大二上開的,上課也就水水過去了,老師上課其實也還挺好,無奈聽不懂啊,聽不懂就不想聽啊。現在想想挺後悔的。後來由於實驗室需要,而且自己也意識到c 的重要性,於是便自...

深度探索C 物件模型 關於物件

類成員 物件模型 struct和class在定義類物件的想相同的,均可以定義private public protected,但是如果要用於模板類或模板函式,只能用class struct能保證資料成員的空間布局,而class則不一定。c 支援多型的方法 class shape class circ...