c++物件模型可以概括為以下2部分:
1. 語言中直接支援物件導向程式設計的部分,主要涉及如建構函式、析構函式、虛函式、繼承(單繼承、多繼承、虛繼承)、多型等等。
2. 對於各種支援的底層實現機制。
在c語言中,「資料」和「處理資料的操作(函式)」是分開來宣告的,也就是說,語言本身並沒有支援「資料和函式」之間的關聯性。在c++中,通過抽象資料型別(abstract data type,adt),在類中定義資料和函式,來實現資料和函式直接的繫結。
概括來說,在c++類中有兩種成員資料:static、nonstatic;三種成員函式:static、nonstatic、virtual。
c++中的class從物件導向理論出發,將變數(屬性)和函式(方法)集中定義在一起,用於描述現實世界中的類。從計算機的角度,程式依然由資料段和**段構成。
c++編譯器如何完成物件導向理論到電腦程式的轉化?
換句話:c++編譯器是如何管理類、物件、類和物件之間的關係
具體的說:具體物件呼叫類中的方法,那,c++編譯器是如何區分,是那個具體的類,呼叫這個方法那?其實都是通過編譯器進行詞法分析完成的!
另外為了證明static屬性的成員變數存放在全域性資料區,以及所有的成員函式都是存放在**段,補充如下**:
#include "iostream"
#include
#include
using
namespace
std;
class c1
; //12
class c2
//4void setk(int val) //4
protected:
private:
}; //24 16 12(鐵釘的不對)
struct s1
; //
struct s2
; //
int main()
通過上面的案例,我們可以的得出:
1)c++類物件中的成員變數和成員函式是分開儲存的
成員變數:
普通成員變數:儲存於物件中,與struct變數有相同的記憶體布局和位元組對齊方式
靜態成員變數:儲存於全域性資料區中
成員函式:儲存於**段中。
問題出來了:很多物件共用一塊**?**是如何區分具體物件的那?
換句話說:int getk() const ,**是如何區分,具體obj1、obj2、obj3物件的k值?
2)c++編譯器對普通成員函式的內部處理
總結:實驗1:若類成員函式的形參 和 類的屬性,名字相同,通過this指標來解決。1、c++類物件中的成員變數和成員函式是分開儲存的。c語言中的記憶體四區模型仍然有效!
2、c++中類的普通成員函式都隱式包含乙個指向當前物件的this指標。
3、靜態成員函式、成員變數屬於類
靜態成員函式與普通成員函式的區別
靜態成員函式不包含指向具體物件的指標
普通成員函式包含乙個指向具體物件的指標
#include
using
namespace
std;
class test
void printt()
;void main()
實驗2:類的成員函式可通過const修飾,請問const修飾的是誰?
答:修飾的是this指標指向的記憶體空間,且this指標即使沒有const修飾成員函式也不可修改其值。
#include
using
namespace
std;
class test
void printt()
;int main()
cout
<1, 2);
t1.printt();// ===> printt(&t1)
cout
<
return
1;}
test& add(test &t2) //*this //函式返回引用
test add2(test &t2) //*this //函式返回元素
重要示例**
#include
using
namespace
std;
class test
//返回乙個引用 相當於返回自身
//返回t1這個元素 this就是&t1
test& testadd2(test &t2)
public:
test(int a=0, int b=0)
};//把成員函式 轉成 全域性函式 多了乙個引數
void printt(test *pt)
int main()
test t6(1, 2);
test t7(3, 4);
//t1 = t1 + t2;
t6.testadd2(t7);//返回引用不會被析構,但引用代表的變數已被修改
t6.printt();
//結束main函式之前,第五次析構(t7),第六次析構(t6),第七次析構(t3),第八次析構(t2),第九次析構(t1)
return
1;}
C 物件導向模型初探
前言 c 物件模型可以概括為以下2部分 1.語言中直接支援物件導向程式設計的部分,主要涉及如建構函式 析構函式 虛函式 繼承 單繼承 多繼承 虛繼承 多型等等。2.對於各種支援的底層實現機制。在c語言中,資料 和 處理資料的操作 函式 是分開來宣告的,也就是說,語言本身並沒有支援 資料和函式 之間的...
C 中物件導向模型初探
這裡主要概述成員函式的本質,這裡只是用c語言的方式來實現c 中類的功能,並不代表c 編譯器的真正做法,但c 編譯器實現原理大致如此。注釋部分為c 的實現方式,也是c 編譯器的實現原理 總結 1 c 類物件中的成員變數和成員函式是分開儲存的,c語言的記憶體四區模型仍然有效 2 c 中類的普通成員函式都...
OC物件導向初探
objective c語言是一種簡單的基於當下先進的物件導向的一種計算機語言。它作為標準的ansic語言的擴充套件,輕量但很強大。相對c,objective c新加入的一些內容更多是基於smalltalk語言,smalltalk是物件導向程式設計語言的創始者之一。obejctive c被設計賦予c語...