C 類與物件(上)

2021-09-25 14:41:48 字數 3457 閱讀 8266

c語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函式呼叫逐步解決問題。

c++是基於物件導向的,關注的是物件,將一件事情拆分成不同的物件,靠物件之間的互動完成。

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

struct student

void

printstudentinfo()

char _name[20]

;char _gender[3]

;int _age;};

intmain()

class為定義類的關鍵字,classname為類的名字,{}中為類的主體,注意類定義結束時後面分號。類中的元素稱為類的成員:類中的資料稱為類的屬性或者成員變數; 類中的函式稱為類的方法或者成員函式。

類的兩種定義方式:

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

class person

public:

};

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

#include

class person

};

#include

"person.cpp"

void

showinfo()

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

訪問限定符說明

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

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

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

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

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

問:c++中struct和class的區別是什麼?

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

封裝

物件導向的三大特性:封裝,繼承,多型

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

類的作用域

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

class person

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

void person:

:printpersoninfo()

【類物件模型

如何計算類物件的大小

class a 

private:

char _a;

};

每個物件中成員變數是不同的,但是呼叫同乙份函式,如果按照此種方式儲存,當乙個類建立多個物件時,每個物件中都會儲存乙份**,相同**儲存多次,浪費空間。那麼如何解決呢?

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

class a1 

private:

int _a;};

// 類中僅有成員函式

class a2 };

// 類中什麼都沒有---空類

class a3

;

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

結構體內存對齊規則

我們先來定義乙個日期類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++編譯器給每個「成員函式「增加了乙個隱藏的指標引數,讓該指標指向當前物件(函式執行時呼叫該函式的物件),在函式體中所有成員變數的操作,都是通過該指標去訪問。只不過所有的操作對使用者是透明的,即使用者不需要來傳遞,編譯器自動完成。

-this指標的特性

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

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

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

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

【面試題】

this指標存在**?

答:this指標會因編譯器不同而有不同的放置位置。可能是棧,也可能是暫存器,甚至全域性變數。在彙編級別裡面,乙個值只會以3種形式出現:立即數、暫存器值和記憶體變數值。不是存放在暫存器就是存放在記憶體中,它們並不是和高階語言變數對應的。

this指標可以為空嗎?

答:當把空的this傳入 沒有呼叫任何函式的方法中時,執行函式。當把空的this傳入呼叫函式的方法時,就會出錯了。

// 1.下面程式能編譯通過嗎?

// 2.下面程式會崩潰嗎?在**崩潰

class a

void

show()

private:

int _a;};

intmain()

預知後面知識,

C 類與物件(上)

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

C 類與物件 上

類的引入 c語言中,結構體中只能定義變數,在c 中,結構體內不僅可以定義變數,也可以定義函式 include using std cout using std endl struct date int year int month int day int main 輸出結果為 2019 5 7 注意...

類與物件(上)

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