回歸本質
class是一種特殊的struct
成員函式也是函式,只要時函式,編譯之後就是放在**段中的
值得思考的問題
class a
;sizeof(a) = ?
class b
;sizeof(b) = ?
物件記憶體布局初探#include #include #include #include using namespace std;
#pragma pack(4)
class a };
#pragma pack()
#pragma pack(4)
struct b
;#pragma pack()
int main()
物件就是乙個特殊的結構體。可以重新解釋物件記憶體,指標修改物件內部的私有成員
struct b *p = reinterpret_cast(&a)
執行時的物件退化為結構體形式
問題1如何呼叫乙個成員函式?
答:
點 操作符。編譯器在背後做了乙個操作,將乙個位址(這個位址就是物件的位址)傳遞到成員函式內部。
問題2成員變數和成員函式時在記憶體中分開存放的,為啥成員函式就可以訪問成員變數?
答:
this指標。this 指標只能在成員函式內部使用,代表當前物件,儲存了當前物件的位址
程式設計實驗:物件本質分析
// 50—2.h
#ifndef __50_2_h__
#define __50_2_h__
typedef void demo;
demo *democreate(int i, int j);
int geti(demo *pthis);
int getj(demo *pthis);
int addvalue(demo *pthis, int value);
void demofree(demo *pthis);
#endif
// 50-2.c
#include #include #include "50-2.h"
struct classdemo
;demo *democreate(int i, int j)
return ret; }
int geti(demo *pthis) }
int getj(demo *pthis) }
int addvalue(demo *pthis, int value) }
void demofree(demo *pthis)
// test.c
#include #include "50-2.h"
int main()
輸出 12
13
c 物件模型分析
class是一種特殊的struct 在記憶體中class依舊可以看作變數的集合 class與struct遵循相同的記憶體對齊規則 class中的成員函式與成員變數是分開存放的 每個物件有獨立的成員變數 所有物件共享類中的成員函式 執行時的物件退化為結構體的形式 所有成員變數在記憶體中依次排布 成員變...
50 物件模型分析(上)
1 回歸本質 這裡寫 片2 3 c 物件模型分析 5 小結 6 用c語言實現c 中的class ifndef 50 2 h define 50 2 h typedef void demo 為了實現資訊隱藏,等價private demo demo create int i,int j int demo...
c 物件模型分析(一)
深夜睡不著覺,很痛苦。關於物件 第一部分 1.c 加上封裝之後的成本 a.成員資料 c class中的成員資料等同於c中struct中的資料 c.內聯的成員函式 擁有乙個或零個函式定義的內聯函式會在每個使用者身上產生乙個函式實體 d.virtual function機制 支援乙個有效率的 執行期繫結...