天天看點

C++基本概念----類和對象

1、相關概念

       面向對象程式設計方法的一個重要特點就是“封裝性” (encapsulation),所謂“封裝”,指兩方面的含義: 一是将有關的資料和操作代碼封裝在一個對象中,形成一個基本機關,各個對象之間相對獨立,互不幹擾。二是将對象中某些部分對外隐蔽,即隐蔽其内部細節,隻留下少量接口,以便與外界聯系,接收外界的消息,這種對外界隐蔽的做法稱為資訊隐蔽(imformation hiding)。

程式設計者的任務包括兩個方面: 一是設計所需的各種類和對象,即決定把哪些資料和操作封裝在一起;二是考慮怎樣向有關對象發送消息,以完成所需的任務。

對象 = 算法 + 資料結構

程式 = (對象+對象+對象+…) + 消息

類代表了某一批對象的共性和特征,類是對象的抽象,而對象是類的具體執行個體(instance)。類是抽象的,不占用記憶體,而對象是具體的,占用存儲空間。

2、類的定義

如果在類的定義中既不指定private,也不指定public,則系統就預設為是私有的。歸納以上對類類型的聲明,可得到其一般形式如下: 

class 類名

{ private:

私有的資料和成員函數;

 public:

公用的資料和成員函數;

};

private和public稱為成員通路限定符(member access specifier)。protected聲明的成員稱為受保護的成員,它不能被類外通路(這點與私有成員類似),但可以被派生類的成員函數通路。

在聲明類類型時,聲明為private的成員和聲明為public的成員的次序任意。在一個類體中,關鍵字private和public可以分别出現多次。每個部分的有效範圍到出現另一個通路限定符或類體結束時(最後一個右花括号)為止。

用struct聲明的類,如果對其成員不作private或public的聲明,系統将其預設為public。而用class定義的類,如果不作private或public聲明,系統将其成員預設為private。

成員函數在類外定義時,必須在函數名前面加上類名,予以限定(qualifed),“∷”是作用域限定符(field qualifier)或稱作用域運算符,用它聲明函數是屬于哪個類的。

void Student∷display( )    

如果在作用域運算符“∷”的前面沒有類名,或者函數名前面既無類名又無作用域運算符“∷”,如 

∷display( ) 或  display( )

則表示display函數不屬于任何類,這個函數不是成員函數,而是全局函數,即非成員函數的一般普通函數。類函數必須先在類體中作原型聲明,然後在類外定義。

在類的内部對成員函數作聲明,而在類體外定義成員函數,這是程式設計的一種良好習慣。如果一個函數,其函數體隻有2~3行,一般可在聲明類時在類體中定義。多于3行的函數,一般在類體内聲明,在類外定義。

在類體中定義的成員函數中不包括循環等控制結構,代碼較短,C++系統會自動将它們作為内置(inline)函數來處理。在類外定義的成員函數則需要顯式申明,滿足條件下一定條件下,編譯系統将其視作内置函數。

inline void Student∷display( ) 

3、存儲方式

一個對象所占的空間大小隻取決于該對象中資料成員所占的空間,而與成員函數無關。函數代碼是存儲在對象空間之外的。如果對同一個類定義了10個對象,這些對象的成員函數對應的是同一個函數代碼段,而不是10個不同的函數代碼段。C++用一個名為this的指針,用來指向不同的對象,來調用不對對象的相同函數段。不論成員函數在類内定義還是在類外定義,成員函數的代碼段都用同一種方式存儲。

C++基本概念----類和對象

4、對象成員的通路

    通路對象中的成員可以有3種方法: 

1)通過對象名和成員運算符通路對象中的成員;

通路對象中成員的一般形式為

對象名.成員名

隻能通路public成員,而不能通路private成員

2)通過指向對象的指針通路對象中的成員;

Time t,*p;                //定義對象t和指針變量p

p=&t;                     //使p指向對象t

cout<<p->hour;            //輸出p指向的對象中的成員hour

在p指向t的前提下,p->hour,(*p).hour和t.hour三者等價。

3)通過對象的引用變量通路對象中的成員。

Time t1;                //定義對象t1

Time &t2=t1;            //定義Time類引用變量t2,并使之初始化為t1

cout<<t2.hour;          //輸出對象t1中的成員hour

在類外雖然不能直接通路私有資料成員,但可以通過調用公用成員函數來引用甚至修改私有資料成員。

通過成員函數對資料成員進行操作稱為類的實作。類中被操作的資料是私有的,實作的細節對使用者是隐蔽的,這種實作稱為私有實作(private implementation)。這種“類的公用接口與私有實作的分離”形成了資訊隐蔽。

在實際工作中,将若幹個常用的功能相近的類聲明集中在一起,形成類庫。一種是C++編譯系統提供的标準類庫;一種是使用者根據自己的需要做成的使用者類庫,提供給自己和自己授權的人使用,這稱為自定義類庫。類庫包括兩個組成部分: (1)類聲明頭檔案; (2)已經過編譯的成員函數的定義,它是目标檔案。使用者隻需把類庫裝入到自己的計算機系統中(一般裝到C++編譯系統所在的子目錄下),并在程式中用#include指令行将有關的類聲明的頭檔案包含到程式中,就可以使用這些類和其中的成員函數,順利地運作程式。類聲明和函數定義一般是分别放在兩個文本中的。類的成員函數在面向對象程式理論中被稱為“方法”(method)。

繼續閱讀