C++面向?qū)ο竽P偷霓D(zhuǎn)化
C++中的class從面向?qū)ο罄碚摮霭l(fā),將變量(屬性)和函數(shù)(方法)集中定義在一起,用于描述現(xiàn)實世界中的類。從計算機的角度,程序依然由數(shù)據(jù)段和代碼段構成。
C++編譯器如何完成面向?qū)ο罄碚摰接嬎銠C程序的轉(zhuǎn)化?換句話:C++編譯器是如何管理類、對象、類和對象之間的關系?具體的說:具體對象調(diào)用類寫的方法,那c++編譯器是如何區(qū)分,是那個具體的類,調(diào)用這個方法呢?
我們先看下面一段代碼:
#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?靜態(tài)放在全局區(qū)??
public:??
????int?getK()?const?{?return?k;?}?//4?放在代碼區(qū),沒占用具體的內(nèi)存空間??
????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??
??
??
void?main()??
{??
????printf("c1:%d?n",?sizeof(C1));??
????printf("c2:%d?n",?sizeof(C2));??
????printf("s1:%d?n",?sizeof(S1));??
????printf("s2:%d?n",?sizeof(S2));??
??
??
????system("pause");??
}??
/**?
c1:12?
c2:12?
s1:12?
s2:12?
*/用內(nèi)存四區(qū)解釋 C++屬性和方法:C++類對象中的成員變量和成員函數(shù)是分開存儲的。
成員變量:
普通成員變量:存儲于對象中,與struct變量有相同的內(nèi)存布局和字節(jié)對齊方式
靜態(tài)成員變量:存儲于全局數(shù)據(jù)區(qū)中
成員函數(shù):存儲于代碼段中
問題出來了:很多對象共用一塊代碼,代碼是如何區(qū)分具體對象的呢?換句話說:int getK() const { retur k},代碼是如何區(qū)分,具體obj1、obj2、obj3對象的k值?
對于一個類,編譯器會將所有的數(shù)據(jù)成員打包成struct,而所有的成員函數(shù)會添加上this指針,正如圖片左邊向右邊轉(zhuǎn)換一樣,這樣C++的類基本和C就區(qū)別不大了。
結論:
1.C++類對象中的成員變量和成員函數(shù)是分開存儲的。C語言中的內(nèi)存四區(qū)模型仍然有效!
2.C++中類的普通成員函數(shù)都隱式包含一個指向當前對象的this指針。
3.靜態(tài)成員函數(shù)、成員變量屬于類
靜態(tài)成員函數(shù)與普通成員函數(shù)的區(qū)別:靜態(tài)成員函數(shù)不包含指向具體對象的指針,普通成員函數(shù)包含一個指向具體對象的指針。





