日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++对象模型分析

發布時間:2025/4/5 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++对象模型分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 class本質分析
      • 1.1 class本質
    • 2 非繼承對象模型分析
      • 2.1 非繼承對象模型分析
    • 3 繼承對象模型分析
      • 3.1 繼承對象模型
      • 3.2 多態對象模型

1 class本質分析

1.1 class本質

class是一種特殊的struct:

  • 在內存中class依舊可以看作變量的集合。
  • class與struct遵循相同的內存對齊規則。
  • class中的成員函數與成員變量是分開存放的:
    • 每個對象有獨立的成員變量。
    • 所有對象共享類中的成員函數。

值得思考的問題:

對象內存布局初探:

#include <iostream> #include <string>using namespace std;class A {int i;int j;char c;double d; public:void print(){cout << "i = " << i << ", "<< "j = " << j << ", "<< "c = " << c << ", "<< "d = " << d << endl;} };struct B {int i;int j;char c;double d; };int main() {A a;cout << "sizeof(A) = " << sizeof(A) << endl; // 20 bytescout << "sizeof(a) = " << sizeof(a) << endl;cout << "sizeof(B) = " << sizeof(B) << endl; // 20 bytesa.print();B* p = reinterpret_cast<B*>(&a);p->i = 1;p->j = 2;p->c = 'c';p->d = 3;a.print();p->i = 100;p->j = 200;p->c = 'C';p->d = 3.14;a.print();return 0; }

運行時的對象退化為結構體的形式:

  • 所有成員變量在內存中依次排布。
  • 成員變量可能存在內存空隙。
  • 可以通過內存地址直接訪問成員變量。
  • 訪問權限關鍵字在運行時失效。

2 非繼承對象模型分析

2.1 非繼承對象模型分析

對象模型分析:

  • 類中的成員函數位于代碼段中。
  • 調用成員函數時對象地址作為參數隱式傳遞。
  • 成員函數通過對象地址訪問成員變量。
  • C++語法規則隱藏了對象地址的傳遞過程。

下面用C語言實現如下C++代碼:

#include <iostream> #include <string>using namespace std;class Demo {int mi;int mj; public:Demo(int i, int j){mi = i;mj = j;}int getI(){return mi;}int getJ(){return mj;}int add(int value){return mi + mj + value;} };int main() {Demo d(1, 2);cout << "sizeof(d) = " << sizeof(d) << endl;cout << "d.getI() = " << d.getI() << endl;cout << "d.getJ() = " << d.getJ() << endl;cout << "d.add(3) = " << d.add(3) << endl;return 0; }

demo.h:

#ifndef _50_2_H_ #define _50_2_H_typedef void Demo;Demo* Demo_Create(int i, int j); int Demo_GetI(Demo* pThis); int Demo_GetJ(Demo* pThis); int Demo_Add(Demo* pThis, int value); void Demo_Free(Demo* pThis);#endif

demo.c:

#include "50-2.h" #include "malloc.h"struct ClassDemo {int mi;int mj; };Demo* Demo_Create(int i, int j) {struct ClassDemo* ret = (struct ClassDemo*)malloc(sizeof(struct ClassDemo));if( ret != NULL ){ret->mi = i;ret->mj = j;}return ret; }int Demo_GetI(Demo* pThis) {struct ClassDemo* obj = (struct ClassDemo*)pThis;return obj->mi; }int Demo_GetJ(Demo* pThis) {struct ClassDemo* obj = (struct ClassDemo*)pThis;return obj->mj; }int Demo_Add(Demo* pThis, int value) {struct ClassDemo* obj = (struct ClassDemo*)pThis;return obj->mi + obj->mj + value; }void Demo_Free(Demo* pThis) {free(pThis); }

main.c:

#include <stdio.h> #include "50-2.h"int main() {Demo* d = Demo_Create(1, 2); // Demo* d = new Demo(1, 2);printf("d.mi = %d\n", Demo_GetI(d)); // d->getI();printf("d.mj = %d\n", Demo_GetJ(d)); // d->getJ();printf("Add(3) = %d\n", Demo_Add(d, 3)); // d->add(3);// d->mi = 100;Demo_Free(d);return 0; }

3 繼承對象模型分析

3.1 繼承對象模型

繼承對象模型:

  • 在C++編譯器的內部類可以理解為結構體。
  • 子類是由父類成員疊加子類新成員得到的。

3.2 多態對象模型

C++多態的實現原理:

  • 當類中聲明虛函數時,編譯器會在類中生成一個虛函數表。
  • 虛函數表是一個存儲成員函數地址的數據結構。
  • 虛函數表是由編譯器自動生成與維護的。
  • virtual成員函數會被編譯器放入虛函數表中。
  • 存在虛函數時,每個對象中都有一個指向虛函數表的指針(位于最前面)。



繼承對象模型示例:

#include <iostream> #include <string>using namespace std;class Demo { protected:int mi;int mj; public:virtual void print(){cout << "mi = " << mi << ", "<< "mj = " << mj << endl;} };class Derived : public Demo {int mk; public:Derived(int i, int j, int k){mi = i;mj = j;mk = k;}void print(){cout << "mi = " << mi << ", "<< "mj = " << mj << ", "<< "mk = " << mk << endl;} };struct Test {void* p;int mi;int mj;int mk; };int main() {cout << "sizeof(Demo) = " << sizeof(Demo) << endl; cout << "sizeof(Derived) = " << sizeof(Derived) << endl; Derived d(1, 2, 3);Test* p = reinterpret_cast<Test*>(&d);cout << "Before changing ..." << endl;d.print();p->mi = 10;p->mj = 20;p->mk = 30;cout << "After changing ..." << endl;d.print();return 0; }

用C語言實現多態特性:
demo.h:

#ifndef _51_2_H_ #define _51_2_H_typedef void Demo; typedef void Derived;Demo* Demo_Create(int i, int j); int Demo_GetI(Demo* pThis); int Demo_GetJ(Demo* pThis); int Demo_Add(Demo* pThis, int value); void Demo_Free(Demo* pThis);Derived* Derived_Create(int i, int j, int k); int Derived_GetK(Derived* pThis); int Derived_Add(Derived* pThis, int value);#endif

demo.c:

#include "51-2.h" #include "malloc.h"static int Demo_Virtual_Add(Demo* pThis, int value); static int Derived_Virtual_Add(Demo* pThis, int value);struct VTable // 2. 定義虛函數表數據結構 {int (*pAdd)(void*, int); // 3. 虛函數表里面存儲什么??? };struct ClassDemo {struct VTable* vptr; // 1. 定義虛函數表指針 ==》 虛函數表指針類型???int mi;int mj; };struct ClassDerived {struct ClassDemo d;int mk; };static struct VTable g_Demo_vtbl = {Demo_Virtual_Add };static struct VTable g_Derived_vtbl = {Derived_Virtual_Add };Demo* Demo_Create(int i, int j) {struct ClassDemo* ret = (struct ClassDemo*)malloc(sizeof(struct ClassDemo)); if( ret != NULL ){ret->vptr = &g_Demo_vtbl; // 4. 關聯對象和虛函數表ret->mi = i;ret->mj = j;}return ret; }int Demo_GetI(Demo* pThis) {struct ClassDemo* obj = (struct ClassDemo*)pThis; return obj->mi; }int Demo_GetJ(Demo* pThis) {struct ClassDemo* obj = (struct ClassDemo*)pThis;return obj->mj; }// 6. 定義虛函數表中指針所指向的具體函數 static int Demo_Virtual_Add(Demo* pThis, int value) {struct ClassDemo* obj = (struct ClassDemo*)pThis;return obj->mi + obj->mj + value; }// 5. 分析具體的虛函數!!!! int Demo_Add(Demo* pThis, int value) {struct ClassDemo* obj = (struct ClassDemo*)pThis;return obj->vptr->pAdd(pThis, value); }void Demo_Free(Demo* pThis) {free(pThis); }Derived* Derived_Create(int i, int j, int k) {struct ClassDerived* ret = (struct ClassDerived*)malloc(sizeof(struct ClassDerived));if( ret != NULL ){ret->d.vptr = &g_Derived_vtbl;ret->d.mi = i;ret->d.mj = j;ret->mk = k;}return ret; }int Derived_GetK(Derived* pThis) {struct ClassDerived* obj = (struct ClassDerived*)pThis;return obj->mk; }static int Derived_Virtual_Add(Demo* pThis, int value) {struct ClassDerived* obj = (struct ClassDerived*)pThis; return obj->mk + value; }int Derived_Add(Derived* pThis, int value) { struct ClassDerived* obj = (struct ClassDerived*)pThis;return obj->d.vptr->pAdd(pThis, value); }

main.c:

#include "stdio.h" #include "51-2.h"void run(Demo* p, int v) {int r = Demo_Add(p, v);printf("r = %d\n", r); }int main() {Demo* pb = Demo_Create(1, 2);Derived* pd = Derived_Create(1, 22, 333);printf("pb->add(3) = %d\n", Demo_Add(pb, 3));printf("pd->add(3) = %d\n", Derived_Add(pd, 3));run(pb, 3);run(pd, 3);Demo_Free(pb);Demo_Free(pd);return 0; }

參考資料:

  • C++深度解析教程
  • 總結

    以上是生活随笔為你收集整理的C++对象模型分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 超碰v| 极品尤物一区二区 | 一级片少妇 | 91av免费看| 少妇被躁爽到高潮无码文 | 亚洲天堂偷拍 | 日韩欧美国产另类 | 超碰下载页面 | 偷拍福利视频 | 日日摸夜夜爽 | 伊人成人久久 | 国产一区二区黑人欧美xxxx | 国产操操操 | 欧美精品日韩 | 日本美女视频一区 | 欧美一卡二卡三卡四卡 | 性――交――性――乱a | 美女看片| 亚洲欧洲日韩av | 福利视频91| 黄页嫩草 | 日韩成人av在线播放 | 捆绑少妇玩各种sm调教 | 精品成人一区二区 | 青青免费在线视频 | 伊人福利在线 | 欧美放荡办公室videos4k | 女女高潮h冰块play失禁百合 | 亚洲欧美高清 | 很黄的性视频 | 日日燥夜夜燥 | 国产欧美综合一区二区三区 | 91精品啪在线观看国产 | 成人春色影视 | 骚虎免费视频 | 荫蒂被男人添免费视频 | 欧美大白屁股 | 大白屁股一区二区视频 | 亚洲国产日韩一区 | 国内一区二区视频 | 亚洲一区中文字幕在线 | 亚洲精品三级 | 欧美精品免费播放 | 激情全身裸吻胸 | 男女啪啪网站免费 | 国产日韩高清在线 | 涩涩涩在线视频 | 国产一区中文字幕 | 亚洲经典自拍 | 国产在线精品成人欧美 | 在线看黄网址 | 色综合久 | 四虎影视永久 | 伊人伊网 | 无码av天堂一区二区三区 | 亚洲精品四区 | 久久这里| 巨乳xxx| 成人片在线视频 | 成人在线短视频 | 在线成人免费观看 | 波多野结衣视频免费看 | 美女一区二区视频 | 欧美乱码视频 | 久久免费视频3 | 日韩欧美视频一区 | 97人妻精品一区二区三区视频 | 中国一级特黄真人毛片免费观看 | 欧美一区二区黄色 | av网站在线观看不卡 | 婷婷社区五月天 | 亚洲系列中文字幕 | av免费国产 | 99在线免费观看视频 | 国语对白做受欧美 | 手机在线看a | 国产精品久久久影院 | 91欧美一区二区 | 午夜免费在线观看 | 久久亚洲精少妇毛片午夜无码 | av大片在线观看 | 亚洲永久精品一区二区 | 欧美综合亚洲 | 极品探花在线播放 | 亚洲无限码 | 91九色国产 | 成人欧美一区二区三区黑人动态图 | 日本在线观看一区二区 | 中文文字幕一区二区三三 | 色哟哟在线观看视频 | 欧美精品国产一区二区 | 亚洲欧美日韩久久精品 | 一区二区三区91 | 岛国精品资源网站 | 国产成人在线网站 | 日韩av在线观看免费 | www国产精品视频 | 日韩制服在线 | 久久夜色精品国产噜噜亚洲av |