編譯器對屬性和方法的處理機制
C++中的class從物件導向理論出發,將變數(屬性)和函數(方法)集中定義在一起,用於描述現實世界中的類別。從電腦的角度,程式依然由資料段和程式碼段構成。
C++編譯器如何完成物件導向理論到電腦程式的轉換?
換句話說:C++編譯器是如何管理類別、物件、類別和物件之間的關係
具體的說:具體物件呼叫類別中的方法,那,c++編譯器是如何區分,是那個具體的類,呼叫這個方法那?
1)C++類物件中的成員變數和成員函數是分開儲存的
成員變數:
普通成員變數:儲存於物件中,與struct變數有相同的記憶體佈局和位元組對齊方式
靜態成員變數:儲存於全域資料區中
成員函數:儲存於程式碼段中。
問題出來了:很多物件共用一塊程式碼?程式碼是如何區分具體物件的那?
換句話說:int getK() const { return k; },程式碼是如何區分,具體obj1、obj2、obj3物件的k值?
左邊是C++類別的實作右邊是對應底層實作。
總結:
1、C++類別物件中的成員變數和成員函數是分開儲存的。 C語言中的記憶體四區模型仍然有效!
2、C++中類別的普通成員函數都隱式包含一個指向目前物件的this指標。
3、靜態成員函數、成員變數屬於類別
靜態成員函數與普通成員函數的區別
靜態成員函數不包含指向具體物件的指標
普通成員函數包含一個指向具體物件的指標
拓展:
思考:類別的成員函數可透過const修飾,請問const修飾的是誰?
void const get(int a,intb)//类的成员函数 { this->a=100;//错误 this->b=200;//错误 }
void get (const Test *This,int a,int b)