C 三 類與物件 上

2021-09-28 05:17:42 字數 4272 閱讀 7656

1、類的引入

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

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

類的兩種定義方式:

(1) 將類的成員函式 定義和宣告放在一起

在工程中,不會將函式的申明和定義全部都在類裡面,防止標頭檔案包含多次時,被重複定義;

struct stu

// 類中的成員變數相當於成員函式的全域性變數,變數是先定義後使用

// 如何解釋在類 成員函式可以先使用 成員變數,成員變數再進行定義這種現象?

// 因為:編譯器是先識別類中的成員變數,在識別成員函式的,

char _name[20]

;char _gender[3]

;int _age;};

intmain()

(2)將類的成員函式 定義和宣告放分離開此時這些函式會被當做全域性函式對待,所以無法識別是這些類中的成員變數

需要加上 類名 限定符 ,讓編譯器識別這些函式是 成員函式

#pragma once  

// 防止標頭檔案重複包含 ?含有那些方式?各種方式之間的區別

#include

using

namespace std;

class

person

;#include

"person.h"

// 需要加上 類名 限定符 ,讓編譯器識別這些函式是 成員函式

void person::

setperson

(char

* name,

char

* gender,

int age)

//需要加上 類名 限定符

void person::

printpersoninfo()

若不加上類名和修飾限定符

// 此時這些函式會被當做全域性函式對待,所以無法識別是這些類中的成員變數 如下圖:

1、訪問限定符

c++實現封裝的方式:用類將物件的屬性與方法結合在一塊,讓物件更加完善,

通過訪問許可權選擇性的將其介面提供給外部的使用者使用。

( 將乙個事物的內部細節給隱藏起來 ,提供一些公有的介面,讓物件之間進行互動)

// c++ 實現封裝 : 類(通過類講物件的屬性和行為包裝在一起)

訪問許可權:

【訪問限定符說明】

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。

2、封裝

在類和物件階段,我們只研究類的封裝特性,那什麼是封裝呢?

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

3、 類的作用域

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

在類體外定義成員,需要使用 :: 作用域解析符指明成員屬於哪個類域。

警告:不能在標頭檔案.h裡面定義全域性變數,如果標頭檔案中可以定義全域性變數,

那麼每個包含該標頭檔案的檔案裡都會有該全域性變數的定義.

class

person

;// 定義乙個與類中成員變數相同的全域性變數,不發生報錯,說明

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

int _age =10;

// 定義全域性變數

intmain()

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

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

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

5、類物件模型

1、 類中既可以有成員變數,又可以有成員函式,

那麼乙個類的物件中包含了什麼?如何計算乙個類的大小?

物件中的實際內容: 成員變數 ,不包含任何與成員函式有關的

即 計算乙個類的大小只需要計算 成員變數的大小 ,與結構體計算方式相同

物件中的實際內容: 成員變數 ,不包含任何與成員函式有關的 ,那麼物件是如何找到對應的成員函式的?

2、空類的大小是多少? (不包含任何成員 )

在主流的編譯器中,類的大小是1,

假設 類的大小是0,則 建立多個物件時,所開闢空間的大小是0,
則多個物件在記憶體上在同乙個位置,是無法區分的;因此需要乙個佔位。

6.this指標

1、 this指標的引出

兩個成員函式

void

setperson

(char

* name ,

char

* gender ,

int age)

;void

printpersoninfo()

;

函式體中沒有關於不同物件的區分,那當st1呼叫setperson函式時,

該函式是如何知道應該設定s1物件,而不是設定st2物件呢?

#include

struct stu

;

在c語言中,要想給結構體設定成員變數,只需要傳入對應的結構體指標就行

// 該函式通過結構體指標就可以找到對應的結構體

void

setstuinfo

(struct stu* ps,

char

* name,

char

* gender,

int age)

void

printpersoninfo

(struct stu* ps )

intmain()

c++中通過引入this指標解決該問題,

即:c++編譯器給每個「成員函式「增加了乙個隱藏的指標引數,讓該指

針指向當前物件(函式執行時呼叫該函式的物件),在函式體中所有成員變數的操作,都是通過該指標去訪

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

this指標的型別:類型別 類名* const ,所以使用者不能對this 指標賦值

只能在「成員函式」的內部使用,因為this是成員函式的引數

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

形參。所以物件中不儲存this指標。

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

傳遞編譯器編譯類是如何處理的?

1、 先識別類名

2、 識別類中的成員變數(因為類是先識別成員變數,所以類中先使用成員函式也沒有什麼問題

3、識別類中的成員函式,並對類中的成員函式進行改寫:

(1)給成員函式新增乙個預設引數—this 指標

(2)通過this指標訪問成員變數

C 備考(三)類與物件

學習沒有捷徑,但考試有捷徑 常量 const 符號 字串常量 立即數 引用和指標 類的封裝和隱藏 靜態成員 友元函式 類的初始化 初始化方式和順序 類的繼承 繼承方式 構函列表 多繼承 類的多型性 函式過載 運算子過載 虛函式 虛函式表 類的作用域概念 類 使用者定義的新的複雜資料型別 將不同型別的...

實驗三 類與物件

四 實驗結論 驗證性實驗部分 總結你對類 物件 建構函式 複製建構函式 析構函式的認識 理解和思考。類與物件 物件是對客觀事物的抽象,類是對物件的抽象。1 類型別的宣告 class 類名 2 什麼是建構函式?通俗的講,在類中,函式名和類名相同的函式稱為建構函式。它的作用是在建立乙個物件時,作某些初始...

實驗三 類與物件(zxt)

以下為課上的實現虛數相加的內容,以及我的疑惑 懵逼 這個 存在問題,只能執行整數不能執行浮點數,以下為2.0版本 這回的又有一些問題,這個源 是老師ppt上的,main函式中的部分是我寫的。但是由於我想既能進行整數和浮點數的加法,所以我設定為了double型別。由此導致我只能呼叫double add...