14物件導向模型初探

2021-08-01 15:35:34 字數 2784 閱讀 3257

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、c++類物件中的成員變數和成員函式是分開儲存的。c語言中的記憶體四區模型仍然有效!

2、c++中類的普通成員函式都隱式包含乙個指向當前物件的this指標。

3、靜態成員函式、成員變數屬於類

靜態成員函式與普通成員函式的區別

靜態成員函式不包含指向具體物件的指標

普通成員函式包含乙個指向具體物件的指標

實驗1:若類成員函式的形參 和 類的屬性,名字相同,通過this指標來解決。

#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語...