類和物件(上)

2021-09-27 04:32:34 字數 3340 閱讀 1979

本節目標

1.類和物件的初步認識

2.類的引入

3.類的定義

4.類的訪問限定符及封裝

5.類的作用域

6.類的例項化

7.類物件的大小

8.類成員函式的this指標

1.類和物件的初步認識

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

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

2.類的引入

c語言中,結構體只能定義變數,

c++中,結構體內不僅能定義變數,也能定義函式。

class student

void printfstudetinfo()

private:

//成員變數||屬性

char _name[20];

char _gender[3];

int _age;

};int main()

3.類的定義

;//加分號
類的兩種定義:

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

2.宣告和定義分開時,需要新增::作用域解析符

person.**件

#pragma once

class person

;

person.cpp檔案

#include "person.h"

#includeusing namespace std;

void person::setpersoninfo(char *name, char *gender, int age)

void person::printfperson()

4.類的訪問限定符及封裝

4.1訪問限定符

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

訪問限定符說明

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

2.protected和private修飾的成員在類外不能直接被訪問。

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

4.class的預設許可權是pirvate,struct為public。

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

4.2封裝

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

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

5.類的作用域

類定義了乙個新的作用域。類的所有成員都在類的作用域中。

在類外定義成員,需要使用::作用域解析符。

class person

;void person::setpersoninfo(char *name, char *gender, int age)

void person::printfperson()

6.類的例項化

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

1.類只是乙個模型,定義乙個類並沒有分配實際的空間來儲存它。(描述物件特徵和行為)

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

7.類物件的大小

類中既可以有成員變數,又可以有成員變數,那麼乙個類的物件中包含了什麼?

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

–>乙個類的大小,實際就是該類中「成員變數」之和,要進行記憶體對齊。(與結構體大小類似)

空類的大小?:在主流編譯器中,編譯器給了空類乙個位元組來唯一標識這個類。

(如果空類是0位元組,那麼這個類定義的多個物件沒有大小,位址一樣,就不能區分)

class a

;class b

{};int main()

》物件中包含哪些內容分析:1.編譯器中得結論:成員變數+成員函式

2.在物件頭部增加4個位元組–指向成員函式**

3.驗證1和2:物件中只包含了成員變數

8.this指標

c++編譯器給每個「成員函式」增加了乙個隱藏的指標引數,讓該指標指向當前物件(函式執行時呼叫該函式的物件),

在函式體中所有成員變數的操作,都是通過該指標去訪問。

只不過所有的操作使用者是透明的,即使用者不需要來傳遞,編譯器自動完成。

8.1this指標的特性

1.this指標型別:類型別* const

2.只能在「成員變數」的內部使用。

3.this指標本質上其實是乙個隱含的指標形參,一般情況下由編譯器通過ecx暫存器自動傳遞,不需要使用者傳遞。

class student

*/ void setstudentinfo(char *name,char *gender, int age)

/*void printfstudetinfo(student * const this)

*/ void printfstudetinfo()

void testfunc(...)//不定引數 引數壓棧

private:

//成員變數||屬性

char _name[20];

char _gender[3];

int _age;

};int main()

this傳遞方式:成員函式約定

thiscall–ecx; -cdecl–引數壓棧

為什麼類中可以先使用然後在宣告?

a.先識別類名。

b.識別類中成員變數。

c.識別類中的成員函式,並且對類中成員進行改寫。

編譯器傳遞方式:物件位址作實參傳遞給成員函式的this指標。

this指標存在棧上。

this指標可以指向空。在成員函式中不能訪問任何「成員變數」。(在訪問成員變數時,程式崩潰。不訪問成員變數時,程式不會崩潰。)

類和物件(上)

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

類和物件(上)

1.什麼是物件導向?想想之前學過的c語言,c語言是面向過程的語言,不管是簡單型別還是複雜型別,只是一味的呼叫函式,這裡的呼叫函式就是將資料處理的過程,更加在乎的是處理邏輯和處理結果 c 是面向過程的語言,首先要說一下什麼是類?什麼是物件?類,通俗的就講就是乙個事物的描述,描述著這一類事物的特徵和動作...

類和物件(上)

1.類是物件的抽象,而物件是類的具體例項。類是抽象的,不占用記憶體 而物件是具體的,占用儲存空間。2.面向過程與物件導向 c語言是面向過程的,關注的是過程中的資料與方法。c 是物件導向的,關注的是物件 的屬性與功能。1.在c 中,結構體內不僅可以定義變數,也可以定義函式。struct student...