[C++]類和物件(一)

丫就是熊個貓貓發表於2016-12-09

類和物件

按鈕物件:

按鈕的內容、大小,按鈕的字型、圖案等等

針對按鈕的各種操作,建立、單擊、雙擊、拖動等

班級物件:

班級的靜態特徵,所屬的系和專業、班級的人數,所在的教室等。這種靜態特徵稱為屬性;

班級的動態特徵,如學習、開會、體育比賽等,這種動態特徵稱為行為。

任何一個物件都應當具有這兩個要素,一是屬性(attribute);二是行為(behavior),即能根據外界給的資訊進行相應的操作。物件是由一組屬性和一組行為構成的。

物件導向的程式設計採用了以上人們所熟悉的這種思路。使用物件導向的程式設計方法設計一個複雜的軟體系統時,首要的問題是確定該系統是由哪些物件組成的,並且設計這些物件。在C++中,每個物件都是由資料和函式(即操作程式碼)這兩部分組成的。

我們可以對一個物件進行封裝處理,把它的一部分屬性和功能對外界遮蔽,也就是說從外界是看不到的、甚至是不可知的。

使用物件的人完全可以不必知道物件內部的具體細節,只需瞭解其外部功能即可自如地操作物件。

把物件的內部實現和外部行為分隔開來。

傳統的程式導向程式設計是圍繞功能進行的,用一個函式實現一個功能。所有的資料都是公用的,一個函式可以使用任何一組資料,而一組資料又能被多個函式所使用。程式設計者必須考慮每一個細節,什麼時候對什麼資料進行操作 。

物件導向程式設計採取的是另外一種思路。它面對的是一個個物件。實際上,每一組資料都是有特定的用途的,是某種操作的物件。也就是說,一組操作呼叫一組資料。

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

因此人們設想把相關的資料和操作放在一起,形成一個整體,與外界相對分隔。這就是物件導向的程式設計中的物件。

在程式導向的結構化程式設計中,人們常使用這樣的公式來表述程式∶

程式=演算法+資料結構

物件導向的程式組成:

物件 = 演算法 + 資料結構

程式=(物件+物件+物件+……)+ 訊息

訊息的作用就是對物件的控制。

程式設計的關鍵是設計好每一個物件以及確定向這些物件發出的命令,使各物件完成相應的操作。

每一個實體都是物件。有一些物件是具有相同的結構和特性的。

每個物件都屬於一個特定的型別。

在C++中物件的型別稱為類(class)。類代表了某一批物件的共性和特徵。類是物件的抽象,而物件是類的具體例項(instance)。

 

類的定義

類是一種複雜的資料型別,它是將不同型別的資料和與這些資料相關的運算封裝在一起的 集合體。

類將一些資料及與資料相關的函式封裝在一起,使類中的資料得到很好的“保護”。在大型程式中不會被隨意修改。

 

class  Student

{ private :

     char Name[20];

     float Math;

     float Chiese;

  public :

     float  average;

     void SetName(char *name);

     void  SetMath(float math);

     void  SetChinese(float ch);

     float GetAverage(void);

};

·用關鍵字priviate限定的成員稱為私有成員,對私有成員限定在該類的內部使用,即只允許該類中的成員函式使用私有的成員資料,對於私有的成員函式,只能被該類內的成員函式呼叫;類就相當於私有成員的作用域。

·用關鍵字public限定的成員稱為公有成員,公有成員的資料或函式不受類的限制,可以在類內或類外自由使用;對類而言是透明的。

·用關鍵字protected所限定的成員稱為保護成員,只允許在類內及該類的派生類中使用保護的資料或函式。即保護成員的作用域是該類及該類的派生類。

 

每一個限制詞(private等)在類體中可使用多次。一旦使用了限制詞,該限制詞一直有效,直到下一個限制詞開始為止。

如果未加說明,類中成員預設的訪問許可權是private,即私有的。

class  Student

{char Name[20];

float Math;

float Chiese;   均為私有許可權

     public :

float  average;

          void SetName(char *name);

void  SetMath(float math);

void  SetChinese(float ch);

    float GetAverage(void);   均為公有許可權

 

};

成員函式與成員資料的定義不分先後,可以先說明函式原型,再在類體外定義函式體。

class  A

{       float  x, y;

  public:

      void Setxy(float a,float  b)    在類體內定義成員函式

     {  x=a;   y=b;   }

      void  Print(void)

     {   cout<<x<<‘\t’<<y<<endl;  }

};

class  A

{       float  x, y;

  public:

      void Setxy(float a,float  b);在類體內說明成員函式原型

      void  Print(void);

};

void A::Setxy(float a,float  b)   在類體外定義成員函式

     {  x=a;   y=b;   }

void  A::Print(void)

     {   cout<<x<<‘\t’<<y<<endl;  }

 

在類體外定義成員函式的格式:

<type>   < class_name > :: < func_name > (<參數列>)

{

......  //函式體

}

 

在定義一個類時,要注意如下幾點:

1、類具有封裝性,並且類只是定義了一種結構(樣板),所以類中的任何成員資料均不能使用關鍵字extern,auto或register限定其儲存型別。

2、在定義類時,只是定義了一種匯出的資料型別,並不為類分配儲存空間,所以,在定義類中的資料成員時,不能對其初始化。如:

class  Test {  int  x=5,y=6;   //是不允許的

  extern  float  x; //是不允許的  

}

在C++語言中,結構體型別只是類的一個特例。結構體型別與類的唯一的區別在於:在類中,其成員的預設的存取許可權是私有的;而在結構體型別中,其成員的預設的存取許可權是公有的。

 

內聯成員函式

當我們定義一個類時,可以在類中直接定義函式體。這時成員函式在編譯時是作為行內函數來實現的。

同時,我們也可以在類體外定義類的內聯成員函式,在類體內說明函式,在類體外定義時,在成員函式的定義前面加上關鍵字inline。

物件

在定義類時,只是定義了一種資料型別,即說明程式中可能會出現該型別的資料,並不為類分配儲存空間。

只有在定義了屬於類的變數後,系統才會為類的變數分配空間。

類的變數我們稱之為物件。

物件是類的例項,定義物件之前,一定要先說明該物件的類。

不同物件佔據記憶體中的不同區域,它們所儲存的資料各不相同,但對成員資料進行操作的成員函式的程式程式碼均是一樣的。

 

在建立物件時,只為物件分配用於儲存資料成員的記憶體空間,而成員函式的程式碼為該類的每一個物件所共享。

物件的定義方法同結構體定義變數的方法一樣,也分三種,當類中有資料成員的訪問許可權為私有時,不允許對物件進行初始化。

 

物件的使用

一個物件的成員就是該物件的類所定義的成員,有成員資料和成員函式,引用時同結構體變數類似,用“.”運算子。

用成員選擇運算子“.”只能訪問物件的公有成員,而不能訪問物件的私有成員或保護成員。若要訪問物件的私有的資料成員,只能通過物件的公有成員函式來獲取。

同型別的物件之間可以整體賦值,這種賦值與物件的成員的訪問許可權無關。

物件可以作函式的入口引數(實參、形參),也可以作函式的出口引數。這與一般變數作為函式的引數是完全相同的。

可以定義類型別的指標,類型別的引用,物件陣列,指向類型別的指標陣列和指向一維或多維陣列的指標變數

一個類的物件,可作為另一個類的成員

類作用域、類型別的作用域和物件的作用域

類體的區域稱為類作用域。類的成員函式與成員資料,其作用域都是屬於類的作用域,僅在該類的範圍內有效,故不能在主函式中直接通過函式名和成員名來呼叫函式。

 

類型別的作用域:在函式定義之外定義的類,其類名的作用域為檔案作用域;而在函式體內定義的類,其類名的作用域為塊作用域 。

物件的作用域與前面介紹的變數作用域完全相同 , 全域性物件、區域性物件、區域性靜態物件等。

類的巢狀

在定義一個類時, 在其類體中又包含了一個類的完整定義,稱為類的巢狀 。

類是允許巢狀定義的 。

 

 

相關文章