1、封裝
封裝,即隱藏對象的屬性和實現(xiàn)細(xì)節(jié),僅對外公開接口,控制程序?qū)︻悓傩缘淖x取和修改。
- 對于類的內(nèi)部,成員函數(shù)可以自由修改成員變量,進(jìn)行更精確的控制;
- 對于類的外部,良好的封裝能夠減少耦合,同時隱藏實現(xiàn)細(xì)節(jié)。
C++類成員的三種訪問權(quán)限:public/protected/private
試想如果對類中成員變量的訪問不做限制,那任何代碼都可以訪問、修改,雖然這樣看起來更加靈活,但也意味著不可控,成員變量可以隨意被修改,而且修改邏輯可能在代碼中的各個角落,影響代碼的可讀性、可維護(hù)性。
2、抽象
抽象包括兩個方面,一是數(shù)據(jù)抽象,二是過程抽象。
- 數(shù)據(jù)抽象,關(guān)注于目標(biāo)的特性信息;
- 過程抽象,關(guān)注于目標(biāo)的功能是什么,而不是功能是怎么實現(xiàn)的。
比如對于“學(xué)生”這個對象,其目標(biāo)特性信息包括:學(xué)校、年級、班級、學(xué)號、成績等;其功能包括:學(xué)習(xí)、運動、繪畫、考試、比賽等。
封裝主要講的是隱藏信息、保護(hù)數(shù)據(jù),而抽象講的是隱藏方法的具體實現(xiàn)。
類的方法主要通過“函數(shù)”這一語法機(jī)制來實現(xiàn)的。通過函數(shù)包裹具體的實現(xiàn)邏輯,這本身就是一種抽象。調(diào)用者在使用函數(shù)的時候,并不需要去研究函數(shù)內(nèi)部的實現(xiàn)邏輯,只需要通過函數(shù)的命名、注釋或者文檔,了解其提供了什么功能,就可以直接使用了。

3、繼承
繼承,即子類繼承父類的特征和行為,使得子類具有父類的成員變量和方法。
C++類的三種繼承方式:public/protected/private
從繼承關(guān)系上來講,繼承可以分為兩種模式,單繼承和多繼承。
- 單繼承表示一個子類只繼承一個父類;
- 多繼承表示一個子類可以繼承多個父類。
繼承最大的一個好處就是代碼復(fù)用。假如兩個類有一些相同的屬性和方法,我們就可以將這些相同的部分,抽取到父類中,讓兩個子類繼承父類。這樣,兩個子類就可以重用父類中的代碼,避免代碼重復(fù)寫多遍。不過,過度使用繼承,繼承層次過深,也會導(dǎo)致代碼可讀性、可維護(hù)性變差。
4、多態(tài)
多態(tài),即同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力。表現(xiàn)形式有覆蓋和重載。
- 覆蓋是指子類重寫從基類繼承過來的函數(shù),函數(shù)名、返回值、參數(shù)列表都必須和基類相同。當(dāng)子類的對象調(diào)用成員函數(shù)的時候,如果成員函數(shù)有被覆蓋則調(diào)用子類中覆蓋的版本,否則調(diào)用從基類繼承過來的函數(shù)。
- 重載指在相同作用域中存在多個同名的函數(shù),這些函數(shù)的參數(shù)表不同,編譯器根據(jù)函數(shù)不同的形參表對同名函數(shù)的名稱做修飾,然后這些同名函數(shù)就成了不同的函數(shù)。