第一章 類和對象
類和對象是面向對象程序設計的兩個最基本、最重要的概念。所謂對象就是客觀事務在計算機中的抽象描述;而所謂類則是對具有相似屬性和行為的一組對象的統一描述。從程序設計語言的角度來說,類是一種數據類型,而對象是具有這種類型的變量。
1.類的定義
類定義的一般形式為:
class 類名
{
private:
數據成員或成員函數
protected:
數據成員或成員函數
public:
數據成員或成員函數
};
<各成員函數的實現代碼>
其中,class是定義類的關鍵字。類名是一個有效的標志符,且一般首字母大寫。大括號括起來的部分是類說明部分,它聲明了類的所有成員(包括數據成員和函數成員),這些成員從訪問權限上分成三類,即私有(private)、公有(public)和保護(protected),其中默認權限為private.
類的private部分說明的成員,在類之外是不能存取的,只有類中的成員函數才能存取private的數據成員和成員函數。類的public部分說明的成員,可被程序中的任何函數或語句存取,public成員多為成員函數,用來提供一個與外界的接口,外界只有通過這個接口才可以實現對private成員的存取。類的protected部分說明的成員,不能在類之外存取,只有類的成員函數及其子類(派生類)可以存取protected的成員。
2.成員函數的定義
類中的成員函數可以在兩處定義:一是將成員函數的定義直接寫在類中,一般適合於成員函數規模較小的情況;二是在類的定義體中只寫出成員函數的原型說明,而成員函數的定義寫在類的定義之外,這種情況比較適合於成員函數體較大的情況,其定義格式為:
返回值類型 類名::成員函數名(參數說明)
{
函數體;
}
此處的“::”符號稱為作用域運算法(名空間分隔符),它是用來指明哪個函數屬於哪個類或哪個數據屬於哪個類。
需要說明的是,成員函數既可以是有參函數,也可以像普通函數一樣,給形參指定默認值。
3.對象及指向對象的指針
對象是類的實例,定義對象之前一定要說明該對象的類。定義對象的一般格式為:
類名 對象名表;
其中,對象名表中可以有一個或多個對象名,多個對象名之間用逗號分隔。
另外,也可以定義指向類類型的指針,其定義格式為:
類名 *指針變量名;
4.訪問對象的成員
訪問對象的成員有以下兩種格式:
(1) 對象名。成員名
(2) 指針變量名->成員名
第一種格式是利用對象和運算符“。”訪問成員;而第二種格式是采用指向對象的指針和運算符“->”來訪問成員,並且第二種格式中的指針變量必須已指向某個對象。
5.類成員指針
在C++語言中,除了可以定義指針對象外,還可以定義類成員指針。
類數據成員指針就是程序中定義的用於指向類中數據成員的指針變量,借助該指針變量可以訪問它所指向的類中的數據成員(該數據成員必須具有public訪問權限),但該指針變量不是類的成員,它只是程序中的一個指針變量而已。
類數據成員指針的定義格式如下:
類型 類名::*指針變量名;
此處的“類型”要與類中數據成員的類型保持一致。
要使已經定義的類數據成員的指針變量指向類中某個數據成員時,可以通過以下語句:
類數據成員指針變量名=&類名::類數據成員變量名;
當類數據成員指針變量已經指向類中某個數據成員時,可以通過以下語句訪問類中數據成員:
對象名。*類數據成員指針變量名;
6.this指針
在每一個類成員函數的形參表中都有一個隱含的指針變量this,該指針變量的類型就是成員函數所屬類的類型。當程序中調用成員函數時,this指針變量被自動初始化為發出函數調用的對象的地址。
盡管我們在定義成員函數時沒有看到this指針變量,也沒有定義this指針變量,但是在成員函數的函數體內我們可以使用this指針變量,因為該指針變量使系統隱含給出的,我們不需要也不能在成員函數的形參表中對this指針變量進行顯示說明。
類中成員函數有了隱含的指針變量this後,就可以保證用不同的對象調用成員函數是對不同對象的操作。
7.對象賦值語句
對於同一個類生成的兩個對象,可以進行賦值,其功能是將一個對象的數據成員賦值到另一個對象中去,賦值語句的左右兩邊各是一個對象名。
如,已知一個類Example,則:
Example obj1,obj2;
obj2=obj1;//將對象obj1的數據成員賦給對象obj2
8.對象的作用域和生存期
在不同的位置以不同的方式定義對象時,其作用域和生存期是不同的,其原理與普通變量相同。可分為局部對象(不包括局部靜態對象)、靜態對象(局部靜態對象和全局靜態對象)、全局對象等。
9.堆對象
所謂堆對象是指在程序運行過程中,根據需要隨時可以建立和刪除的對象。堆對象被創建在內存中一些空閒的存儲單元中,這些存儲單元被稱為堆。堆可以被創建的對象占有,可以通過刪除堆對象而獲得釋放。
需要利用new運算符創建堆對象,利用delete運算符刪除堆對象。堆對象的生存期是整個程序的生命期。如:
Example *p;//p為指向類Example對象的一個指針
p=new Example(); //使用new給p分配內存空間
delete p; //使用delete釋放p所指向的空間
10.對象數組
當一個數組的類型為類類型時,該數組中的每個元素都是該類中的一個對象,則這種數組就是對象數組。對象數組的定義格式為:
類名 數組名 [數組大小];
如:
Example array[10];
表明array數組是一個一維對象數組,該數組有10個元素,從array[0]到array[9],其中每個元素都是類Example的對象。