【例8.1】最簡單的例子。
#include <iostream> 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<<t1.hour<<":"<<t1.minute<<":"<<t1.sec<<endl; return 0; }
運行情況如下:
1232 43↙
12:32:43
幾點注意:
1) 在引用數據成員hour,minute,sec時不要忘記在前面指定對象名。
2) 不要錯寫為類名,如寫成
Time.hour,Time.minute,Time.sec
是不對的。因為類是一種抽象的數據類型,並不是一個實體,也不占存儲空間,而對象是實際存在的實體,是占存儲空間的,其數據成員是有值的,可以被引用的。
3) 如果刪去主函數的3個輸入語句,即不向這些數據成員賦值,則它們的值是不可預知的。
【例8.2】引用多個對象的成員。
1) 程序(a)
#include <iostream> 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<<t1.hour<<":"<<t1.minute<<":"<<t1.sec<<endl;//輸出t1中數據成員的值 Time t2;//定義對象t2 cin>>t2.hour;//向t2的數據成員輸入數據 cin>>t2.minute; cin>>t2.sec; cout<<t2.hour<<":"<<t2.minute<<":"<<t2.sec<<endl;//輸出t2中數據成員的值 return 0; }
運行情況如下:
1032 43↙
10:32:43
22 32 43↙
22:32:43
程序是清晰易懂的,但是在主函數中對不同的對象一一寫出有關操作,會使程序冗長。為了解決這個問題,可以使用函數來進行輸入和輸出。見程序(b)。
2) 程序(b)
#include <iostream> 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<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;//輸出對象中的數據 }
運行情況與程序(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<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl; }
程序運行時的輸出為:
12:23:34 (t1中的時、分、秒)
0:0:0 (t2中的時、分、秒)
以上兩個程序中定義的類都只有數據成員,沒有成員函數,這顯然沒有體現出使用類的優越性。在下面的例子中,類體中就包含了成員函數。
【例8.3】將例8.2的程序改用含成員函數的類來處理。
#include <iostream> 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; }
運行情況與例8.2中的程序(a)相同。
幾點注意:
在主函數中調用兩個成員函數時,應指明對象名(t1,t2)。表示調用的是哪一個對象的成員函數。
在類外定義函數時,應指明函數的作用域(如void Time∷set_time( ))。在成員函數引用本對象的數據成員時,只需直接寫數據成員名,這時C++系統會把它默認為本對象的數據成員。也可以顯式地寫出類名並使用域運算符。
應注意區分什么場合用域運算符“∷”,什么場合用成員運算符“.”,不要搞混。
【例8.4】找出一個整型數組中的元素的最大值。這個問題可以不用類的方法來解決,現在用類來處理,讀者可以比較不同方法的特點。
#include <iostream> using namespace std; class Array_max //聲明類 { public : //以下3行為成員函數原型聲明 void set_value( ); //對數組元素設置值 void max_value( ); //找出數組中的最大元素 void show_value( ); //輸出最大值 private : int array[10]; //整型數組 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[0]; 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個元素中的最大值)
請注意成員函數定義與調用成員函數的關系,定義成員函數只是設計了一組操作代碼,並未實際執行,只有在被調用時才真正地執行這一組操作。
可以看出: 主函數很簡單,語句很少,只是調用有關對象的成員函數,去完成相應的操作。在大多數情況下,主函數中甚至不出現控制結構(判斷結構和循環結構),而在成員函數中使用控制結構。在面向對象的程序設計中,最關鍵的工作是類的設計。所有的數據和對數據的操作都體現在類中。只要把類定義好,編寫程序的工作就顯得很簡單了。