C 類和物件(上)

2021-09-01 02:59:07 字數 3454 閱讀 1856

目錄

類的引入

類的定義

類的訪問限定符及封裝

訪問限定符 封裝

類的作用域

類的例項化

類物件大小計算

儲存方式猜測

類物件大小計算規則

結構體內存對齊

this指標 引出

this指標特性

c語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函式呼叫逐步解決問題。c++是基於物件導向的,關注的是物件,將一件事情拆分成不同的物件,靠物件之間的互動完成。

從語言中struct結構體中只能定義變數,不能定義函式;而c++中即可以定義變數也可以定義函式。只不過在c++中給喜歡用class代替struct。

兩者區別:預設的繼承訪問許可權。struct是public的,class是private的;struct作為資料結構的實現體,它預設的資料訪問控制是public的,而class作為物件的實現體,它預設的成員變數訪問控制是private的。

class為定義類的關鍵字,classname為類的名字,{}中為類的主體,注意類定義結束時後面分號。

類中的元素稱為類的成員:類中的資料稱為類的屬性或者成員變數; 類中的函式稱為類的方法或者成員函式。

class classname

;

類的兩種定義方式:

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

class student

private:

char* _name;

char* _gender;

int _age;

}

2.宣告放在.h檔案,定義放在.cpp檔案,一般採用這種。

訪問限定符說明:

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

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

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

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

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

概念:封裝:將資料和運算元據的方法進行有機結合,隱藏物件的屬性和實現細節,僅對外公開介面來和物件進行互動

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

封裝本質上是一種管理:我們如何管理兵馬俑呢?比如如果什麼都不管,兵馬俑就被隨意破壞了。那麼我們首先建了一座房子把兵馬俑給封裝起來。但是我們目的全封裝起來,不讓別人看。所以我們開放了售票通道,可以買票突破封裝在合理的監管機制下進去參觀。類也是一樣,我們使用類資料和方法都封裝到一下。不想給別人看到的,我們使用protected/private把成員封裝起來。開放一些共有的成員函式對成員合理的訪問。所以封裝本質是一種管理。

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

指明成員屬於哪個類域。作用域外,借助成員訪問操作符.和->來訪問類成員。

概念:用類型別建立物件的過程,稱為類的實

特性:1. 類只是乙個模型一樣的東西,限定了類有哪些成員,定義出乙個類並沒有分配實際的記憶體空間來存。2. 乙個類可以例項化出多個物件,例項化出的物件 占用實際的物理空間,儲存類成員。

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

1.物件中包含類的各個成員:

缺陷:每個物件中成員變數是不同的,但是呼叫同乙份函式,如果按照此種方式儲存,當乙個類建立多

個物件時,每個物件中都會儲存乙份**,相同**儲存多次,浪費空間。那麼如何解決呢?

2.只儲存成員變數,成員函式存放在公共的**段:

乙個類的大小,實際就是該類中」成員變數」之和,當然也要進行記憶體對齊,注意空類的大小,空模擬

較特殊,編譯器給了空類乙個位元組來唯一標識這個類。

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

2. 其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。注意:對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值。vs中預設的對齊數為8,gcc中的對齊數為4

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

4. 如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是

所有最大對齊數(含巢狀結構體的對齊數)的整數倍。

我們先來定義乙個日期類da

class date

{ public :

void display ()

{ cout <<_year _day>

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

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

1. this指標的型別:類型別* const
2. 只能在「成員函式」的內部使用

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

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

傳遞。this指標存在於棧上

C 類和物件(上)

1.物件導向的初步認知。c語言是面向過程的,關注的是過程,分析求解問題的步驟,是通過函式呼叫逐步解決問題。c 是基於物件導向的,關注的是物件,將一件事情拆分成不同的物件,靠物件之間的互動完成。2.c 中類的定義 c語言中,結構體中只能定義變數,在c 中,結構體中不僅可以定義變數,還可以定義函式。st...

C 類和物件 上

一 類與物件 c語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函式呼叫逐步解決問題。c 是物件導向的,關注的是物件,將一件事情拆分成不同的物件,靠物件之間的互動完成。c語言中,結構體中只能定義變數,在c 中,結構體內不僅可以定義變數,也可以定義函式。二 類的定義 1.定義乙個簡單的類 c...

類和物件(上)

類的定義格式 說明部分和實現部分 class 類名 public 公有資料成員和成員函式 protected 保護資料成員和成員函式 private 私有資料成員和成員函式 各個成員函式的實現 建構函式 a 作用 為物件分配空間 對物件初始化 即賦初始值 請求其他資源。b 特點 函式名和類名完全相同...