C++中面向物件模型初探
阿新 • • 發佈:2019-01-31
C++中面向物件模型即類的封裝原理初探
這裡主要概述成員函式的本質,這裡只是用C語言的方式來實現C++中類的功能,並不代表C++編譯器的真正做法,但C++編譯器實現原理大致如此。
/*註釋部分為c程式碼的實現方式,也是C++編譯器的實現原理*/ #include <iostream> #include <cstdlib> using namespace std; class Test { private: int mI; public: Test(int i) { mI = i; } int getI() { return mI; } static void print() { printf("This is class Test. \n"); } }; /********************** struct Test { int mI; }; void Test_initialize(Test * pThis, int i) { pThis->mI = i; } int Test_getI(Test * pThis) { return pThis->mI; } void Test_Print() { printf("This is class Test.\n"); } ***********************/ int main() { Test a(10); /* Test a; Test_initialize(&a, 10); */ a.getI(); /* Test_getI(&a); */ Test::print(); /* Test_Print(); */ system("pause"); return 0; }
總結:
1、C++類物件中的成員變數和成員函式是分開儲存的,C語言的記憶體四區模型仍然有效;
2、C++中類的普通成員函式都隱式包含一個指向當前物件的this指標;
3、靜態成員函式、成員變數屬於類
靜態成員函式與普通成員函式的區別在於
靜態成員函式不包含指向具體物件的指標
普通成員函式包含一個指向具體物件的指標。
這一點可以在普通成員函式的函式指標和靜態成員函式的函式指標型別宣告中體現:
#include <iostream> class Test { public: Test(int a, int b): a(a), b(b) {} static void print (Test & test) { std::cout << test.a << std::endl; std::cout << test.b << std::endl; } void output () { std::cout << this->a << std::endl; std::cout << this->b << std::endl; } private: int a; int b; }; int main() { Test test(1, 2); typedef void(Test::* MemFun)();//普通成員函式的函式指標定義 MemFun output = &Test::output; (test.*output)(); typedef void(* StaticMemFun)(Test&);//靜態成員函式的函式指標定義 StaticMemFun print = &Test::print; print(test); }
上述程式碼中,普通成員函式函式指標型別*前要加"類名::",而靜態成員函式不需要,這是由於普通成員函式隱含傳遞this指標作為其第一個引數,而靜態成員函式不傳遞this指標,所以靜態成員函式的指標型別和和類外的單獨函式指標沒有區別。
類成員函式指標的具體分析請參見以下連結: