C++中的class從面向對象理論出發,將變量(屬性)和函數(方法)集中定義在一起,用於描述現實世界中的類。從計算機的角度,程序依然由數據段和代碼段構成。
C++編譯器如何完成面向對象理論到計算機程序的轉化?
換句話:C++編譯器是如何管理類、對象、類和對象之間的關系
具體的說:具體對象調用類中的方法,那,c++編譯器是如何區分,是哪個具體的類,調用這個方法?demo
#includeusing namespace std; class C1 { public: int i; //4 int j; //4 int k; //4 protected: private: }; // 大小應該是12 class C2 { public: int i; //4 int j; //4 int k; //4 static int m; //4 public: int getK() const { return k; } //4 void setK(int val) { k = val; } //4 protected: private: }; //大小可能是12,可能是16,可能是24 struct S1 { int i; int j; int k; }; // 大小是12 struct S2 { int i; int j; int k; static int m; }; // 大小可能是12,可能是16 int main() { printf("c1:%d \n", sizeof(C1)); // 結果是12 printf("c2:%d \n", sizeof(C2)); // 結果是12 printf("s1:%d \n", sizeof(S1)); // 結果是12 printf("s2:%d \n", sizeof(S2)); // 結果是12 }
通過上面的demo,我們可以的得出:
1)C++類對象中的成員變量和成員函數是分開存儲的
成員變量:
普通成員變量:存儲於對象中,與struct變量有相同的內存布局和字節對齊方式
靜態成員變量:存儲於全局數據區中
成員函數:存儲於代碼段中。
問題出來了:很多對象共用一塊代碼?代碼是如何區分具體對象的?
換句話說:int getK() const { return k; },代碼是如何區分,具體obj1、obj2、obj3對象的k值?
看下圖
對於普通成員函數,C++編譯器做了一層封裝,比如Test類的構造函數,其中雖然只寫了一個參數i,但實際上就像右面結構體的初始化函數那樣,類的構造函數隱藏定義了一個this指針。
而靜態成員函數,不需要this指針,因為是共用的,對於類只需要標注作用域就可以了。
所以執行Test a(10); 就相當於 Test a; Test_initialize(%a, 10);其他的類似對比就懂了。
總結:
1、C++類對象中的成員變量和成員函數是分開存儲的。C語言中的內存四區模型仍然有效!
2、C++中類的普通成員函數都隱式包含一個指向當前對象的this指針。
3、靜態成員函數、成員變量屬於類
靜態成員函數與普通成員函數的區別
靜態成員函數不包含指向具體對象的指針
普通成員函數包含一個指向具體對象的指針