C 概念溫習 2 類與物件的相關基礎知識

2021-10-06 19:17:45 字數 3651 閱讀 7235

c語言幾乎是所有理工科學生進入大學學習接觸的第一門語言,不管之後大家分走向了哪些高階語言,最初都見識過這位程式語言屆的常青樹。c語言,以其華麗(難搞)的指標操作、對硬體的操控和接近彙編的執行效率在嵌入式開發領域獨樹一幟。c++,c語言的公升級款,從面向過程走向了物件導向。本文稟著溫故而知性的想法,複習一下c++物件導向相關基礎知識。

c和c++實現輸入乙個點和列印乙個點的區別,在於直接 / 封裝

在c語言中,我們通常用如下方式

float x,y;

//宣告,賦值

printf x,y;

//輸出

這裡只寫偽**

顯然的過程思想,一步步的流程很明顯。

在c++中,我們通常如下,將資料封裝在乙個class中,利用class自己的函式去執行相關操作。很熟悉,是不是,沒錯,我們在c中的struct也是類似幹的。這就是物件導向,利用封裝實現模組化,提高**的可讀性,易於更改。

class

point

private

:float x;

float y;

};

類-抽象,是的,類是乙個抽象的概念,但是注意,並不是想象的,抽象的意思,是指我們不能對類直接進行操作,而是要將類進行例項化。

物件-類的例項化,聽名字可能不是很理解,沒關係,來模擬一下:在c中,我們不能對基本資料型別進行操作,而是利用基本資料型別比如int,宣告乙個變數,對該變數進行操作。類和物件的關係,也類似這樣,類的物件就相當於某乙個資料型別的變數,即該類宣告的乙個變數。

類一般由兩部分組成,成員變數和成員函式。

訪問限定符:變數一般private 函式一般public,物件呼叫成員函式,成員變數宣告為私有,防止類外的改變(達到封裝的目的),可以通過成員函式間接呼叫。

成員函式實現可以在類內實現,也可以在類外實現(但是要加類名和作用域運算子,表示屬於類成員)

注:宣告類,類名首字母大寫,成員駝峰命名法(良好的程式設計習慣很重要)

顧名思義,建構函式是用來對物件進行例項化的,宣告乙個物件時,會自動呼叫建構函式。建構函式必須public,名字與類名相同。當我們沒有自定義建構函式時,編譯器會提供乙個不帶有任何引數的預設建構函式,注意,預設建構函式在構造物件時可以不傳遞引數,有預設引數值的建構函式也是預設建構函式,因為不需要傳遞引數。

建構函式可以自帶引數,比如我們需要在構造時根據使用者需求來初始化成員變數,就需要傳遞引數。

constructor()

;//預設

constructor

(int a=0,

int b=0)

;//引數預設,預設

constructor

(int a,

int b)

;//普通建構函式

在同乙個作用域中,可以有一組具有相同函式名,不同引數列表的函式,這組函式稱為過載函式。引數列表不同是指引數個數或者型別不同。注意返回值要相同。

void

fun();

void

fun(

int a)

;void

fun(

int a,

int b)

;void

fun(

float a)

;

在c++中,常常在建構函式中對資料成員進行初始化

第一種方法: 在建構函式體內,利用賦值語句進行初始化`

constructor

(int a,

int b)

第二種方法:初始化列表

constructor

(int a,

int b):x

(a),

y(b)

為什麼要使用初始化列表:

1、對於類型別的成員,效率高

2、有些型別的成員變數,只能使用初始化成員列表的方式(當類成員變數被定義為const是,賦值語句不能用於初始化,當類成員變數定義為引用時,也不能賦值語句,x(a),成為x是a的引用,還有在繼承時,也用初始化列表

也稱組合類(至少有兩個類)

將乙個類的物件作為另乙個類的成員變數(類似包含關係,以後的文章會與繼承進行比較,組合和繼承時c++中對類進行聯合的操作)

在初始化較大的類時,建構函式會呼叫較小的類的建構函式,我們應該在引數列表中顯式的呼叫小類的建構函式,以免在有引數時呼叫預設建構函式。

組合類實現了模組化。在c語言中,利用函式來實現模組化,在c++中,利用類實現。

建立物件時系統會自動呼叫建構函式進行初始化,同樣,銷毀物件時系統也會呼叫析構函式來進行清理——**物件占用的記憶體空間,以免造成記憶體洩露等問題。

deconstructor,是一種特殊的成員函式,沒有返回值,自動被呼叫,與建構函式不同的是,析構函式在類名前加乙個~,並且不能被過載。

當成員中存在指標變數,且其指向對空間,在析構函式中,我們要顯示的釋放記憶體空間。

和結構體類似,類的物件可以作為乙個函式引數、返回值。我們通常傳遞的是物件的引用,為什麼呢?這裡就是關於深拷貝和淺拷貝的問題。

按值傳遞,函式中構造乙個新的物件,有賦值操作,按引用傳遞,效率高。為了避免修改物件值,用const修飾。

淺拷貝:將物件的值一對一的拷貝給另乙個物件,即邏輯拷貝。但是,如果物件含有指標成員變數,而指標指向物件的一塊空間,將只拷貝指標變數本身的值,造成兩個物件的指標變數指向同乙個空間,退出函式時刪除臨時物件會將原來物件的指標變數也刪除。當原物件釋放時,第二次delete指標,二次刪除會造成程式崩潰。

乙個類寫乙個檔案,注意,避免對各類寫在乙個檔案裡,導致**量龐大。(模組)

標頭檔案放類的宣告,cpp放類的定義、實現。如下所示,一種方法,在宣告之後直接實現成員函式功能。

class

point

;point::

point()

利用.**件實現模組化

//.**件中

class

point

;//cpp檔案中

#include

"***.h"

point::

point()

point::

point

(float a,

float b)

void point::

print()

在c++中,有乙個保留的關鍵字this。每乙個物件都有乙個指標指向物件自己,稱為this指標。在類中,關鍵字this包含當前物件的位址,即其值為&object

每乙個物件都隱式的包含乙個this指標,指向自己。當物件呼叫成員方法時,會預設將物件自己傳遞給該函式,在函式體內不直接使用物件名,可以使用this->方法(*this).方法

友元函式可以訪問類的私有成員,但友元函式不是類的成員函式。乙個類可以作為另乙個類的友元類,說明這個類中的所有成員函式是另乙個類的友元函式。

1、友元函式並非類的成員函式,不受訪問許可權修飾符的限制

2、友元類的所有成員函式都可以訪問該類的私有成員

3、友元函式可以直接訪問類的私有成員,提高了效能,但破壞了封裝性

4、友元類中的所有函式都是友元函式

C 類和物件的基礎概念

類和結構體的區別 盡量將成員成員變數設定為私有許可權 1.類是自定義資料型別,是c語言的結構體的進化 2.物件是類例項化出來的,用資料型別定義乙個變數 3.類內的變數稱為成員變數 成員屬性 類內函式稱為成員函式 成員方法 class m 定義了個類 intmain 封裝是把變數和函式放到類內。然後給...

C 類與物件(2)

一.類的6個預設建構函式 建構函式 主要完成初始化工作 析構函式 主要完成清理工作 拷貝建構函式 使用同類物件初始化建立物件 賦值操作符過載 主要是把乙個物件賦值給另乙個物件 取位址及const取位址操作符過載 主要是普通物件和const物件取位址 二.建構函式 1.概念 建構函式是乙個特殊的成員函...

C 類與物件 2

1.類的6個預設成員函式如果乙個類中什麼成員都沒有,簡稱為空類。空類中什麼都沒有嗎?並不是的,任何乙個類在我們不寫的情況下,都會自動生成下面6個預設成員函式。建構函式 拷貝建構函式 析構函式 賦值運算子過載函式 取位址運算子過載函式 const修飾的取位址運算子過載 2.建構函式 2.1建構函式概念...