1. 程式人生 > >C++學習筆記--C語言模擬this指標

C++學習筆記--C語言模擬this指標

都知道,C++中類的成員變數和成員函式是分開儲存的,變數可以儲存在堆、棧、全域性區,而函式只能存在程式碼段,並且一個類只對應一套成員函式,那麼如何通過類物件呼叫成員函式呢?
答案是通過this指標,類物件將this指標傳遞給函式,所以函式能夠使用類物件的成員變數,而this指標儲存的就是當前物件的地址。這個傳遞的行為被編譯器隱藏起來了,下面通過C程式碼模擬this指標的傳遞過程。

標頭檔案test.h

#ifndef _TEST_H_
#define _TEST_H_


typedef void Demo;//隱藏對外屬性,模擬private限定符
typedef struct test//定義類
{
    int mi;
    int mj;
}Test;

//定義類成員函式,通過引數可以看出來通過指標傳遞物件
Demo* Creat(int i, int j);//模擬建構函式,返回值為模擬出來的this指標
int GetI(Demo* pThis);
int GetJ(Demo* pThis);
int Add(Demo* pThis, int k);
void Free(Demo* pThis);//模擬解構函式


#endif // _TEST_H_

test.c

#include "test.h"
#include <stdlib.h>
//函式中都是通過物件指標進行資料傳遞使用的
Demo* Creat(int i, int j)
{
    Test* t = (Test*)malloc(sizeof(Test));
    if( NULL != t)
    {
        t->mi = i;
        t->mj = j;
    }
    return t;
}
int GetI(Demo* pThis)
{
    Test *obj = (Test*)pThis;
    return obj->mi;
}
int GetJ(Demo* pThis)
{
    Test *obj = (Test*)pThis;
    return obj->mj;
}
int Add(Demo* pThis, int k)
{
    Test *obj = (Test*)pThis;
    return obj->mi + obj->mj + k;
}
void Free(Demo* pThis)
{
    if(NULL != pThis)
    {
        free(pThis);
    }
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "test.h"

int main()
{
    Test *t = Creat(1, 2);
    printf("getI = %d\n", GetI(t));
    printf("getJ = %d\n", GetJ(t));
    printf("Add = %d\n", Add(t, 3));
    printf("Hello world!\n");
    return 0;
}

在這裡插入圖片描述

通過此程式碼顯式的展現了C++中this指標的傳遞過程。