抽象性:對對象進行歸納,抽出一類對象的公共性質並加以描述的過程。【數據抽象、行爲抽象】程序員
封裝性:將抽象獲得的數據、行爲、功能相結合,造成一個有機的總體。就是將數據與操做數據的函數代碼進行有機結合,造成「類」,其中的數據和函數都是類的成員。編程
經過封裝,對成員訪問權限合理控制,使得不一樣類之間的相互影響減小到最低限度,進而加強數據的安全性和簡化程序編寫工做。安全
繼承性函數
多態性spa
類的定義和實現設計
class 類名 { public: 公有成員(數據成員和函數成員) private: 私有成員(數據成員和函數成員) protected: 保護型成員(數據成員和函數成員) };
其中,public成員是類與外部的接口。3d
舉例:code
類的成員函數實現的通常語法形式(成員函數的實現寫在類的定義外面的情形):對象
返回值類型 類名::函數成員名(形參列表)
{
函數體
}
其中,雙冒號稱爲二元做用域運算符。blog
舉例:
注意:
關於類的成員數據:
① 定義方法與普通變量相同,只是它必須被定義在類內部。
② 在類內部,成員數據只能被定義,但不能被初始化。
關於類的成員函數:
若是在類內部僅聲明函數原型,在類外部定義函數體,則必須使用二元做用域分辨符::
聲明內聯成員函數:
方法1: 成員函數的函數體定義在類內部
方法2: 使用關鍵字inline
對象的定義和使用
對象是類的實例。即,對象是類的變量。【關於對象的使用,能夠參考結構體成員的使用。】
對象的定義:類名 對象名;
對象的使用:使用對象名.成員名的形式訪問共有成員。
類的構造函數和析構函數
構造函數:
介紹:① 是特殊的成員函數。 ② 用於在建立對象時爲對象分配內存 ,並能夠將其初始化到特定的狀態。
性質:① 構造函數的函數名與類名相同。
② 構造函數無返回值,因此不能設定返回類型,即便是void也不能夠。
③ 構造函數是在建立對象時由編譯器自動調用的。
④ 構造函數能夠是內聯函數、重載函數或帶默認形參值的函數。
舉例:
①用戶未定義構造函數的情形:
main函數中定義對象時,系統隱含調用了默認的構造函數。但,只能完成內存分配,卻沒法進行初始化。
②用戶定義一個不帶參數的構造函數:
在main函數中定義對象時,系統隱含調用了用戶自定義構造函數。
③用戶定義一個帶參數的構造函數
實際定義對象時,也要帶有參數,不然,編譯系統報錯。
④用戶定義一個帶默認形參值的構造函數:
在main函數中,定義myclock時使用用戶給的實參完成初始化。 定義hisclock時使用構造函數中默認形參值進行初始化。
⑤展現構造函數是被編譯系統自動調用的:
main函數中定義對象時,主函數中並無顯式調用構造函數的代碼。 但運行截圖可見,構造函數中的提示被輸出了。
⑥構造函數的重載
編譯器根據建立對象時實參狀況,自動調用最佳匹配的構造函數。
定義myclock處,編譯器自動調用不帶參數的構造函數;
定義hisclock處,編譯器自動調用帶參數的構造函數。
main函數中,
定義myclock處,存在歧義。 編譯器無從選擇哪個爲最佳匹配的構造函數。
定義hisclock 處,編譯器根據建立對象時實參狀況,自動調用最佳匹配的構造函數,即帶參數的構造函數。
注意:
① 在一個類的定義中,能夠包含多個構造函數。這些構造函數有相同的函數名稱,但具備不一樣的形參列表。
② 定義對象時,編譯器會根據參數的個數、類型來決定調用哪個重載構造函數。
③ 當重載不帶參數的構造函數和帶默認形參值的構造函數時,程序可能會產生二義性。所以,在實際編程中應避免這一情形。
複製構造函數:
① 是特殊的構造函數:其形參是本類對象的引用。
② 複製構造函數在下述情形被調用: 使用已有的對象初始化一個新的對象。
語法形式:
舉例:
①用戶自定義複製構造函數:
主函數中,定義myclock時,編譯器自動調用帶參數的構造函數,並使用定義對象時的實參進行初始化。
定義hisclock時,編譯器自動調用複製構造函數,用已存在的對象myclock初始化。
②展現複製構造函數被編譯系統自動調用:
主函數中,定義myclock和hisclock時,主函數中並無顯式調用構造函數和複製構造函數。 但運行截圖可見,兩個函數裏的信息都被輸出了。 所以,不管是構造函數,仍是複製構造函數,都是由編譯器負責自動調用的。
注意:
① 複製構造函數有且只有一個形參,並且這個形參必須是本類對象的引用。
② 若是用戶沒有自定義複製構造函數,在必要的時候,編譯器會自動建立一個默認的複製構造函數。
③複製構造函數多用const來代表常引用,此時使用值但不修改值,例:Clock::Clock ( const Clock &t );
複製構造函數會被自動調用的狀況:
① (顯式)用已存在的對象初始化該類的另外一個對象時:
②函數形參爲類對象,函數調用實參賦值給形參時:
主函數中調用了形參爲類對象的函數,將實參賦值給形參。參數傳遞過程當中, 複製構造函數被調用。
③函數返回值爲類對象時:
函數中的返回值爲類對象,複製構造函數被調用了。
析構函數
① 是特殊的成員函數
② 用於釋放對象所佔的內存及完成相關的「清理」工做
③析構函數的函數名爲「~ 類名」。
④析構函數既沒有參數,也沒有返回類型。
⑤析構函數是在對象生存期結束時由編譯器自動調用的。
⑥析構函數不能被重載,所以任意類中只有一個析構函數。
⑦若程序員沒有自定義析構函數,編譯器會自動地建立一個默認的析構函數。
類的組合是指類中的成員數據是另外一個類的對象。
由此,在已有的抽象和封裝的基礎上,實現更復雜的抽象與封裝,以對應現實世界的複雜模型。
類Line的成員p1, p2是另外一個類Point的對象。
類的組合中,關於函數調用順序:
① 先調用內嵌對象的構造函數,再調用本類對象的構造函數。
若是有多個內嵌對象,按照內嵌對象在組合類中的聲明順序依次調用,即先聲明者先構造。
② 析構函數的調用順序,與構造函數的調用順序相反。
③因爲複製構造函數是特殊的構造函數,因此,其調用順序與構造函數相同,也是先調用內嵌對象的複製構造函數,再調用本類對象的複製構造函數。
① 結構體和共用體都屬於自定義類型。支持把邏輯上相互關聯的數據和操做放在一塊兒。
② C++中的結構體與共用體,與C徹底兼容。
③ C++中的結構體與共用體,相較於C,新增了成員函數和訪問控制權限。所以,能夠看做是特殊形態的類。
注意:類與結構體的區別是訪問權限,結構體默認public,而類默認private。
結構體:
① C++中的結構體 vs. C中的結構體
a) 寫法上,結構體類型名不須要關鍵字struct
b) C++中的結構體,內部能夠有成員函數。
② C++中的結構體 vs. C++中的類
a) 結構體中的成員,默認訪問權限爲public
b) 類的成員,默認訪問權限爲private
共用體:
① C++中的聯合體 vs. C中的聯合體
a)寫法上,聯合體類型名不須要關鍵字union
b) C++中的聯合體,內部能夠有成員函數,但使用很少
② C++中的聯合體 vs. C++中的結構體
a)聯合體中的數據成員共享同一組內存單元
b)聯合體對於自定義構造/析構函數、重載、繼承、多態等方面有所限制
const修飾的成員函數:
注意:①只能使用數據成員,不能修改;②不能調用非const成員函數
const修飾的成員數據:
注意:①對於某個具體對象而言,該數據爲常量,不能修改;②其初始化只能在類構造函數的初始化表中進行。