類和對象

類和對象

學術術語
類是所有面向對象的語言的共同特征,所有面向對象的語言都提供了這種類型。類是現實世界或思維世界中的實體在計算機中的反映,它将數據以及這些數據上的操作封裝在一起。對象是具有類類型的變量。類是對象的抽象,而對象是類的具體實例。類是抽象的,不占用内存,而對象是具體的,占用存儲空間。類是用于創建對象的藍圖,它是一個定義包括在特定類型的對象中的方法和變量的軟件模闆。C++中的類實際上就是由一組描述對象屬性或狀态的數據項和作用在這些數據項上的操作構成的封裝體。類的定義由關鍵字class打頭,關鍵字後跟類名,類名之後的括号内是類體,最後以“;”結束。
    中文名:類和對象 外文名:class 定義: 載體:計算機 舉例:方法和變量的軟件模闆 分類:科技

基本作用

類是C++中十分重要的概念,它是實現面向對象程序設計的基礎。類是所有面向對象的語言的共同特征,所有面向對象的語言都提供了這種類型。一個有一定規模的C++程序是由許多類所構成的。

C++支持面向過程的程序設計,也支持基于對象的程序設計,又支持面向對象的程序設計。以後我們将介紹基于對象的程序設計。包括類和對象的概念、類的機制和聲明、類對象的定義與使用等。這是面向對象的程序設計的基礎。基于對象就是基于類。與面向過程的程序不同,基于對象的程序是以類和對象為基礎的,程序的操作是圍繞對象進行的。

在此基礎上利用了繼承機制和多态性,就成為面向對象的程序設計(有時不細分基于對象程序設計和面向對象程序設計,而把二者合稱為面向對象的程序設計)。

基于對象程序設計所面對的是一個個對象。所有的數據分别屬于不同的對象。在面向過程的結構化程序設計中,人們常使用這樣的公式來表述程序:

程序=算法+數據結構

算法和數據結構兩者是互相獨立、分開設計的,面向過程的程序設計是以算法為主體的。在實踐中人們逐漸認識到算法和數據結構是互相緊密聯系不可分的,應當以一個算法對應一組數據結構,而不宜提倡一個算法對應多組數據結構,以及一組數據結構對應多個算法。基于對象和面向對象程序設計就是把一個算法和一組數據結構封裝在一個對象中。因此,就形成了新的觀念:

對象=算法+數據結構

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

或:

程序=對象s+消息

“對象s”表示多個對象。消息的作用就是對對象的控制。程序設計的關鍵是設計好每一個對象,及确定向這些對象發出的命令,使各對象完成相應操作。

類的聲明和對象的定義

1.類和對象的定義

類是現實世界或思維世界中的實體在計算機中的反映,它将數據以及這些數據上的操作封裝在一起。

對象是具有類類型的變量

2.類和對象的關系

類是對象的抽象,而對象是類的具體實例。類是抽象的,不占用内存,而對象是具體的,占用存儲空間。類是用于創建對象的藍圖,它是一個定義包括在特定類型的對象中的方法和變量的軟件模闆。

3.類類型的聲明形式

class類名

{

public:

公用的數據和成員函數

和成員函數

protected:

保護的數據和成員函數

private:

私有的數據

}

4.定義對象的方法

1.先聲明類類型,然後再定義對象

舉例:Student stud1,stud2; //Student是已經聲明的類類型

2.在聲明類類型的同時定義對象

class Student

//聲明類類型

{public :

//先聲明公用部分

void display( )

{cout<<″num:″<

cout<<″name:″<

cout<<″sex:″<

private :

//後聲明私有部分

int num;

char name;

char sex;

}stud1,stud2;//定義了兩個Student類的對象

在定義Student類的同時,定義了兩個Student類的對象。

3.不出現類名,直接定義對象

class //無類名

{private : //聲明以下部分為私有的

public : //聲明以下部分為公用的

}stud1,stud2;//定義了兩個無類名的類對象

直接定義對象,在C++中是合法的、允許的,但卻很少用,也不提倡用。在實際的程序開發中,一般都采用上面3種方法中的第1種方法。在小型程序中或所聲明的類隻用于本程序時,也可以用第2種方法。在定義一個對象時,編譯系統會為這個對象分配存儲空間,以存放對象中的成員。

5.類和結構體類型的異同

C++增加了class類型後,仍保留了結構體類型(struct),而且把它的功能也擴展了。C++允許用struct來定義一個類型。如可以将前面用關鍵字class聲明的類類型改為用關鍵字struct。

為了使結構體類型也具有封裝的特征,C++不是簡單地繼承C的結構體,而是使它也具有類的特點,以便于用于面向對象程序設計。

用struct聲明的結構體類型實際上也就是類。用struct聲明的類,如果對其成員不作private或public的聲明,系統将其默認為public。

如果想分别指定私有成員和公用成員,則應用private或public作顯式聲明。

而用class定義的類,如果不作private或public聲明,系統将其成員默認為private,在需要時也可以自己用顯式聲明改變。

如果希望成員是公用的,使用struct比較方便,如果希望部分成員是私有的,宜用class。建議盡量使用class來建立類,寫出完全體現C++風格的程序。

其他相關

類和結構體

C++增加了class類型後,仍保留了結構體類型(struct),而且把它的功能也擴展了。C++允許用struct來定義一個類型。如可以将前面用關鍵字class聲明的類類型改為用關鍵字struct。

為了使結構體類型也具有封裝的特征,C++不是簡單地繼承C的結構體,而是使它也具有類的特點,以便于用于面向對象程序設計。

用struct聲明的結構體類型實際上也就是類。用struct聲明的類,如果對其成員不作private或public的聲明,系統将其默認為public。

如果想分别指定私有成員和公用成員,則應用private或public作顯式聲明。

而用class定義的類,如果不作private或public聲明,系統将其成員默認為private,在需要時也可以自己用顯式聲明改變。

如果希望成員是公用的,使用struct比較方便,如果希望部分成員是私有的,宜用class。建議盡量使用class來建立類,寫出完全體現C++風格的程序。

成員函數

類的成員函數(簡稱類函數)是函數的一種,它的用法和作用和第4章介紹過的函數基本上是一樣的,它也有返回值和函數類型,

它與一般函數的區别隻是:

它是屬于一個類的成員,出現在類體中。

它可以被指定為private(私有的)、public (公用的)或protected(受保護的)。

在使用類函數時,要注意調用它的權限(它能否被調用)以及它的作用域(函數能使用什麼範圍中的數據和函數)。

例如私有的成員函數隻能被本類中的其它成員函數所調用,而不能被類外調用。

成員函數可以訪問本類中任何成員(包括私有的和公用的),可以引用在本作用域中有效的數據。

一般的做法是将需要被外界調用的成員函數指定為public,它們是類的對外接口。

但應注意,并非要求把所有成員函數都指定為public。有的函數并不是準備為外界調用的,而是為本類中的成員函數所調用的,就應該将它們指定為private。

這種函數的作用是支持其它函數的操作,是類中其它成員的工具函數(utility function),類外用戶不能調用這些私有的工具函數。

類的成員函數是類體中十分重要的部分。如果一個類中不包含成員函數,就等同于C語言中的結構體了,體現不出類在面向對象程序設計中的作用。

成員引用

例如在程序中可以寫出以下語句:

stud1.num=1001;//假設num已定義為公用的整型數據成員

表示将整數1001賦給對象stud1中的數據成員num。

其中“.”是成員運算符,用來對成員進行限定,指明所訪問的是哪一個對象中的成員。

注意不能隻寫成員名而忽略對象名。

訪問對象中成員的一般形式為

對象名.成員名

不僅可以在類外引用對象的公用數據成員,而且還可以調用對象的公用成員函數,但同樣必須指出對象名,如

stud1.display( );//正确,調用對象stud1的公用成員函數

display( );//錯誤,沒有指明是哪一個對象的display函數

由于沒有指明對象名,編譯時把display作為普通函數處理。

應該注意所訪問的成員是公用的(public )還是私有的(private )。隻能訪問public成員,而不能訪問private成員,如果已定義num為私有數據成員,下面的語句是錯誤的:

stud1.num=10101;//num是私有數據成員,不能被外界引用

在類外隻能調用公用的成員函數。在一個類中應當至少有一個公用的成員函數,作為對外的接口,否則就無法對對象進行任何操作。

通過指向對象的指針訪問對象中的成員

class Time

{

public : //數據成員是公用的

int hour;

int minute;

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

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

cout<

hour;//輸出p指向的對象中的成員hour

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

通過對象的引用變量來訪問對象中的成員

如果為一個對象定義了一個引用變量,它們是共占同一段存儲單元的,實際上它們是同一個對象,隻是用不同的名字表示而已。

因此完全可以通過引用變量來訪問對象中的成員。

如果已聲明了Time類,并有以下定義語句:

Time t1; //定義對象t1

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

cout<

由于t2與t1共占同一段存儲單元(即t2是t1的别名),因此t2.hour就是t1.hour。

應用舉例

例一

最簡單的例子。

#include

using namespace std;

class Time //定義Time類

{public : //數據成員為公用的

int hour;

int minute;

int sec;};

int main( )

{

Time t1;//定義t1為Time類對象

cin>>t1.hour;//輸入設定的時間

cin>>t1.minute;

cin>>t1.sec;

//輸出時間:

cout<

return 0;

}

運行情況如下: 1232 43

12:32:43

注意:

(1) 在引用數據成員hour,minute,sec時不要忘記在前面指定對象名。

(2) 不要錯寫為類名,

如寫成

Time.hour,Time.minute,Time.sec是不對的。因為類是一種抽象的數據類型,并不是一個實體,也不占存儲空間,而對象是實際存在的實體,是占存儲空間的,其數據成員是有值的,可以被引用的。

(3) 如果删去主函數的3個輸入語句,即不向這些數據成員賦值,則它們的值是不可預知的。

Time t1;//定義對象t1

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

cout<

例2

引用多個對象的成員。

(1) 程序(a)

#include

using namespace std;

class Time

{public :

int hour;

int minute;

int sec;

};

int main( )

{Time t1;//定義對象t1

cin>>t1.hour;//向t1的數據成員輸入數據

cin>>t1.minute;

cin>>t1.sec;

cout<

Time t2;//定義對象t2

cin>>t2.hour;//向t2的數據成員輸入數據

cin>>t2.minute;

cin>>t2.sec;

cout<

return 0;

}

運行情況如下:

1032 43↙

10:32:43

22 32 43↙

22:32:43

程序是清晰易懂的,但是在主函數中對不同的對象一一寫出有關操作,會使程序冗長。為了

解決這個問題,可以使用函數來進行輸入和輸出。見程序(b)。

(2) 程序(b)

#include

using namespace std;

class Time

{public :

int hour;

int minute;

int sec;

};

int main( )

{

void set_time(Time&);//函數聲明

void show_time(Time&);//函數聲明

Time t1;//定義t1為Time類對象

set_time(t1);//調用set_time函數,向t1對象中的數據成員輸入數據

show_time(t1);//調用show_time函數,輸出t1對象中的數據

Time t2;//定義t2為Time類對象

set_time(t2);//調用set_time函數,向t2對象中的數據成員輸入數據

show_time(t2);//調用show_time函數,輸出t2對象中的數據

return 0;

}

void set_time(Time& t) //定義函數set_time,形參t是引用變量

{

cin>>t.hour;//輸入設定的時間

cin>>t.minute;

cin>>t.sec;

}

void show_time(Time& t) //定義函數show_time,形參t是引用變量

{

cout<

}

運行情況與程序(a)相同。

(3) 程序(c)

可以對上面的程序作一些修改,數據成員的值不再由鍵盤輸入,而在調用函數時由實參給出,并在函數中使用默認參數。将程序(b)第8行以下部分改為

int main( )

{

void set_time(Time&,int hour=0,int

minute=0,int sec=0);//函數聲明

void show_time(Time&);//函數聲明

Time t1;

set_time(t1,12,23,34);//通過實參傳遞時、分、秒的值

show_time(t1);

Time t2;

set_time(t2);//使用默認的時、分、秒的值

show_time(t2);

return 0;

}

void set_time(Time& t,int hour,int minute,int sec)

{

t.hour=hour;

t.minute=minute;

t.sec=sec;

}

void show_time(Time& t)

{

cout<

}

程序運行時的輸出為

12:23:34 (t1中的時、分、秒)

0:0:0 (t2中的時、分、秒)

以上兩個程序中定義的類都隻有數據成員,沒有成員函數,這顯然沒有體現出使用類的優越性。在下面的例子中,類體中就包含了成員函數。

例3

将例2的程序改用含成員函數的類來處理。

#include

using namespace std;

class Time

{public :

void set_time( );//公用成員函數

void show_time( );//公用成員函數

private : //數據成員為私有

int hour;

int minute;

int sec;

};

int main( )

{

Time t1;//定義對象t1

t1.set_time( );//調用對象t1的成員函數set_time,向t1的數據成員輸入數據

t1.show_time( );//調用對象t1的成員函數show_time,輸出t1的數據成員的值

Time t2;//定義對象t2

t2.set_time( );//調用對象t2的成員函數set_time,向t2的數據成員輸入數據

t2.show_time( );//調用對象t2的成員函數show_time,輸出t2的數據成員的值

return 0;

}

void Time∷set_time( ) //在類外定義set_time函數

{

cin>>hour;

cin>>minute;

cin>>sec;

}

void Time∷show_time( ) //在類外定義show_time函數

{

cout<< hour<<″:″<< minute<<″:″<< sec<< endl;

}

運行情況與例2中的程序(a)相同。

注意:

(1) 在主函數中調用兩個成員函數時,應指明對象名(t1,t2)。表示調用的是哪一個對象的成員函數。

(2) 在類外定義函數時,應指明函數的作用域(如void Time∷set_time( ))。在成員函數引用本對象的數據成員時,隻需直接寫數據成員名,這時C++系統會把它默認為本對象的數據成員。也可以顯式地寫出類名并使用域運算符。

(3) 應注意區分什麼場合用域運算符“∷”,什麼場合用成員運算符“.”,不要搞混。

例4

找出一個整型數組中的元素的最大值。這個問題可以不用類的方法來解決,現在用類來處理,讀者可以比較不同方法的特點。

#include

using namespace std;

class Array_max //聲明類

{public : //以下3行為成員函數原型聲明

void set_value( ); //對數組元素設置值

void max_value( ); //找出數組中的最大元素

void show_value( ); //輸出最大值

private :

int array; //整型數組

int max; //max用來存放最大值

};

void Array_max∷set_value( ) //成員函數定義,向數組元素輸入數值

{ int i;

for (i=0;i<10;i++)

cin>> array[i];

}

void Array_max∷max_value( ) //成員函數定義,找數組元素中的最大值

{int i;

max=array;

for (i=1;i<10;i++)

if(array[i]> max) max=array[i];

}

void Array_max∷show_value( ) //成員函數定義,輸出最大值

{cout<< ″max=″<< max;}

int main( )

{Array_max arrmax; //定義對象arrmax

arrmax.set_value( ); //調用arrmax的set_value函數,向數組元素輸入數值

arrmax.max_value( ); //調用arrmax的max_value函數,找出數組元素中的最大值

arrmax.show_value( ); //調用arrmax的show_value函數,輸出數組元素中的最大值

return 0;

}

運行結果如下:

12 12 39 -34 17 134 045 -91 76↙ (輸入10個元素的值)

max=134 (輸入10個元素中的最大值)

請注意成員函數定義與調用成員函數的關系,定義成員函數隻是設計了一組操作代碼,并未實際執行,隻有在被調用時才真正地執行這一組操作。

可以看出:主函數很簡單,語句很少,隻是調用有關對象的成員函數,去完成相應的操作。

在大多數情況下,主函數中甚至不出現控制結構(判斷結構和循環結構),而在成員函數中使用控制結構。

在面向對象的程序設計中,最關鍵的工作是類的設計。所有的數據和對數據的操作都體現在類中。

隻要把類定義好,編寫程序的工作就顯得很簡單了。

相關詞條

相關搜索

其它詞條