從本章開始我們將要介紹C++的一個重要的特性:“類”(CLASS),它支持用戶定義一種新的數據類型。程序語言內部類型的一個實例稱為變量,而類類型的變量則稱為對象(object),因此,我們稱C++為麵向對象程序設計方法,簡稱為OOP(Object-OrientedPro-gmm)。學習麵向對象程序設計便是學習如何設計我們所需要的類,以及如何使用和處理類所定義出的對象。類與對象的概念是C++程序設計的核心部分,我們將在本章進行細致的討論。

5.1在C++中創建新的數據類型

在C++中,通過聲明一個類,可以同時定義數據類型及其操作。一個類是由一些數據及作用於這些數據上的函數構成的。麵向對象程序設計方法的一大特性就是封裝性,代碼和數據聯在一起放入對象稱為封裝。它利用封裝技術把域與過程、函數結合在一起,構成了嶄新的數據類型——對象。

一、類的說明

類可以看作是一種用戶自定義的數據類型。在C語言中,結構是典型的用戶自定義數據類型,它是相關聯的數據項的集合。而在C++中,類是相關聯的數據項以及對這些數據項操作的集合。

說明如下:

1.類名是一個有效的標識符。它與其它的用戶自定義數據類型名稱的命名方式相同。

2.訪問說明符用來指定類成員的訪問權限,即能否被其它的程序單元所調用。它隻能是下麵的三個關鍵字之一。private:在它後麵聲明的標識符是私有的標識符,即這些標識符隻能在該類的實現代碼中被調用。

public:在它後麵聲明的標識符是公有的標識符,即這些標識符可以被任何的程序單元所調用。

protect:是“保護”的意思。這個訪問說明符隻有在涉及繼承性時才用得到,這將在以後介紹。

訪問說明符用來說明類中所聲明的數據結構或操作,這些數據及操作被稱為類的成員。其中,與數據結構有關的成員被稱為數據成員。與操作有關的成員被稱為成員函數。為了實現類中的操作,除了實現代碼之外,還需要選擇一個數據結構。private;都分一般用於聲明數據結構,當然在這部分也可以聲明成員函數。這裏聲明的成員函數被稱為私有成員函數,它們隻能被類中聲明的成員函數所調用,用於支持類中其它的成員函數(主要是公有成員函數)的實現。雖然也可以在public部分聲明數據結構,但這樣做是不可取的。

另外,對於未用訪問說明符指定訪問權限的類成員來說,它們的訪問權限為私有。

3.類的任何成員都不能用關鍵字extern、auto或rigister修飾。

4.在類的說明中,不能對其數據成員使用表達式進行初始化。如下麵的類定義形式是錯誤的。

5.類的數據成員可以是任何的數據類型。當然它也可以是一個類類塱。

6.習慣上,類的名字和各私有成員的名字一般都以大寫字母開始。

下麵我們通過一個例子來討論類。假設一個矩形對象在一個圖形軟件中可能有的操作如下:

Move():把矩形移動到某一位置。

Size():改變矩形的大小。

Where():查詢矩形的位置。

Area():查詢矩形的麵積。

Draw():在特定的設備上畫出該矩形。

在普通的C語言中,可以通過一個結構和五個單獨的函數才能實現上麵的工作。而采用C++程序設計方法完全可以把這些工作都放到一起去實現。你可以定義下麵的類:

對上麵的類說明如下:

1.關鍵字class表明要說明的數據類型為一個類。

2.Rect是類名,它應該是一個合法的標識符。

3.X,Y,W,H是該類的數據成員。因為對它們的聲明出現在關鍵字private之後,所以稱它們為私有數據成員。

4.Move()、Size()、Where()、Area()、Draw()是類的成員函數。由於對它們的聲明是在關鍵字public之後,所以稱它們為公有的成員函數。

注意:在類的聲明中,關鍵字private和public出現的順序和次數是不受限製的,所以也可以把類Rect說明為:

編譯器將從上往下閱讀類的說明,每當遇到private或public關鍵字時,就會按照關鍵字所規定的訪問權限改變其後麵成員的訪問權限。因此,定義類的各成員的訪問權限和上例的完全一樣。由於類的公有成員提供了它與外部的接口所以,一般都將公有成員的聲明放在前麵,而將私有成員的聲明放在後這樣便於首先了解類的外部接口。

二、類的實現

類的實現是指定義類中的操作,即給出類的成員函數的定義。成員函數的一般形式為:

返回類型類名成員函數名。

其中,位於類名和成員函數名之間的符號(::)是作用域分辨符,用於表明其後的成員函數名是在“類名”這個類中說明的。“數體”為操作的具體實現代碼。

其中,lihe()函數是一個假想的函數,用米根據兩點的坐標畫一條頁線s在上麵的函數定義中,應該注意到有兩個函數:Rect::Area()和Rect::Draw()沒有參數。而它們是應該對某些特定數據進行操作的,那麼,它們究竟是對誰的數據進行操作呢?這就是下麵要解決的問題。

三、類的便用(對象)

一旦定義了某個類後,就可以像C語言中的其它用戶自定義類型一樣使用該類型來說明變量,具有類類型的變量被稱為對象。

其中,Rect為前麵定義的類。myRect是具有類Rect類型的變量。所以myRect就是一個對象。運行時,程序為每個對象分配內存,對象myRect的內存分配:

程序為對象myRect分配的內存空間由數據空間和代碼空間兩大部分組成。其中,數據空間用來存放對象的數據成員myRect.X、myRect.Y、myRect.W和myRect.H。代碼空間用來存放對象的成員函數myRect.Move()、myRect.Size()、myRect.Where()、myRect.A-rea()和myRect.Draw()的代碼。

可以通過使用類中聲明的公有成員函數來操作該類的對象。調用類中聲明的操作(函數)的語法形式為:標識函數名(參數表);

其中,是一個操作符,被稱為成員選擇操作符,用來訪問對象的成員。而整個式子是一個運算表達式。它的類型是類中“函數名”所指定函數的返回類型,它的值是該操作調用返回的值。例如:

表達式:myRect.Move(10,20)的類型為void;表達式:myRect.Area()的類型為int,值為200。

在這裏,我們有必要解釋類型檢查與束定的概念。類型檢查是根據一個對象所具有的數據類型來檢查程序中對對象所進行的操作是否合法。例如,對於表達式:myRect.Move(10,20);

編譯器將檢查類的聲明,看是否在類中聲明了操作Move()。本例中的類Rect聲明了名為Move()的操作,並且該操作有兩個int類型的參數。所以,上述對對象myRect所進行的操作是合法的。