- 靜態(tài)成員
可以定義類的靜態(tài)成員,而不是定義一個可普遍訪問的全局對象,就能夠?qū)崿F(xiàn)同類的多個對象之間的數(shù)據(jù)共享。靜態(tài)數(shù)據(jù)成員在內(nèi)存中只占一份空間,而不是每個對象都分別為它分配一份空間,靜態(tài)數(shù)據(jù)成員的值在所有對象中都是一樣的。
在未建立類對象時(shí)也已經(jīng)為靜態(tài)數(shù)據(jù)成員分配空間,因此可以在未建立類對象時(shí)訪問靜態(tài)成員。
靜態(tài)數(shù)據(jù)成員不通過類構(gòu)造函數(shù)進(jìn)行初始化,而是在定義時(shí)進(jìn)行初始化。靜態(tài)數(shù)據(jù)成員必須在類外部定義一次,僅有一次。
靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,是類的一部分,而不是對象的一部分。
靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)的區(qū)別:
非靜態(tài)成員函數(shù)有this指針,而靜態(tài)成員函數(shù)沒有this指針,因此靜態(tài)成員函數(shù)不能訪問本類中的非靜態(tài)成員,作用是為了訪問靜態(tài)數(shù)據(jù)成員。 - 友元
C++提供了友元機(jī)制,允許一個類將其非公有成員的訪問權(quán)限授予指定的函數(shù)或類。友元的生命以關(guān)鍵字friend開始,它只能出現(xiàn)在類定義的內(nèi)部。
因此,現(xiàn)在訪問類的非公有成員可以有兩個用戶:類成員和友元。
面向?qū)ο蟪绦蛟O(shè)計(jì)的一個基本原則就是封裝性和信息隱蔽,而友元卻可以訪問其他類的私有成員,突破了封裝原則。友元的使用有助于數(shù)據(jù)共享,能提高程序的效率,但是也不要濫用。 - 泛型編程
面向過程(PO)是通過將代碼段封裝在一個函數(shù)中,通過函數(shù)調(diào)用來實(shí)現(xiàn)目標(biāo)代碼的重用。
面向?qū)ο笫峭ㄟ^類的繼承來實(shí)現(xiàn)對象目標(biāo)代碼的重用。
泛型是一種允許一個數(shù)據(jù)取不同類型的技術(shù),泛型算法是與操作對象的數(shù)據(jù)類型獨(dú)立的算法。泛型算法建立在各種抽象化基礎(chǔ)之上。利用參數(shù)化模板來達(dá)到數(shù)據(jù)類型的抽象化,利用容器和迭代器來達(dá)到數(shù)據(jù)結(jié)構(gòu)的抽象化,利用分配器和適配器來達(dá)到存儲分配和界面接口的抽象化。 - 數(shù)據(jù)封裝
C++通過類實(shí)現(xiàn)數(shù)據(jù)封裝,即通過指定各成員的訪問權(quán)限來實(shí)現(xiàn)。 - 繼承和派生
在C++中,繼承就是在一個已存在的類的基礎(chǔ)上建立一個新的類。在一個派生類中,其成員由兩部分構(gòu)成:一部分是從基類繼承得到的,另一部分是自己定義的新成員。
友元關(guān)系不能繼承。一方面,基類的友元對派生類的成員沒有特殊的訪問權(quán)限,另一方面,如果基類被授予友元關(guān)系,則只有基類具有特殊的訪問權(quán)限,該基類的派生類不能訪問授予友元關(guān)系的類。
只有基類類成員和友元可以訪問基類的private部分,派生類不能訪問基類的私有成員。但是若聲明為protected,仍然不能被類用戶訪問,但是可被派生類訪問。 - 派生類的構(gòu)造和析構(gòu)函數(shù)
在定義派生類時(shí),派生類并沒有把基類的構(gòu)造函數(shù)和析構(gòu)函數(shù)繼承下來。因此,對繼承的基類成員的初始化工作要由派生類的構(gòu)造函數(shù)來承擔(dān),同時(shí)基類的析構(gòu)函數(shù)也需要由派生類的析構(gòu)函數(shù)來調(diào)用。
如果一個派生類有多個直接基類,而這些直接基類又有一個共同的基類,則在最終的派生類中會保留該間接共同基類數(shù)據(jù)成員的多份同名成員。所以C++提供了虛基類機(jī)制,使得在繼承間接共同基類時(shí)只保留一份成員。 - 多態(tài)性和虛函數(shù)
多態(tài)是指同樣的消息被不同類型的對象接收時(shí)導(dǎo)致不同的行為。所謂消息是指對類成員函數(shù)的調(diào)用,不同的行為是指不同的實(shí)現(xiàn),也就是調(diào)用了不同的函數(shù)。
多態(tài)的分類:
- 重載多態(tài)
重載分為函數(shù)重載和運(yùn)算符重載。重定義已有的函數(shù)稱為函數(shù)重載。重定義已有運(yùn)算符的語義為運(yùn)算符重載。 - 強(qiáng)制多態(tài)
強(qiáng)制類型轉(zhuǎn)換 - 參數(shù)化多態(tài)
將類型作為函數(shù)或類的參數(shù),避免為各種不同的數(shù)據(jù)類型編寫不同的函數(shù)或類,提高了程序設(shè)計(jì)的靈活性。
模板是C++實(shí)現(xiàn)參數(shù)化多態(tài)性的工具,分為函數(shù)模板和類模板。 - 包含多態(tài)
C++中采用虛函數(shù)實(shí)現(xiàn)包含多態(tài)。至少含有一個虛函數(shù)的類稱為多態(tài)類。
- 賦值兼容性規(guī)則
賦值兼容性規(guī)則是指在需要基類對象的任何地方,都可以使用公有派生類對象來替代。即子類可以賦值給基類。
賦值兼容規(guī)則是C++多態(tài)性的重要基礎(chǔ)之一。 - 聯(lián)編binding
聯(lián)編又稱綁定,就是將模塊或函數(shù)合并在一起生成可執(zhí)行代碼的處理過程,同時(shí)對每個模塊或者函數(shù)分配內(nèi)存地址,并且對外部訪問也分配正確的內(nèi)存地址。
靜態(tài)聯(lián)編:在編譯階段就將函數(shù)實(shí)現(xiàn)和函數(shù)調(diào)用綁定起來
動態(tài)聯(lián)編:在程序運(yùn)行的時(shí)候才進(jìn)行函數(shù)實(shí)現(xiàn)和函數(shù)調(diào)用的綁定,運(yùn)用虛函數(shù) - 虛函數(shù)
如果派生類沒有改寫基類的虛函數(shù),則函數(shù)指針調(diào)用基類的虛函數(shù)。如果派生類改寫了基類的心虛函數(shù),編譯器將重新為派生類的虛函數(shù)建立地址,函數(shù)指針會調(diào)用改寫以后的虛函數(shù)。
利用虛函數(shù),可以在基類和派生類中使用相同的函數(shù)名定義函數(shù)的不同實(shí)現(xiàn)。當(dāng)用基類指針或引用對虛函數(shù)進(jìn)行訪問時(shí),系統(tǒng)將根據(jù)運(yùn)行時(shí)指針或引用所指向的實(shí)際對象來自動確定調(diào)用對象所在類的虛函數(shù)版本。 - 虛析構(gòu)函數(shù)
當(dāng)基類的析構(gòu)函數(shù)聲明為虛函數(shù)時(shí),無論指針指的是同一類族中的哪一個類對象,系統(tǒng)總會采用動態(tài)聯(lián)編,調(diào)用正確的析構(gòu)函數(shù),對該對象進(jìn)行清理。
C++支持虛析構(gòu)函數(shù),但不支持虛構(gòu)造函數(shù),即構(gòu)造函數(shù)不能聲明為虛函數(shù)。這是因?yàn)樵趫?zhí)行構(gòu)造函數(shù)時(shí),類對象還未完成建立過程,當(dāng)然談不上虛函數(shù)與類對象的綁定。 - 抽象類
純虛函數(shù)=0沒有函數(shù)體,便于派生類根據(jù)需要對它進(jìn)行定義。
包含純虛函數(shù)的類稱為抽象類。一個抽象類只能作為基類來派生新類,而不能定義對象。抽象類的主要作用是聲明一族派生類的共同接口,而接口的完整實(shí)現(xiàn),即純虛函數(shù)的函數(shù)體需要由派生類自己定義,使它們能夠更有效的發(fā)揮多態(tài)特性。 - 運(yùn)算符重載
C++不允許創(chuàng)造新的運(yùn)算符,不過它允許重載大部分現(xiàn)有運(yùn)算符,賦予其另一種功能,以適應(yīng)不同的類型。