1、封裝
封裝,即隱藏對象的屬性和實現細節,僅對外公開接口,控制程序對類屬性的讀取和修改。
- 對于類的內部,成員函數可以自由修改成員變量,進行更精確的控制;
- 對于類的外部,良好的封裝能夠減少耦合,同時隱藏實現細節。
C++類成員的三種訪問權限:public/protected/private
試想如果對類中成員變量的訪問不做限制,那任何代碼都可以訪問、修改,雖然這樣看起來更加靈活,但也意味著不可控,成員變量可以隨意被修改,而且修改邏輯可能在代碼中的各個角落,影響代碼的可讀性、可維護性。
2、抽象
抽象包括兩個方面,一是數據抽象,二是過程抽象。
- 數據抽象,關注于目標的特性信息;
- 過程抽象,關注于目標的功能是什么,而不是功能是怎么實現的。
比如對于“學生”這個對象,其目標特性信息包括:學校、年級、班級、學號、成績等;其功能包括:學習、運動、繪畫、考試、比賽等。
封裝主要講的是隱藏信息、保護數據,而抽象講的是隱藏方法的具體實現。
類的方法主要通過“函數”這一語法機制來實現的。通過函數包裹具體的實現邏輯,這本身就是一種抽象。調用者在使用函數的時候,并不需要去研究函數內部的實現邏輯,只需要通過函數的命名、注釋或者文檔,了解其提供了什么功能,就可以直接使用了。
3、繼承
繼承,即子類繼承父類的特征和行為,使得子類具有父類的成員變量和方法。
C++類的三種繼承方式:public/protected/private
從繼承關系上來講,繼承可以分為兩種模式,單繼承和多繼承。
- 單繼承表示一個子類只繼承一個父類;
- 多繼承表示一個子類可以繼承多個父類。
繼承最大的一個好處就是代碼復用。假如兩個類有一些相同的屬性和方法,我們就可以將這些相同的部分,抽取到父類中,讓兩個子類繼承父類。這樣,兩個子類就可以重用父類中的代碼,避免代碼重復寫多遍。不過,過度使用繼承,繼承層次過深,也會導致代碼可讀性、可維護性變差。
4、多態
多態,即同一個行為具有多個不同表現形式或形態的能力。表現形式有覆蓋和重載。
- 覆蓋是指子類重寫從基類繼承過來的函數,函數名、返回值、參數列表都必須和基類相同。當子類的對象調用成員函數的時候,如果成員函數有被覆蓋則調用子類中覆蓋的版本,否則調用從基類繼承過來的函數。
- 重載指在相同作用域中存在多個同名的函數,這些函數的參數表不同,編譯器根據函數不同的形參表對同名函數的名稱做修飾,然后這些同名函數就成了不同的函數。