C 之類小結

2021-09-11 16:06:58 字數 4131 閱讀 6940

面對物件:面對將系統看成通過互動作用來完成特定功能的物件的集合。每個物件用自己的方法來管理資料。也就是說物件內部的**能夠操作物件內部的資料。

類的特性:抽象、封裝、繼承、多型。

(1)抽象性:表示同一類事物的本質;類是物件的抽象,物件是類的特例,即物件是類的具體表現形式。

(2)封裝性:就是將某些東西包裝盒隱藏起來,讓外界無法直接使用,只能通過某些特定的方式才能訪問。其目的是增強安全性和簡化程式設計,使用者不必了解功能具體的實現細節,而只是通過外部介面以及特定的訪問許可權來使用類的成員。

這就涉及到類的訪問限定符了:private/public/protected。

(3)繼承性:它是物件導向的乙個重要概念,如果類b繼承來至a,就把類b稱為"「a的子類」,把a稱為"「b的父類」。繼承這一特性,可以使子類具有父類父類的各種屬性和方法,而不需要再次編寫相同的**,在令子類繼承父類的同時,可以重新定義某些屬性,並重新某些方法,即覆蓋父類的原有屬性和方法,使其獲得與父類不同的功能。

繼承是指乙個物件直接使用另乙個物件的屬性和方法,事實上我們遇到的很多事物都有繼承的含義,例如,若把動物看做乙個實體,他可以分成很多個子實體,如:貓、狗、雞等等,這些字實體都具有動物的特性,因此,動物是它們的「父親」,而這些子實體則是動物的「孩子」。

繼承也會涉及訪問限定符。

(4)多型性:多型可以使我們以相同的方式處理不同型別的物件,我們可以使用一段**處理不同型別的物件,只要他們繼承/實現了相同的型別。這樣我們沒有必要為每一種型別的物件編寫相同的邏輯,極大的提高了**的重用。其實,用簡單的一句話來形容就是:多型性,允許將子類型別的指標賦值給父類型別的指標,多型性在c++中是通過虛函式實現的。虛函式就是允許被其子類重新定義的成員函式。而子類重新定義父類虛函式的做法,稱為「覆蓋」,或者稱為「重寫」。子類重寫父類中虛函式時,即使不用virtual宣告,該過載函式也是虛函式。詳細介紹:

(2)限定符介紹:

(1)private:類中函式可見、友元函式可以訪問,不能被任何其它訪問,該類的物件也無法直接訪問。

(2)protected:類中函式可見、子類的函式可見、友元函式可見,該類的物件無法直接訪問。

(3)public:類中函式可見、子類可見、友元函式可見、類物件也可見。

友元函式包括兩種:友元全域性函式、友元類中的成員函式。

(3)繼承中涉及的許可權問題

a類(基類)

b類(a的派生類)

c類(b的派生類)

公有繼承

公有成員

公有成員

公有成員

私有成員

(無)(無)

保護成員

保護成員

保護成員

私有繼承

公有成員

私有成員

(無)私有成員

(無)(無)

保護成員

私有成員

(無)保護繼承

公有成員

保護成員

保護成員

私有成員

(無)(無)

保護成員

保護成員

保護成員

(4)覆蓋與過載

無論在類作用域內還是外,兩個(或多個)同名的函式,可能且僅可能是以下三種關係:過載(overload)、覆蓋(override)和隱藏(hide),因為同名,區分這些關係則是根據引數是否相同、是否帶有const成員函式性質、是否有virtual關鍵字修飾以及是否在同一作用域來判斷。

(1)覆蓋

真正的多型行為,通過虛函式來實現,所以,編譯器根據以下依據來進行判定兩個(注意只可能是兩個,即使在繼承鏈中,也只是最近兩個為一組)函式之間的關係是覆蓋:

(1)不同的範圍:即使用域,兩個函式分別位於基類和派生類中

(2)函式名字相同(基本前提)

(3)函式引數也相同(基本前提),第(2)和第(3)點統稱「函式特徵標」相同

(4)基類函式必須用virtual關鍵字修飾

即「不同的範圍,特徵標相同,且基類有virtual宣告,發生覆蓋「。

(2)過載

如果不在類作用域內進行討論,兩個(或多個)同名函式之間的關係只可能是過載或隱藏。相同函式名但引數不同,返回型別不會對是否過載有任何影響。過載是編譯期繫結的靜態行為,不是真正的多型性

有以下判定依據:

(1)相同的範圍:即作用域,這裡指在同乙個類中,或同乙個名字空間,即c++的函式過載不支援跨越作用域進行,這也是區別過載和隱藏的最重要依據。

(2)函式名字相同(基本前提)

(3)函式引數不同(基本前提,否則在同一作用域內有兩個或多個同名同引數的函式,將產生ambiguous,另外注意,對於成員函式,是否是const成員函式,即函式宣告之後是否帶有const標誌,可理解為「引數不同「),第(2)和第(3)點統稱「函式特徵標」不同

(4)virtual關鍵字可有可無不產生影響(因為第(1)點已經指出,這是在同乙個類中)

即"相同的範圍,特徵標不同(當然同名是肯定的),發生過載"。

(3)隱藏

(1)如果派生類函式與基類函式同名,但引數不同(特徵標不同),此時,無論是否有virtual關鍵字,基類的所有同名函式都將被隱藏,而不會過載,因為不在同乙個類中;

(2)如果派生類函式與基類函式同名,且引數也相同(特徵標相同),但基類函式沒有用virtual關鍵字宣告,則基類的所有同名函式都將被隱藏,而不會覆蓋,因為沒有宣告為虛函式。

即「不同的範圍,特徵標不同(當然同名是肯定的),發生隱藏」,或「不同的範圍,特徵標相同,但基類沒有virtual宣告,發生隱藏「。

可見有兩種產生隱藏的情況,分別對應不能滿足過載和覆蓋條件的情況。

物件

物件是類的特例。有兩要素:屬性和行為;

屬性對應於物件的資料;行為對應於函式;

物件之間可以通過一定的渠道相互聯絡;要使某乙個物件實現某一種行為(操作),應當向它傳送相應的訊息。

類的組成

(1)建構函式:

(2)析構函式

(3)成員函式

(4)友元函式

(5)成員變數

(5)成員變數初始化

(1)成員被初始化的次序就是定義成員的次序,跟初始化列表中的順序無關。

(2)初始化 const 或引用型別資料成員的唯一機會是建構函式初始化列表中,在建構函式函式體中對它們賦值不起作用。

(3)沒有預設建構函式的類型別,因為使用初始化列表可以不必呼叫預設建構函式來初始化,而是直接呼叫拷貝建構函式。

(4)不能包含本類的物件,但能包含該類的指標物件。

(6)static成員

1 static成員變數

static 資料成員是與類關聯的物件,並不與該類的物件相關聯。

static 成員遵循正常的公有/私有訪問規則。

2 使用 static 成員而不是全域性物件有三個優點

(1) static 成員的名字是在類的作用域中,因此可以避免與其他類的成員或全域性物件名字衝突。

(2) 可以實施封裝。static 成員可以是私有成員,而全域性物件不可以。

(3) 通過閱讀程式容易看出 static 成員是與特定類關聯的,這種可見性可清晰地顯示程式設計師的意圖。

3 static成員函式

在類的內部宣告函式時需要新增static關鍵字,但是在類外部定義函式時就不需要了。

因為static 成員是類的組成部分但不是任何物件的組成部分,所以有以下幾個特點:

static 函式沒有 this 指標

static 成員函式不能被宣告為 const (將成員函式宣告為 const 就是承諾不會修改該函式所屬的物件)

static 成員函式也不能被宣告為虛函式

4 static資料成員

static 資料成員可以宣告為任意型別,可以是常量、引用、陣列、類型別,等等。

static 資料成員必須在類定義體的外部定義(正好一次),並且應該在定義時進行初始化。

5特殊的靜態常量整型成員

靜態常量整型資料成員可以直接在類的定義體中進行初始化,例如:

static const int m_inum = 9;

類之虛函式、動態聯編 :

C 基礎之類

具有某種身份的事物就是物件 在應用領域中有意義的 與所要解決的問題有關係的任何事物都可以作為物件,它既可以是具體的物理實體的抽象,也可以是人為的概念,或者是人和有明確邊界和意義的東西。任何事物都可以用物件來進行描述 萬物皆物件。物件是一組資料以及對這組資料有關操作組合封裝的實體,這組資料也可以稱為物...

C 回顧之類

定義在類內部的函式是隱式的inline函式。常量成員函式 預設情況下隱式的this的型別是指向類型別非常量版本的常量指標,即自身是常量,但是指向的物件不是常量,為了使得this能繫結到乙個常量物件 如const 則在函式後面加上const。但是這樣子就不可以改變呼叫它的物件的資料成員。include...

C 之類繼承

主要探索 1 派生類對基類protecteed public private三種資料訪問 和這三種繼承方式比較。2 派生類包含子物件。3 子類包含建構函式。通過public方式繼承 具體示例 include include using namespace std 定義基類 class people ...