C++學習筆記--C語言模擬this指標
阿新 • • 發佈:2019-02-08
都知道,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指標的傳遞過程。