C++編譯器是如何管理類和對象的,類的成員函數和成員變量
阿新 • • 發佈:2019-04-07
print bsp 語言 sharp 調用 變量 private %d cte
C++中的class從面向對象理論出發,將變量(屬性)和函數(方法)集中定義在一起,用於描述現實世界中的類。從計算機的角度,程序依然由數據段(棧區內存)和代碼段(代碼區內存)構成。
#include "stdafx.h" #include "iostream" using namespace std; class C1 { public: int i; //4 int j; //4 int k; //4 protected: private: }; //12 class C2 { public: int i; //4 intj; //4 int k; //4 static int m; //4 public: int getK() const { return k; } //4 void setK(int val) { k = val; } //4 protected: private: }; //24 16 struct S1 { int i; int j; int k; }; //12 struct S2 { int i; int j; int k; static int m; };//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 system("pause"); return 0; }
為什麽都是12呢?原因如下:
1)C++類對象中的成員變量和成員函數是分開存儲的
成員變量:數據段(棧區內存)
普通成員變量:存儲於對象中,與struct變量有相同的內存布局和字節對齊方式
靜態成員變量:存儲於全局數據區中
成員函數:存儲於代碼段中。
問題出來了:很多對象公用一塊代碼?代碼是如何區分具體對象的?
換句話說:int getK() const { return k; },代碼是如何區分,具體obj1、obj2、obj3對象的k值?
C++會將class中的成員變量提取出來放在棧區的一個同名的struct裏面,將成員函數提取出來放在代碼區,
同時會對起做一些修改,就是默認添加一個this指針的參數,這樣在具體對象調用的時候如a.getI()就會將this傳遞過去,
(註:每一個類的對象都會默認包含一個this指針的成員變量),這樣就是區分到底是哪一個對象去調用類的成員函數了
1、C++類對象中的成員變量和成員函數是分開存儲的。C語言中的內存四區模型仍然有效!
2、C++中類的普通成員函數都隱式包含一個指向當前對象的this指針。
3、靜態成員函數、成員變量屬於類
靜態成員函數與普通成員函數的區別:
靜態成員函數不包含指向具體對象的指針
普通成員函數包含一個指向具體對象的指針
C++編譯器是如何管理類和對象的,類的成員函數和成員變量