C面向對象程序設計第二章_第1頁
C面向對象程序設計第二章_第2頁
C面向對象程序設計第二章_第3頁
C面向對象程序設計第二章_第4頁
C面向對象程序設計第二章_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C++程序設計第二章2011.4第2章類和對象2.1面向對象程序設計方法概述2.2類的聲明和對象的定義2.3類的成員函數2.4對象成員的引用(調用)2.5類和對象的簡單應用2.6類的封閉性和信息隱蔽2.1.1什么是面向對象的程序設計2.1.2面向對象程序設計的特點2.1.3類和對象作用2.1.4面向對象的軟件開發(fā)2.1面向對象程序設計方法概述2.1.1什么是面向對象的程序設計

設計的思路:

把一個復雜的事物分解成若干個簡單部分(對象),并使這些簡單部分協同工作。

舉例(生產汽車):發(fā)動機

底盤

車身

車輪按一定順序組裝1.對象什么是對象?客觀世界中任何一個事物都可以看成一個對象。對象有何特征?對象是構成系統(tǒng)的基本單位;

任何一個對象都具有靜態(tài)和動態(tài)的特征;靜態(tài)特征稱為屬性,動態(tài)特征稱為行為;在C++中,每個對象由數據和函數組成。舉例

對象:

三角形

屬性:

三條邊長、三個角度

行為(方法):

計算三角形面積、輸出計算結果2.封裝與信息隱蔽什么是封裝:

把不必讓外界知道的部分隱蔽起來。即把對象的內部實現和外部行為分隔開來。封裝性的兩個含義:①把有關的數據和操作代碼封裝在一個對象中,形成程序中的一個基本單位,各個對象之間相互獨立,互不干擾。②把對象中的某些部分對外隱蔽,只留下與外界聯系的接口接收外界的消息,這種對外界隱蔽的做法稱為信息屏蔽。C++對象中的公有函數就是對象的對外接口。3.抽象

對象的抽象是類,而類的具體實例是對象。

在已有A類的基礎上,增加一些屬性和行為建立一個B類,B類稱為對A類的繼承機制。在C++中多態(tài)性指:由繼承而產生的新類,它的對象對同一個消息會作出不同的響應。4.繼承與重用5.多態(tài)性2.1.2面向對象程序設計的特點圖2.3面向過程的程序設計模型

傳統(tǒng)的面向過程程序設計是圍繞功能進行的面向對象的程序設計思路面向對象程序設計包括兩個方面:①設計所需的各種類,即決定把哪些數據和操作封裝在一起。②考慮怎樣向對象發(fā)送消息(調用對象的成員函數),實現所需的操作。舉例:求圖中陰影部分面積2.1.4面向對象的軟件開發(fā)1.分析2.設計3.編程4.測試5.維護確定類及各類的屬性和方法設計各類及整體程序(對象調用)用計算機語言把設計結果寫成程序在編譯環(huán)境調試程序,發(fā)現、修改問題,如VC++6.0根據應用更新程序2.2類的聲明和對象的定義

在設計程序時:

首先要聲明類類型,

然后再定義類類型變量即對象。2.2.1類和對象的關系2.2.2聲明類類型2.2.3定義對象的方法2.2.4類和結構體類型的異同2.2.1類和對象的關系

關系的幾點說明:C++中對象的類型稱為類(class)類代表了某一批對象的共性和特征類是對象的抽象,而對象是類的具體實例類是抽象的,不占用內存空間。對象是具體的,要占用內存空間2.2.2聲明類類型 這是什么?structstudent//student結構體 {intnum; charname[20]; charsex; }; studentst1,st2; 聲明一個類類型與聲明一個結構體類型相似。2.2.2聲明類類型classstudent//student類{intnum; stringname; charsex; voidsetdata() { cin>>num; cin>>name; cin>>sex; } voiddisplay() { cout<<num<<endl; cout<<name<<endl; cout<<sex<<endl; };}無Public該類無法調用Public:

可以看到聲明類的方法是由聲明結構體類型的方法發(fā)展而來。用上面的方法聲明的類類型表示其中的各個成員對外面隱蔽,外界不能調用里面的函數。在程序中無法執(zhí)行對象st1、st2中的setdata、display函數,因為缺少對外的接口這樣的類是無用的。所以不能把類中的所有成員與外界隔離,一般是把數據隱蔽,而把成員函數作為對外的接口。讓外界發(fā)出命令,通知對象st1執(zhí)行display函數,輸出該對象的數據。類定義格式:

class類名

{ private:

私有成員聲明

public:

公有成員聲明

protected:

保護成員聲明

};class是保留字,聲明類類型類名:按標識符取名。private、public、protected也是保留字,是成員訪問限定符,其后必須跟冒號。在類聲明的}后如不直接定義對象就必須跟分號。

private:只能被本類中的成員函數訪問,類外(除友元外)不能訪問。public:公有成員可以被本類的成員函數訪問,也能在類的作用域范圍內的其他函數訪問。protected:受保護成員可由本類的成員函數訪問,也能由派生類的成員函數訪問。 在定義類時,這三類成員不分前后順序,也可以重復出現。一般推薦最多出現一次。類定義格式(續(xù)):2.2.3定義對象的方法

1.先聲明類類型,然后再定義對象 在聲明類后,像定義變量一樣定義對象。 (1)class類名對象名表 例:classstudentst1,st2;

(2)類名對象名表 例:studentst1,st2;在實際程序開發(fā)中一般采用第1種方法,其中(2)更簡捷2.在聲明類類型的同時定義對象 class類名

{ private: … public: … }對象名表;

在小型程序中或聲明的類只用于本程序時,也可采用第2種方法。 Classstudent {intnum; stringname; charsex; public:voidsetdata() { cin>>num; cin>>name; cin>>sex; } voiddisplay() { cout<<num<<endl; cout<<name<<endl; cout<<sex<<endl; }st1,st2;2.3 類的成員函數

在聲明類時,必須定義了訪問類數據成員的函數,稱之類的成員函數。2.3.1成員函數的性質2.3.2在類外定義成員函數2.3.3內置函數2.3.4成員函數的存儲方式2.3.1成員函數的性質函數中的一種;成員函數可以訪問本類中的所有成員;public型的成員函數可以在類外被調用;private或protected型的成員函數的調用受特殊條件限制。

2.3.2在類外定義成員函數 C++允許在類內聲明成員函數的原型,然后在類外定義成員函數。 格式 類型類名::函數名(形參表)

{

成員函數體

}

classstudent {

intnum; stringname; charsex; public:voidsetdata(); voiddisplay(); };voidstudent::setdata() { cin>>num; cin>>name; cin>>sex; } voidstudent::display() {cout<<num<<endl; cout<<name<<endl; cout<<sex<<endl; } studentst1,st2;

在類外定義成員函數時,必須在函數中增加類名,用于限定它屬于哪個類,::是作用域限定符或稱作用域運算符。上面的例子中如果函數不用成員訪問限定符,函數就成了全局作用域中的display函數而不是成員函數。 如果在::前不帶類名,或函數名前既無類名又無作用域運算符::,表示該函數是全局函數。2.3.3inline成員函數在類內定義的成員函數:

默認是inline函數;在類外定義成員函數時:默認不把它當作inline成員函數,此時必須在聲明函數時在函數前加inline關鍵字。 在上面的例子中在函數聲明里,函數頭未加inline,C++將把它當作非inline函數。注:類外定義一般不用inline方式

如果要把它作為inline函數,只需在函數聲明時,在函數頭增加關鍵字inline。

classstudent {intnum; stringname; charsex; public:

inlinevoidsetdata();

inlinevoiddisplay(); };2.3.3inline成員函數(續(xù))

2.4對象成員的引用

定義了對象后,可以直接訪問對象中的公有類型的數據成員或成員函數。 在程序中訪問對象成員有三種方法。2.4.1用對象名和成員運算符訪問成員2.4.2用指向對象的指針訪問成員2.4.3用對象的引用訪問成員2.4.1通過對象名和成員運算符訪問格式:對象名.成員名例:st1.display();//調用成員函數display();//調用普通函數注意:只有成員函數可以訪問類中的所有成員,而在類外只能訪問公有成員。如果在類外面用下面的語句是錯誤的:st1.num=101012.4.2通過指向對象的指針訪問成員可以通過指針訪問對象中的成員。classTime{public:inthour;intminute;};Timet,*p;t.hour=10;t.minute=20;p=&t;cout<<p->hour<<endl;cout<<*p.hour<<endl;

p->hour表示p當前指向對象t中的成員hour,此時(*p).hour也代表對象t中的成員hour,在這個例子中,p->hour、(*p).hour、t.hour三種表示是一個意思。2.4.2通過指向對象的指針訪問成員(續(xù))

2.4.3通過對象的引用來訪問對成員

分析:

Timet1; Time&t2=t1;//對象t2是對象t1的引用 cout<<t2.hour;

這里t2是t1的別名,所以訪問t2.hour就是訪問t1.hour。2.5類和對象的簡單應用舉例

這小節(jié)通過幾個例子說明怎樣用類設計程序,以及使用類的長處。書上例2.1,2.2的設計方法不可??!例2.3類成員的調用 #include<iostream> usingnamespacestd; classTime {private:

inthour; intminute; intsec;public: voidset_time(); voidshow_time(); };intmain(){Timet1;

t1.set_time();

t1.show_time();Timet2;t2.set_time();t2.show_time();return0;}例2.3類成員的調用(續(xù))

voidTime::set_time(){ cin>>hour; cin>>minute; cin>>sec; }

voidTime::show_time() { cout<<hour<<":"<<minute<<":"<<sec<<endl; }例2.3類成員的調用(續(xù))例2.4在整型數組中找最大值#include<iostream>usingnamespacestd;classArray_max//聲明類{public:voidset_value();voidmax_value();voidshow_value();

private:intarray[10];intmax;};

voidArray_max::set_value()//定義類的成員函數 {inti; for(i=0;i<10;i++) cin>>array[i]; }

voidArray_max::max_value()//定義類的成員函數 {inti; max=array[0]; for(i=1;i<10;i++) if(array[i]>max)max=array[i]; }

voidArray_max::show_value()//定義類的成員函數 {cout<<"max="<<max; }例2.4在整型數組中找最大值(續(xù))

intmain(){Array_maxarrmax;arrmax.set_value();//調用成員函數arrmax.max_value();//調用成員函數arrmax.show_value();//調用成員函數return0;}例2.4在整型數組中找最大值(續(xù))2.6類的封裝性和信息隱蔽

這一小節(jié)討論關于類的封裝性和信息隱蔽。2.6.1實現公用接口與私有的分離2.6.2類聲明和成員函數定義分離2.6.3面向對象程序設計中的幾個名詞2.6.1公用接口與私有實現的分離類的目的就是實現封裝性:把數據和關于操作數據的算法封裝在類類型中。私有與公有的劃分:數據成員指定為私有,使它們與外界隔離;允許外界調用的成員函數指定為公有,公有成員函數是用戶使用類的公用接口。公有成員函數的實現細節(jié)對用戶是隱蔽,稱為私有實現。這種類的公有接口與私有實現的分離形成了信息隱蔽。

信息隱蔽的長處:(1)修改程序方便。如果想修改或擴充類的功能,只需修改類中有關的數據成員和成員函數,類外的部分不用修改。例如,在2.2.3節(jié)聲明的student類中增加數據成員年齡,可以這樣修改:

classstudent {intnum; stringname;

intage;//新增加的數據成員

charsex; public:voidsetdata() voiddisplay() }; voidstudent::setdata() { cin>>num>>name; cin>>age>>sex; } voidstudent::display() {cout<<num<<endl<<name<<endl; cout<<age<<endl<<sex<<endl; } studentst1,st2;類以外的部分無需修改!

信息隱蔽的長處:(2)調試程序方便。

如果在編譯時發(fā)現類中的數據讀寫有錯,不必檢查整個程序,只需檢查本類中訪問這些數據的成員函數。 這就使得程序(尤其是大程序)的設計、修改和調試變得方便和簡單了。2.6.2類聲明和成員函數定義的分離一般在面向對象程序開發(fā)時:將類的聲明(包括成員函數的聲明)放在指定的頭文件(*.h)中;把類成員函數的定義放在源文件(*.cpp)中;在應用程序中只要把有關的頭文件包含進來即可。

//student.h這是頭文件在此聲明類classstudent {intnum; stringname; charsex; public: voidsetdata(); voiddisplay(); };//student.cpp

這是源文件在此定義類的成員函數#include<iostream>

#include"student.h"usingnamespacestd;voidstudent::setdata(){ cin>>num; cin>>name; cin>>sex;}voidstudent

::display(){ cout<<num<<endl; cout<<name<<endl; cout<<sex<<endl;}//main.cpp

這是應用程序,在此調用成員函數#include<iostream>#include"student.h"usingnamespacest

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論