類與物件(上)

2021-10-18 23:17:20 字數 2846 閱讀 3574

this指標

c語言中,結構體中只能定義變數,在c++中,結構體內不僅可以定義變數,也可以定義函式。結構體的定義,在c++中更喜歡用class來代替。

class

classname

;// 一定要注意後面的分號

類的兩種定義方式:

1、宣告和定義全部放在類體中,需要注意:成員函式如果在類中定義,編譯器可能會將其當成內聯函式處理。

2、宣告放在.**件中,類的定義放在.cpp檔案中。

一般情況下,更期望採用第二種方式。

c++實現封裝的方式:用類將物件的屬性與方法結合在一塊,讓物件更加完善,通過訪問許可權選擇性的將其介面提供給外部的使用者使用。

public修飾的成員在類外可以直接被訪問

protected和private修飾的成員在類外不能直接被訪問(此處protected和private是類似的)

訪問許可權作用域從該訪問限定符出現的位置開始直到下乙個訪問限定符出現時為止

class的預設訪問許可權為private,struct為public(因為struct要相容c)

注意:訪問限定符只在編譯時有用,當資料對映到記憶體後,沒有任何訪問限定符上的區別

例如下圖中private修飾的成員在類外不能直接被訪問:

類定義了乙個新的作用域,類的所有成員都在類的作用域中。在類體外定義成員,需要使用 :: 作用域解析符指明成員屬於哪個類域。

class

person

;// 這裡需要指定printpersoninfo是屬於person這個類域

void person::

printpersoninfo()

用類型別建立物件的過程,稱為類的例項化。

類只是乙個模型一樣的東西,限定了類有哪些成員,定義出乙個類並沒有分配實際的記憶體空間來儲存它。

乙個類可以例項化出多個物件,例項化出的物件 占用實際的物理空間,儲存類成員變數。

做個比方。類例項化出物件就像現實中使用建築設計圖建造出房子,類就像是設計圖,只設計出需要什麼東西,但是並沒有實體的建築存在,同樣類也只是乙個設計,例項化出的物件才能實際儲存資料,占用物理空間。

觀察下圖:

結論:乙個類的大小,實際就是該類中」成員變數」之和,當然也要進行記憶體對齊,注意空類的大小,空模擬較特殊,編譯器給了空類乙個位元組來唯一標識這個類。

規則與之前c語言部落格中所寫一致。

第乙個成員在與結構體偏移量為0的位址處。

結構體總大小為:最大對齊數(所有變數型別最大者與預設對齊引數取最小)的整數倍。

如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。

我們先來定義乙個日期類date。

class

date

void

setdate

(int year ,

int month ,

int day)

private

:int _year ;

// 年

int _month ;

// 月

int _day ;

// 日};

intmain()

對於上述類,我們有乙個問題:

date類中有setdate與display兩個成員函式,函式體中沒有關於不同物件的區分,那當s1呼叫setdate函式時,該函式是如何知道應該設定s1物件,而不是設定s2物件呢?

c++中通過引入this指標解決該問題,即:c++編譯器給每個「非靜態的成員函式「增加了乙個隱藏的指標引數,讓該指標指向當前物件(函式執行時呼叫該函式的物件),在函式體中所有成員變數的操作,都是通過該指標去訪問。只不過所有的操作對使用者是透明的,即使用者不需要來傳遞,編譯器自動完成。

void

display()

//相當於

void

display

(date*

this

)

this指標的型別:類型別* const。

只能在「成員函式」的內部使用。

this指標本質上其實是乙個成員函式的形參,是物件呼叫成員函式時,將物件位址作為實參傳遞給this形參。所以物件中不儲存this指標。

this指標是成員函式第乙個隱含的指標形參,一般情況由編譯器通過ecx暫存器自動傳遞,不需要使用者傳遞。

我們來看兩個問題:

1、this指標存在**?

答:其實編譯器在生成程式時加入了獲取物件首位址的相關**。並把獲取的首位址存放在了暫存器ecx中(vc++編譯器是放在ecx中,其它編譯器有可能不同)。也就是成員函式的其它引數正常都是存放在棧中。而this指標引數則是存放在暫存器中。

類的靜態成員函式因為沒有this指標這個引數,所以類的靜態成員函式也就無法呼叫類的非靜態成員變數。

2、this指標可以為空嗎?

答:如果涉及到解引用操作,就不能為空。若不涉及,可以這麼使用。我們結合具體**的執行結果來驗證這個問題的答案。如下圖:

物件與類(上)

在j a中,所有的類都源自 object 類,所有其他類都擴充套件自這個 object類 繼承 inheritance,繼承後的新類具有被繼承類的全部屬性和方法 物件類之間的關係 使用預定義類 j a類庫中的 localdate類 plusdays方法會得到乙個新的 localdate,這個新日期物...

C 類與物件(上)

類與物件 在現實生活中有很多的東西,例如動物植物昆蟲等,他們都有自己的屬性與特點,例如年齡外貌體積等,人們通過歸納總結,把他們的特點記錄下來,然後就根據這些特點來確定乙個物體到底屬於什麼 類似的在c 世界裡,我們先設定乙個類再用類來產生東西,也就是例項。c語言是面向過程的,關注的是過程,分析出求解問...

Java 類與物件 上

一.物件導向程式設計 對現實生活的抽象 物件導向的三大特徵 封裝 將客觀事物封裝為抽象的類,並且類可以將自己的資料與方法只對可信的類與物件開發,對不可信的進行隱藏.內部操作對外部而言不可見.保護性 繼承 繼承描述的是一種能力,可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴...