C 類與物件 上

2021-09-21 12:53:32 字數 4639 閱讀 7113

類的引入

c語言中,結構體中只能定義變數,在c++中,結構體內不僅可以定義變數,也可以定義函式

#include

using std:

:cout;

using std:

:endl;

struct date

int _year;

int _month;

int _day;};

int main()

輸出結果為:2019-5-7

注意:上面結構體的定義,在c++中更喜歡用class來代替

類的定義

class

classname

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

注意:class為定義類的關鍵字,classname為類的名字,{}中為類的主體,注意類定義結束時後面分號。 類中的元素稱為類的成員:類中的資料稱為類的屬性或者成員變數; 類中的函式稱為類的方法或者成員函式。類的兩種定義方式:1.宣告和定義全部放在類體中,需要注意:成員函式如果在類中定義,編譯器可能會將其當成內聯函式處 理

class

date

private

: int _year;

int _month;

int _day;

};

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

//宣告放在date.h的標頭檔案中

class

date

;

//定義放在類的實現的date.cpp中

#include"date.h"

void date:

:info

(int year,int month,int day)

注意:一般採取第二種情況,因為宣告定義分離不帶可以讓程式設計師方便清楚地看出**的構架,也會保證**的安全,不想讓別人看**實現的時候,可以將.cpp檔案做成靜態庫或者動態庫,只給它鏈結的介面,不給**的具體實現訪問限定符級封裝1.訪問限定符

public(公有)

private(私有)

protected(保護)

訪問限定符說明:

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

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

訪問許可權作用域從該訪問限定符出現的位置開始直到下乙個訪問限定符出現時為止class的預設訪問許可權為private,struct為public(因為struct要相容c)

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

struct和class的區別:c++需要相容c語言,所以c++中struct可以當成結構體去使用。另外c++中struct還可以用來定義類。 和class是定義類是一樣的,區別是struct的成員預設訪問方式是public,class是struct的成員預設訪問方式 是private。

2.封裝

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

類的作用域

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

class

date

;void date:

:info

(int year,int month,int day)

類的例項化

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

注意:

.類只是乙個模型一樣的東西,限定了類有哪些成員,定義出乙個類並沒有分配實際的記憶體空間來儲存它乙個類可以例項化出多個物件,例項化出的物件 占用實際的物理空間,儲存類成員變數也即是說class date這個類實際上並沒有大小,但是定義的date d1是具有大小的

類物件模型

1.類物件的儲存方式

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

原因:每個物件中成員變數是不同的,但是呼叫同乙份函式,如果將成員是直接存放在類裡面,當乙個類建立多 個物件時,每個物件中都會儲存乙份函式**,相同**儲存多次,浪費空間,所以就將類裡面的成員函式放在公共**段

也可以做乙個簡單的測試,**演示:

#include

using std:

:cout;

using std:

:endl;

classa}

;class

bprivate

: int _a;};

classc;

int main()

輸出結果為:

注意:class c是乙個空類,編譯器給它1個字元來標識這個類,而class a不是乙個空類,它裡面有成員函式,可是編譯器也只給它1個位元組,所以從這裡就可以看出成員函式的儲存位置並沒有在類中,編譯器將他也看成了乙個空類

結論:類的儲存方式是成員變數存在類中,成員函式存在公共**段中,也可以看出乙個類的大小,實際就是該類中」成員變數」之和,當然也要進行記憶體對齊

2.記憶體對齊規則

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

其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處

注意: 對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值

vs中預設的對齊數為8,gcc中的對齊數為4

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

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

this指標

先看一段**:

#include

using std:

:cout;

using std:

:endl;

class

date

private

: int _year;

int _month;

int _day;};

int main()

對於上述類,有這樣的乙個問題:

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

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

上述的founc函式實際相當於這樣,**演示:

void

fonuc

(data*

this

,int year, int month, int day)

注意:

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

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

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

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

this指標在哪兒儲存:

this指標存在棧裡面,因為this指標是乙個形式引數,當給函式開闢的空間銷毀後,形參也會隨之銷毀

this指標可以為空嗎?

可以,因為只要this指標在成員函式中不進行解引用操作就可以了

C 類與物件(上)

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

C 類與物件(上)

c語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函式呼叫逐步解決問題。c 是基於物件導向的,關注的是物件,將一件事情拆分成不同的物件,靠物件之間的互動完成。c語言中,結構體中只能定義變數,在c 中,結構體內不僅可以定義變數,也可以定義函式。c 中更喜歡用class來代替struct st...

類與物件(上)

this指標 c語言中,結構體中只能定義變數,在c 中,結構體內不僅可以定義變數,也可以定義函式。結構體的定義,在c 中更喜歡用class來代替。class classname 一定要注意後面的分號 類的兩種定義方式 1 宣告和定義全部放在類體中,需要注意 成員函式如果在類中定義,編譯器可能會將其當...