類是一種抽象和封裝機制,描述一組具有相同屬性和行為的對象,是代碼復用的基本單位。
面向對象關鍵特性之一就是隱藏數據,采用機制就是設置類成員的訪問控制權限。類成員有3種訪問權限:
此處注意區分類的成員函數和類對象。
一般來說,公有成員是類的對外表現,而私有成員是類的內部實現,不希望外界了解。
類的數據成員說明了對象的特征,而類的成員函數決定對象的操作行為。成員函數是算法的實現部分,是對封裝的數據進行操作的唯一途徑。其實現方式可分為類內實現和類外實現。類外實現形式如下:
返回值類型 類名::成員函數名(形式參數表)
{
函數體;
}
對象是類的實例,系統不會為抽象的類分配存儲空間,但卻要為對象分配相應的內存空間。但這個內存空間只能用於存放對象的數據成員,其成員函數不在每個對象中的存儲副本。
對象的創建比普通變量的創建復雜,它需要在分配內存空間的同時將數據成員的初始值一並寫入。構造函數的作用是在對象被創建時利用特定的值構造對象。
聲明一個構造函數的語法格式如下:
public:
類名(<參數表>);
構造函數是類的一個特殊成員函數,它的函數名與類名相同,可以有任意類型的參數,但不能有返回類型。當創建一個新對象時,編譯器會自動調用構造函數。構造函數可以自己編寫提供;如果不提供,編譯器會自動生成一個不帶參數的默認構造函數(不做任何具體工作)。
重載構造函數:
所謂重載構造函數,是指同一個構造函數名,其參數表不同。注意:當構造函數帶默認參數時,要避免出現歧義。
拷貝構造函數:
拷貝構造函數就是用來復制對象的一種特殊的構造函數。通過它,可以使用一個已經創建好的對象(由拷貝構造函數的參數指定)去初始化一個正在創建的同類對象。
聲明拷貝構造函數的語法格式如下:
class 類名
{
public:
類名(類名 & 對象名);
};
拷貝構造函數只能有一個參數,而且是對某個同類對象的引用。每個類都必須有一個拷貝構造函數,如果該函數的功能僅僅是將已創建對象數據成員的值賦給正在創建對象的數據成員,那麼沒有必要顯示定義它,而由編譯器自動生成一個具有上述形式的默認拷貝狗仔函數。
析構函數與構造函數的作用幾乎相反,當一個對象消失時,或用delete刪除用new創建的對象時,系統都會自動調用類的析構函數做一些清理工作。它調用完成後,對象就消失了,其相應的內存空間也就被釋放了。
聲明一個析構函數的語法格式如下:
class Demo
{
public:
Demo(<參數表>);
~Demo(void);
}
析構函數的函數名與類名相同,只是在前面加上一個"~"。它沒有參數和返回值,但可以是虛函數。由於一個類只能定義一個析構函數,所以析構函數不能重載。析構函數調用順序是最後創建的對象最先消亡。