#include "iostream"using namespace std;class C1{public: int i; int j; int k;PRivate:};class C2{public: int i; int j; int k; //變量和靜態變量函數沒有放在一塊 static int m;//存儲到全局的數據區域中public: //函數是存儲在代碼段 int getK() const { return k; }; void setK(int val){ k = val; };};int main(){ cout << "C1 大小 = %d" << sizeof(C1) << endl; cout << "C2 大小 = %d" << sizeof(C2) << endl; system("pause"); return 0;}最后我們運行可以看到都是12,通過這個我們可以知道類的普通成員屬性是定義這個類大小的。然而我們看到的C2也是12但是我們前面學習了函數也是有一定大小,靜態變量也是有大小的,所以我們發現為什么沒有出現了,原來我們在以前學習的內存四區就曉得,靜態變量它是放在靜態區,而類的成員函數他是放在代碼區域,ps(這里不太懂內存四區的朋友可以去查一下相關的知識)
問題2 C++編譯器的調用
上面的標題沒有說完整,主要是因為文字太長,C++編輯器怎么知道我是那個類的對象在調用代碼區域的成員函數。下面就是關鍵的地方,C++編輯器是怎么對普通成員函數進行處理的代碼
#include "iostream"using namespace std;class Test{public: Test(int a, int b){ this->a = a; this->b = b; }; ~Test(){ cout << "我是析構函數" << endl; }; int getA() { return this->a; }private: int a; int b;};void main(){ Test t(1, 2);//====>t(this,1,2); ===>Test(&t,1,2) t.getA();//===>getA(&t); system("pause");}這里面的關鍵點就在定義了一個類,Test t(1,2)的時候C++編輯器在內部就給我們轉換成了一個函數void test_initalize(Test* pthis,int a,int b)然后我們才能在里面使用這個方法,這樣我們就確定了是那個類在調用這個方法,其實我們在看看本質還是C語言的指針作為函數的參數的應用,這個是我覺得可以用C語言替換的一些地方。總結
1.C++類對象中的成員變量和成員函數是分開存儲的,C語言中的內存四區模型他仍然是有效的!2.C++中類的普通成員函數都是隱藏一個指向當前對象的指針this。3.靜態成員函數,成員變量屬于類。靜態成員函數與普通成員函數的區別靜態成員函數不包含指向具體對象的指針。就是沒有this指針。普通成員函數包含了一個指向具體對象的指針。
新聞熱點
疑難解答