C 中的類和物件(一 初識類和物件)

2021-10-04 21:11:35 字數 3406 閱讀 9484

面向過程和物件導向的初步認識

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

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

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

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

成員函式的宣告和定義可以全部放在類體中,也可以將宣告放在 .h 檔案中,定義放在.cpp檔案中。

class

person

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

void person::

printpersoninfo()

public:修飾的成員可以在類外被訪問(公有的)

private:修飾的成員在類外不能直接被訪問(私有的)

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

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

【面試題】:c++中的struct和class的區別是什麼?

解答:c++是相容c語言的,c++中的struct可以當成結構體使用。另外c++中struct還可以用來定義類,struct定義類和class定義類相似,區別是struct的成員預設訪問許可權為public,class的成員預設訪問許可權為private。

封裝從字面上來理解就是包裝的意思,專業點就是資訊的隱藏。

封裝:封裝本質上是一種管理,用類將資料和運算元據的方法結合起來,通過訪問限定符隱藏物件的屬性和實現細節,僅公開介面與外部互動。

也就是說使用者是無需知道物件內部的細節,但可以通過該物件對外的提供的介面來訪問該物件。

封裝的優點:提高了資料的安全性(外部不能隨意訪問私有的成員屬性)、提高了**的可維護性(只需要修改類就可以)、降低了**的耦合度(使**模組化)。

類的例項化:用類建立物件的過程

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

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

類相當於設計圖紙(設計出來什麼東西,但實際不佔空間)物件相當於使用圖紙建造出來的房子。

class

addclass

inline

void

getnum2

(int num2)

//在類內宣告

intaddnum()

;};//在類外定義

int addclass::

addnum()

intmain()

類中既有成員變數,又有成員函式,那麼乙個類的物件中儲存了什麼?如何計算乙個類的大小?

要計算類物件的大小,首先我們得搞清楚類物件中包含了什麼。

每個物件中成員變數是不同的,但都是呼叫同乙份成員函式,當乙個類建立多個物件時,每個物件如果都儲存乙份**,相當於相同**儲存多次,會造成空間的浪費,所以物件中只儲存成員變數,成員函式放在公共**段。

幫助理解:類例項化出很多個人(物件),這些人都有不同的年齡或者姓名(成員變數),但是顯示它們姓名和年齡的函式(成員函式)都是一樣的。

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

2.其他成員變數要對齊到對齊數整數倍的位址處

對齊數 = 編譯器預設的對齊數(vs為8、linux為4) 與 該成員大小的較小值

3.結構體的總大小為最大對齊數的整數倍

4.巢狀的結構體對齊到自己最大對齊數的整數倍,結構體的整體大小就是所有最大對齊數的整數倍。

我們類中的函式都存在公共**段,那麼編譯器使怎麼區分是哪個物件呼叫了成員函式呢?

這就牽扯到了每個類中隱藏的成員this指標

this指標是乙個指向物件自身的指標

this指標會預設作為成員函式呼叫的第乙個引數,將呼叫成員函式的物件位址傳入this,在函式內部找到物件中的成員,this指標這個形參是隱式的,它並不出現在**中,而是在編譯階段由編譯器將它新增到引數列表中。

成員函式最終被編譯成與物件無關的普通函式,除了成員變數,會丟失所有資訊,所以編譯時要在成員函式中新增乙個額外的引數,把當前物件的首位址傳入,以此來關聯成員函式和成員變數。這個額外的引數,實際上就是 this指標,它是成員函式和成員變數關聯的橋梁。

實際上我們呼叫的**是這樣傳參的:

class

addclass

inline

void

getnum2

(int num2)

//在類內宣告

intaddnum()

;int

addnum

(addclass*

this);

};//在類外定義

int addclass::

addnum()

intmain()

1.this指標不儲存在類中,每個編譯器對this指標儲存的地方都有所不同,在vs中this指標儲存在暫存器中

2.this指標可以為空,但是一旦呼叫,需要訪問物件中成員變數就會由於this為空發生記憶體越界(在物件開闢的空間上去找成員變數)而導致崩潰

小結類和物件是讓c++ 得以實現物件導向,得以更加方便的進行大型專案程式設計的最重要的部分

技術就如同武術,基本功很重要,只要基本功紮實了,再去學習更深層次的東西就會比較容易,只要明白其原理,舉一反三就能達到「無招勝有招」的最高境界

C 初識類和物件

在c語言中,結構體中只能定義變數,在c 中,結構體不僅可以定義變數,還可以定義函式。例如 struct student 這樣的結構體,在c 中常用class來代替。即類。類的定義 class classname 例 在定義類的時候,一般將成員函式的定義和類定義分開,跨檔案定義。即類外定義成員函式,類...

C 初識 類和物件(2)

在之前的文章裡,我們出初步了解了,什麼是類,類如何定義,類的大小怎麼計算等 乙個空類裡面什麼也沒有,但是它並非是什麼也沒有,只要是類,它就有6個預設的成員函式 1.建構函式 2.析構函式 3.拷貝建構函式 4.賦值操作符過載 5.取位址操作符過載 6.const修飾的取位址操作符過載 類的建構函式 ...

C 類和物件 類和物件

c 中物件的型別稱為類,類代表了某一批物件的共性和特徵,類是物件的抽象,而物件是類的具體例項,類是抽象的,不占用記憶體,而物件是具體的,占用 儲存空間,這點很重要,讀者需要牢記。類是使用者自己指定的型別,如果程式中要用到類型別,必須自己根據需要進行宣告,或者使用別人已設計好的類,c 標準本身並不提供...