c++面向對象程序設計

上傳人:仙*** 文檔編號:33436099 上傳時間:2021-10-17 格式:PPT 頁數(shù):417 大小:1.88MB
收藏 版權申訴 舉報 下載
c++面向對象程序設計_第1頁
第1頁 / 共417頁
c++面向對象程序設計_第2頁
第2頁 / 共417頁
c++面向對象程序設計_第3頁
第3頁 / 共417頁

下載文檔到電腦,查找使用更方便

15 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《c++面向對象程序設計》由會員分享,可在線閱讀,更多相關《c++面向對象程序設計(417頁珍藏版)》請在裝配圖網上搜索。

1、 面向對象的思想最初出現(xiàn)于挪威奧斯陸大學和挪面向對象的思想最初出現(xiàn)于挪威奧斯陸大學和挪威計算機中心共同研制的威計算機中心共同研制的Simula 67語言中,隨著的語言中,隨著的Smalltalk-76和和8080語言推出,面向對象的的程序設計語言推出,面向對象的的程序設計方法得到了比較完善的實現(xiàn)。方法得到了比較完善的實現(xiàn)。 此后,面向對象的概念和應用已超越了程序設計此后,面向對象的概念和應用已超越了程序設計和軟件開發(fā),擴展到如數(shù)據(jù)庫系統(tǒng),交互式界面,分和軟件開發(fā),擴展到如數(shù)據(jù)庫系統(tǒng),交互式界面,分布式系統(tǒng),網絡管理結構和人工智能等領域。布式系統(tǒng),網絡管理結構和人工智能等領域。 數(shù)據(jù)抽象數(shù)據(jù)抽象

2、 一種設計方法一種設計方法 把一組數(shù)據(jù)及作用與其上的操作組成一把一組數(shù)據(jù)及作用與其上的操作組成一個設計實體或單位。接口說明外部可見,其個設計實體或單位。接口說明外部可見,其實現(xiàn)是隱蔽的,不可見的。實現(xiàn)是隱蔽的,不可見的。發(fā)展的三個階段發(fā)展的三個階段01010101100100IntegerRealBoolean用戶用戶定義定義抽象數(shù)抽象數(shù)據(jù)類型據(jù)類型抽象數(shù)據(jù)類型抽象數(shù)據(jù)類型 抽象數(shù)據(jù)類型是指抽象數(shù)據(jù)類型是指“一個值集和作用在一個值集和作用在該值集上的操作集該值集上的操作集”。抽象數(shù)據(jù)類型的定義。抽象數(shù)據(jù)類型的定義只決定于其邏輯特性,與其具體的計算機內只決定于其邏輯特性,與其具體的計算機內部實現(xiàn)

3、無關。一個抽象數(shù)據(jù)類型可以分解為部實現(xiàn)無關。一個抽象數(shù)據(jù)類型可以分解為語法、語義、表示和算法語法、語義、表示和算法4個部分。個部分。功能抽象功能抽象模塊模塊數(shù)據(jù)抽象數(shù)據(jù)抽象模塊模塊抽象數(shù)據(jù)類型的實現(xiàn)抽象數(shù)據(jù)類型的實現(xiàn)實現(xiàn)抽象數(shù)據(jù)類型需要借助于高級程序設計實現(xiàn)抽象數(shù)據(jù)類型需要借助于高級程序設計語言;語言;在面向過程的語言中,用戶可以自己定義數(shù)在面向過程的語言中,用戶可以自己定義數(shù)據(jù)類型;據(jù)類型;在面向對象的程序設計語言中,借助于對象在面向對象的程序設計語言中,借助于對象描述抽象數(shù)據(jù)類型。描述抽象數(shù)據(jù)類型。(Class)問題求解問題求解面向對象設計方法:實現(xiàn)問題空間和問題求面向對象設計方法:實現(xiàn)問

4、題空間和問題求解空間的近似和直接模擬。解空間的近似和直接模擬。意識部分意識部分教室教室物質部分物質部分303303教室教室抽象部分抽象部分教室類教室類具體部分具體部分一個對象:教室實例一個對象:教室實例現(xiàn)實問題空間現(xiàn)實問題空間解空間解空間封裝機制封裝機制基于消息的通信基于消息的通信繼承機制繼承機制多態(tài)機制多態(tài)機制 理解面向對象的基本概念對于學習和掌握面向理解面向對象的基本概念對于學習和掌握面向對象的開發(fā)方法是十分重要的。對象的開發(fā)方法是十分重要的。 類類(ClassClass)對象對象( (Object)Object)實例實例( (Instance)Instance)( (Polymorphi

5、sm)Polymorphism)繼承繼承(InheritanceInheritance)消息消息( (Message)Message)封裝封裝(Encapsulation)(Encapsulation)把客觀世界從概念上看成是一個由相互配合而協(xié)把客觀世界從概念上看成是一個由相互配合而協(xié)作的對象所組成的系統(tǒng)作的對象所組成的系統(tǒng)面向對象面向對象=對象對象+分類分類+繼承繼承+通信通信一個實例一個實例椅子椅子對象:桌子對象:桌子價格價格尺寸尺寸重量重量位置位置顏色顏色類:家具類:家具對象:椅子對象:椅子價格價格尺寸尺寸重量重量位置位置顏色顏色買賣移動買買賣賣移動移動買買賣賣移動移動價格價格尺寸尺寸重

6、量重量位置位置顏色顏色對象對象對象對象( (Object)Object)對象是用來描述客觀存在的事物,它是構成對象是用來描述客觀存在的事物,它是構成系統(tǒng)的基本單位,是對客觀世界中事物的抽系統(tǒng)的基本單位,是對客觀世界中事物的抽象描述。象描述。 對象對象 行為(功能、方法、服務)行為(功能、方法、服務) 屬性(數(shù)據(jù))屬性(數(shù)據(jù))屬性屬性行為行為接口接口對象對象對象對象對象對象對象是由私有數(shù)據(jù)(屬性)及作用于其上的一組操作(行對象是由私有數(shù)據(jù)(屬性)及作用于其上的一組操作(行為)所構成的一個封閉整體為)所構成的一個封閉整體由于對象的數(shù)據(jù)是私有的,所以要想訪問其數(shù)據(jù)的正確方法是向該對象發(fā)送消息,讓對象

7、自身選擇其內部相應的操作以完成對該項數(shù)據(jù)的訪問對象的動作取決于外界給對象的刺激,這就是消息,消息告訴對象所要求它完成的功能。對象具有一定的智能功能,即“知道”如何選擇相應的操作來處理對象所接收的消息從設計人員的角度看,對象是一個完成特定功能的程序塊從設計人員的角度看,對象是一個完成特定功能的程序塊從用戶的角度看,對象為他們提供了所希望的行為從用戶的角度看,對象為他們提供了所希望的行為對象對象(Object)對象標識對象標識對象生命周期對象生命周期類類又稱又稱對象類對象類一組具有相一組具有相同屬性和相同操作的對象的集合。同屬性和相同操作的對象的集合。在一個類中,每個對象都是類的在一個類中,每個對

8、象都是類的實例實例(instance) ,它們都可以使用類中提供的函數(shù)。它們都可以使用類中提供的函數(shù)。類具有屬性類具有屬性,用數(shù)據(jù)結構來描述類的屬性,用數(shù)據(jù)結構來描述類的屬性,類具有操作,類具有操作,它是對象的行為的抽象,操作實現(xiàn)它是對象的行為的抽象,操作實現(xiàn)的過程稱為方法的過程稱為方法(method) ,方法有方法名,方法,方法有方法名,方法體和參數(shù)。體和參數(shù)。 幾何對象幾何對象顏色顏色位置位置移動(移動(delta:矢量):矢量)選擇(選擇(P:指針型)指針型):布爾型布爾型旋轉旋轉(角度角度)圖1 對象類的描述人人姓姓 名名:字符串字符串年年 齡齡: 整整 型型改換工作改換工作改換地址改

9、換地址文件文件文件名文件名文件大小文件大小最近更新日期最近更新日期打印打印(人人)張紅兵張紅兵28繪圖員繪圖員人民路人民路8號號(人人)李軍李軍24程序員程序員無無圖2 對象的描述類名類名屬性屬性運算運算 對象對象 類類屬于某類的具體對象就是該類的屬于某類的具體對象就是該類的。一個類的不同實例必定具有:一個類的不同實例必定具有:相同的操作(或行為)的集合相同的操作(或行為)的集合相同的信息結構或屬性定義,但可以有不同的屬性值相同的信息結構或屬性定義,但可以有不同的屬性值不同的對象標識不同的對象標識消息消息(Message)對象之間的聯(lián)系是通過傳遞消息來實現(xiàn)的。對象之間的聯(lián)系是通過傳遞消息來實現(xiàn)

10、的。消息消息就是向對象發(fā)出的服務請求(互相聯(lián)系、就是向對象發(fā)出的服務請求(互相聯(lián)系、協(xié)同工作等)。協(xié)同工作等)。是對象之間進行通訊的一種數(shù)據(jù)結構。是對象之間進行通訊的一種數(shù)據(jù)結構。消息統(tǒng)一了消息統(tǒng)一了“數(shù)據(jù)流數(shù)據(jù)流”和和“控制流控制流”。數(shù)據(jù)數(shù)據(jù)方法方法消息到達消息消息 - - 消息傳送與函數(shù)調用的區(qū)別消息傳送與函數(shù)調用的區(qū)別(1)函數(shù)調用可以帶或不帶參數(shù),但是消息至)函數(shù)調用可以帶或不帶參數(shù),但是消息至少帶一個參數(shù),它表明接收該消息的對象,消少帶一個參數(shù),它表明接收該消息的對象,消息中告訴對象做什么的部分稱為消息操作;息中告訴對象做什么的部分稱為消息操作;(2)消息操作名類似于函數(shù)名,其本質

11、區(qū)別在)消息操作名類似于函數(shù)名,其本質區(qū)別在于:函數(shù)名代表一段可執(zhí)行的代碼,但消息操于:函數(shù)名代表一段可執(zhí)行的代碼,但消息操作名具體功能的選定還取決于接收消息的對象作名具體功能的選定還取決于接收消息的對象本身本身(3)函數(shù)調用是過程式的(如何做),消息傳)函數(shù)調用是過程式的(如何做),消息傳送是說明式的(做什么),具體如何做,由對送是說明式的(做什么),具體如何做,由對象根據(jù)收到的消息自行確定。象根據(jù)收到的消息自行確定。 繼承是使用現(xiàn)存的定義作為基礎,建立新定義的繼承是使用現(xiàn)存的定義作為基礎,建立新定義的技術。技術。是父類和子類之間共享數(shù)據(jù)結構和方法的機制,是父類和子類之間共享數(shù)據(jù)結構和方法的

12、機制,這是類之間的一種關系。這是類之間的一種關系。 繼承性分:繼承性分: 單重繼承:單重繼承:一個子類只有一個父類。即一個子類只有一個父類。即子類只繼承子類只繼承一個父類的數(shù)據(jù)結構和方法。一個父類的數(shù)據(jù)結構和方法。 多重繼承:多重繼承:一個子類可有多個父類。繼承多個一個子類可有多個父類。繼承多個父類父類的數(shù)據(jù)結構和方法。的數(shù)據(jù)結構和方法?;惢愖宇愖宇怉子類子類B圖 4 繼承性描述現(xiàn)存類定義現(xiàn)存類定義父類父類( (基類基類) )新類定義新類定義子類子類( (派生類派生類) )繼繼 承承圖 3 繼承性單繼承單繼承CheckingSavingsSuperclass (parent)Subclas

13、sesInheritance RelationshipAncestorDescendentsAccount- balance- name- number+ withdraw()+ createStatement()多繼承多繼承Use multiple inheritance only when needed and always with caution!FlyingThingAnimalHorseWolfBirdHelicopterAirplaneMultiple Inheritance封裝封裝(Encapsulation) 封裝是一種信息隱蔽技術,就是把對象封裝是一種信息隱蔽技術,就是把對

14、象的屬性和行為相結合構成一個獨立的基本單的屬性和行為相結合構成一個獨立的基本單位,用戶只能見到對象封裝界面上的信息,位,用戶只能見到對象封裝界面上的信息,對象內部對用戶是隱蔽的。封裝的目的在于對象內部對用戶是隱蔽的。封裝的目的在于將對象的使用者和對象的設計者分開,使用將對象的使用者和對象的設計者分開,使用者不必知道行為實現(xiàn)的細節(jié),只需使用設計者不必知道行為實現(xiàn)的細節(jié),只需使用設計者提供的消息訪問對象者提供的消息訪問對象 封裝是把過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的封裝是把過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的訪問只能通過已定義的界面。訪問只能通過已定義的界面。PosColor 公有公有消息消息私有私有消息消息存

15、儲結構方法協(xié).議一個對象封裝的定義為:封裝的定義為:(1)一個限定所有對象內部軟件的一個清楚界面;一個限定所有對象內部軟件的一個清楚界面;(2)一個描述這個對象和其它對象之間相互作用的接口一個描述這個對象和其它對象之間相互作用的接口(3)受保護的內部實現(xiàn),這個實現(xiàn)給出了由軟件對象提受保護的內部實現(xiàn),這個實現(xiàn)給出了由軟件對象提供的功能細節(jié),實現(xiàn)細節(jié)不能在定義這個對象的類的供的功能細節(jié),實現(xiàn)細節(jié)不能在定義這個對象的類的外面訪問外面訪問矛盾嗎?矛盾嗎?No!封裝性主要指的是對象的封裝性,引入繼承機制封裝性主要指的是對象的封裝性,引入繼承機制后,對象仍然是封裝地很好的實體,其它對象后,對象仍然是封裝地

16、很好的實體,其它對象與它通信只能發(fā)送消息。與它通信只能發(fā)送消息。相似性:共享代碼!相似性:共享代碼!繼承:靜態(tài)共享代碼封裝:動態(tài)共享代碼多態(tài)多態(tài)(Polymorphism)即一個即一個名字具有多種語義。名字具有多種語義。同一對象接收到不同消息采用不同的行為方式同一對象接收到不同消息采用不同的行為方式不同對象收到相同消息時產生不同的動作不同對象收到相同消息時產生不同的動作重載(重載(overload)動態(tài)綁定動態(tài)綁定類屬類屬 例如:例如: “繪圖繪圖”操作,作用在操作,作用在“橢圓橢圓” 和和“矩矩形形” 上,畫出不同的圖形。上,畫出不同的圖形。使用虛函數(shù)可實現(xiàn)動態(tài)聯(lián)編,不同聯(lián)編可以選擇使用虛函

17、數(shù)可實現(xiàn)動態(tài)聯(lián)編,不同聯(lián)編可以選擇不同的實現(xiàn),這便是多態(tài)性。不同的實現(xiàn),這便是多態(tài)性。 繼承是動態(tài)聯(lián)編的基礎,虛函數(shù)是動態(tài)聯(lián)編的關繼承是動態(tài)聯(lián)編的基礎,虛函數(shù)是動態(tài)聯(lián)編的關鍵。鍵。(1)1)在基類中,定義成員函數(shù)為虛函數(shù)在基類中,定義成員函數(shù)為虛函數(shù)(virtual);(2)(2)定義基類的公有定義基類的公有(public)派生類;派生類;(3)(3)在基類的公有派生類中在基類的公有派生類中“重載重載”該虛函數(shù);該虛函數(shù);(4)(4)定義指向基類的指針變量,它指向基類的公定義指向基類的指針變量,它指向基類的公有派生類的對象。有派生類的對象。重載虛函數(shù)不是一般的重載函數(shù),它要求函數(shù)重載虛函數(shù)不是

18、一般的重載函數(shù),它要求函數(shù)名、返回類型、參數(shù)個數(shù)、參數(shù)類型和順序完全相同。名、返回類型、參數(shù)個數(shù)、參數(shù)類型和順序完全相同。例如:例如:下面是實現(xiàn)下面是實現(xiàn)“多態(tài)性多態(tài)性” 的一個例子的一個例子#include using namespace std;class figure /定義基類定義基類 protected: double x,y; public: void set_dim(double i; double j=0) x=i; y=j; virtual void show_area() /定義虛函數(shù)定義虛函數(shù) cout“No area computation define ”; cout

19、set_dim(10.0,5.0); p-show_area(); p=&c; / 指向圓形對象指向圓形對象 p-set_dim(9.0); p-show_area();void main() figure *p; /定義指向基類的指針變量定義指向基類的指針變量 triangle t; / square s; / 定義基類的公有派生類的對象定義基類的公有派生類的對象 circle c; / p=&t; / 指向三角形對象指向三角形對象 p-set_dim(10.0,5.0); p-show_area();figureCircleTriangleSquarearea()area()area()a

20、rea()類與對象類與對象C+語言程序設計C+語言程序設計本章主要內容本章主要內容l面向對象的思想面向對象的思想lOOP的基本特點的基本特點l類概念和聲明類概念和聲明l對象對象l構造函數(shù)構造函數(shù)l析構函數(shù)析構函數(shù)l內聯(lián)成員函數(shù)內聯(lián)成員函數(shù)l拷貝構造函數(shù)拷貝構造函數(shù)l類的組合類的組合C+語言程序設計回顧:面向過程的設計方法回顧:面向過程的設計方法l重點重點: 如何實現(xiàn)細節(jié)過程,將數(shù)據(jù)與函數(shù)分開。l形式:形式: 主模塊+若干個子模塊(main()+子函數(shù))。l特點:特點: 自頂向下,逐步求精功能分解。l缺點:缺點: 效率低,程序的可重用性差。面向對象的思想C+語言程序設計面向對象的方法面向對象的方

21、法l目的:目的: 實現(xiàn)軟件設計的產業(yè)化。l觀點觀點:解決問題屬于自然界的。解決問題屬于自然界的。 自然界是由實體(對象)所組成。l程序設計方法:程序設計方法: 使用面向對象的觀點來描述模仿并處理現(xiàn)實問題。l要求:要求: 高度概括、分類、和抽象。面向對象的思想C+語言程序設計(1)抽象)抽象l抽象是對具體對象(問題)進行概括,抽象是對具體對象(問題)進行概括,抽出這一類對象的公共性質并加以描述抽出這一類對象的公共性質并加以描述的過程。(如學生,教師的過程。(如學生,教師, 課程)課程) 先注意問題的本質及描述,其次是實現(xiàn)過程或細節(jié)。 數(shù)據(jù)抽象:描述某類對象的屬性或狀態(tài)(對象相互區(qū)別的物理量)。

22、行為抽象:描述某類對象的共有的行為特征或具有的功能。 抽象的實現(xiàn):通過類的聲明。OOP的基本特點C+語言程序設計抽象實例抽象實例鐘表鐘表l數(shù)據(jù)抽象:數(shù)據(jù)抽象: int Hour, int Minute, int Secondl行為抽象:行為抽象: SetTime(), ShowTime()OOP的基本特點C+語言程序設計抽象實例抽象實例鐘表類鐘表類class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second;OOP的基本特點C+語言

23、程序設計抽象實例抽象實例人人l數(shù)據(jù)抽象:數(shù)據(jù)抽象:char *name,char *sex, int age, int idl行為抽象:行為抽象:生物屬性角度:GetCloth(), Eat(), 社會屬性角度:Work(), Promote() ,注意:同一個問題可能有不同的抽象結果:根據(jù)解決問題的要求不同,產生的抽象成員可能不同OOP的基本特點C+語言程序設計(2) 封裝封裝l將抽象出的數(shù)據(jù)成員、行為成員相結將抽象出的數(shù)據(jù)成員、行為成員相結合,將它們視為一個整體,即類。合,將它們視為一個整體,即類。 目的是增強安全性和簡化編程,使用者不必了解具體的實現(xiàn)細節(jié),而只需要通過外部接口,以特定的訪

24、問權限,來使用類的成員。 實現(xiàn)封裝:類聲明中的OOP的基本特點C+語言程序設計封裝封裝l實例:實例: class Clock public: void SetTime(int NewH,int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second; ;邊界特定的訪問權限OOP的基本特點外部接口C+語言程序設計(3)繼承與派生)繼承與派生l為了重用引出了繼函的概念。為了重用引出了繼函的概念。l是是C+中支持層次分類的一種機制,允許程序員中支持層次分類的一種機制,允許程序員在保持原有類特性的基礎上,進行更具體的說明。在保

25、持原有類特性的基礎上,進行更具體的說明。l實現(xiàn):聲明派生類實現(xiàn):聲明派生類第第11章章l昆蟲的分類樹昆蟲的分類樹OOP的基本特點C+語言程序設計多態(tài)性多態(tài)性l多態(tài):同一名稱,不同的功能實現(xiàn)方式。多態(tài):同一名稱,不同的功能實現(xiàn)方式。l目的:達到行為標識統(tǒng)一,減少程序中標目的:達到行為標識統(tǒng)一,減少程序中標識符的個數(shù)。識符的個數(shù)。l實現(xiàn):重載函數(shù)和虛函數(shù)實現(xiàn):重載函數(shù)和虛函數(shù)第第12章章OOP的基本特點C+語言程序設計c+中的類中的類l類是具有相同屬性和行為的一組對象類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內部包括屬供了

26、統(tǒng)一的抽象描述,其內部包括屬性和行為兩個主要部分。性和行為兩個主要部分。l利用類可以實現(xiàn)數(shù)據(jù)的封裝、隱藏、利用類可以實現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。繼承與派生。l利用類易于編寫大型復雜程序,其模利用類易于編寫大型復雜程序,其模塊化程度比塊化程度比C中采用函數(shù)更高。中采用函數(shù)更高。類 和 對 象C+語言程序設計類與函數(shù)類與函數(shù)l函數(shù)是將邏輯上相關的函數(shù)是將邏輯上相關的語句與數(shù)據(jù)語句與數(shù)據(jù)封封裝,用于完成特定的功能。裝,用于完成特定的功能。l而類則是邏輯上相關的而類則是邏輯上相關的函數(shù)與數(shù)據(jù)函數(shù)與數(shù)據(jù)的的封裝,它是對所要處理的問題的描述。封裝,它是對所要處理的問題的描述。類 和 對 象C+語言程

27、序設計類的聲明形式類的聲明形式l 類是一種用戶自定義類型,聲明形類是一種用戶自定義類型,聲明形式:式: class 類名稱 public: 公有成員(外部接口) private: 私有成員 protected: 保護型成員 類 和 對 象C+語言程序設計公有類型成員公有類型成員l在關鍵字在關鍵字public后面聲明,它們是類后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。問公有類型數(shù)據(jù)和函數(shù)。類 和 對 象C+語言程序設計私有類型成員私有類型成員l在關鍵字在關鍵字private后面聲明,只允許后面聲明,只允許本類中的函數(shù)訪問,而類外部

28、的任何函本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。數(shù)都不能訪問。l如果緊跟在類名稱的后面聲明私有成如果緊跟在類名稱的后面聲明私有成員,則關鍵字員,則關鍵字privateprivate可以省略??梢允÷浴n?和 對 象C+語言程序設計保護類型保護類型l與與private類似,其差別表現(xiàn)在繼承與類似,其差別表現(xiàn)在繼承與派生時對派生類的影響不同,派生時對派生類的影響不同,第七章講第七章講。類 和 對 象C+語言程序設計類的成員類的成員 class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime();

29、 private: int Hour, Minute, Second; ;類 和 對 象成員數(shù)據(jù)成員函數(shù)lvoid Clock : SetTime(int NewH, int NewM, int NewS)ll Hour=NewH;l Minute=NewM;l Second=NewS;llvoid Clock : ShowTime()ll coutHour:Minute:Second;l19C+語言程序設計成員數(shù)據(jù)成員數(shù)據(jù)l與一般的變量聲明相同,但需要將它放在類的聲與一般的變量聲明相同,但需要將它放在類的聲明體中。明體中。lclass complexl private:l double re

30、al;l double imag;l public:l void init(double r,double i)real=r;imag=i;l double realcomplex()return real;l double imagcomplex()return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l l 類 和 對 象C+語言程序設計成員函數(shù)成員函數(shù)l在類中說明原形,可以在在類中說明原形,可以在類外給出函類外給出函數(shù)體實現(xiàn),并在函數(shù)名前使用類名加數(shù)體實現(xiàn),并在函數(shù)名前

31、使用類名加以限定。以限定。也可以也可以直接在類中給出函數(shù)直接在類中給出函數(shù)體,形成內聯(lián)成員函數(shù)體,形成內聯(lián)成員函數(shù)。l允許聲明重載函數(shù)和帶默認形參值的允許聲明重載函數(shù)和帶默認形參值的函數(shù)函數(shù)類 和 對 象C+語言程序設計帶缺省形參值的函數(shù)帶缺省形參值的函數(shù)lVoid clock:setTime(int NewH=0,int NewM=0,int NewS=0)l l Hour=NewH;l Minute=NewM;l Second=NewS;l C+語言程序設計內聯(lián)成員函數(shù)內聯(lián)成員函數(shù)l為了提高運行時的效率,對于較簡單為了提高運行時的效率,對于較簡單的函數(shù)可以聲明為內聯(lián)形式。的函數(shù)可以聲明為內

32、聯(lián)形式。l內聯(lián)函數(shù)體中不要有復雜結構(如循內聯(lián)函數(shù)體中不要有復雜結構(如循環(huán)語句和環(huán)語句和switch語句)。語句)。l在類中聲明內聯(lián)成員函數(shù)的方式:在類中聲明內聯(lián)成員函數(shù)的方式: 將函數(shù)體放在類的聲明中-隱式 使用inline關鍵字-顯式類 和 對 象C+語言程序設計內聯(lián)成員函數(shù)舉例內聯(lián)成員函數(shù)舉例(隱式隱式)lclass Pointll public:l void Init(int initX,int initY)l l X=initX;l Y=initY;l l int GetX() return X;l int GetY() return Y;l private:l int X,Y;l

33、;類 和 對 象C+語言程序設計內聯(lián)成員函數(shù)舉例內聯(lián)成員函數(shù)舉例(顯式顯式)lclass Pointll public:l void Init(int initX,int initY);l int GetX(); l int GetY();l private:l int X,Y;l;類 和 對 象linline void Point: Init(int initX,int initY)ll X=initX;l Y=initY;llinline int Point:GetX() ll return X;llinline int Point:GetY() ll return Y;l25C+語言程序

34、設計對象對象l類的對象是該類的某一特定實體,即類的對象是該類的某一特定實體,即類類型的變量。類類型的變量。l聲明形式:聲明形式: 類名類名 對象名;對象名;l例:例: Clock myClock;類 和 對 象C+語言程序設計類中成員的訪問方式類中成員的訪問方式l類中成員互訪類中成員互訪 直接使用成員名l類外訪問類外訪問 使用“對象名.成員名”方式訪問 public 屬性的成員類 和 對 象C+語言程序設計例例 類的應用舉例類的應用舉例l#includelusing namespace std;lclass Clockll public:l void SetTime(int NewH,int

35、NewM,int NewS);l void ShowTime();l private:l int Hour,Minute,Second;l;lvoid Clock:SetTime(int NewH,int NewM,int NewS)l Hour=NewH;l Minute=NewM;l Second=NewS;lC+語言程序設計lvoid Clock:ShowTime()ll coutHour“:”Minute“:”Second;l lvoid main(void)l Clock myClock;l myClock.SetTime(8,30,30);l myClock.ShowTime();

36、l例例 類的應用舉例類的應用舉例C+語言程序設計結構與類結構與類lStruct Savingsl unsigned accountNumber;l float balance;l;lvoid fn()l Savings a;l Savings b;l a.accountNumber=1;l b.accountNumber=2;l;結構與類的區(qū)別:類中成員的缺省存儲屬性為私有的結構體中的缺省存儲屬性為共有的C+語言程序設計構造函數(shù)構造函數(shù)l由于類的封裝性,不能像普通變量一樣初始化由于類的封裝性,不能像普通變量一樣初始化lstruct Savingslunsigned accountNumber;

37、l float balance;l;lSavings A=1,2000.0;lSavings B(2,3000.0);構造函數(shù)和析構函數(shù)C+語言程序設計構造函數(shù)構造函數(shù)l構造函數(shù)的作用是在對象被創(chuàng)建時使用構造函數(shù)的作用是在對象被創(chuàng)建時使用特定的值去構造對象,或者說將對象特定的值去構造對象,或者說將對象初初始化始化為一個特定的狀態(tài)。為一個特定的狀態(tài)。l在對象創(chuàng)建時在對象創(chuàng)建時由系統(tǒng)自動調用由系統(tǒng)自動調用。l如果程序中未聲明,則系統(tǒng)自動產生出如果程序中未聲明,則系統(tǒng)自動產生出一個一個默認形式默認形式的構造函數(shù)的構造函數(shù)l允許為允許為內聯(lián)內聯(lián)函數(shù)、函數(shù)、重載重載函數(shù)、函數(shù)、帶默認形帶默認形參值參值的

38、函數(shù)的函數(shù)構造函數(shù)和析構函數(shù)C+語言程序設計構造函數(shù)舉例構造函數(shù)舉例lclass Clockllpublic:lClock (int NewH, int NewM, int NewS);/構造構造函數(shù)函數(shù)lvoid SetTime(int NewH, int NewM, int NewS);lvoid ShowTime();lprivate:lint Hour,Minute,Second;l;構造函數(shù)和析構函數(shù)l構造函數(shù)的實現(xiàn):構造函數(shù)的實現(xiàn):lClock:Clock(int NewH, int NewM, int NewS)llHour= NewH;lMinute= NewM;lSecond

39、= NewS;ll建立對象時構造函數(shù)的作用:建立對象時構造函數(shù)的作用:lvoid main()ll Clock c (0,0,0); /隱含調用構造函數(shù),將初始值作為實隱含調用構造函數(shù),將初始值作為實參。參。l c.ShowTime();l31C+語言程序設計重載構造函數(shù):重載構造函數(shù):l/ex.hl#include lclass Demo int x,y;l public:l Demo(int a,int b)l x=a; y=b;l cout“Constructor demo(int ,int)be calledn”;l l Demo()l cout“Constructor demo()

40、be calledn”;l void show()l cout“X=”xt“Y=”yendl;l ; C+語言程序設計l#include “ex.h”lvoid main()l Demo d1(3,5); /Al d1.Show();l Demo d2; /Bl d2.Show();ll該程序的輸出為:該程序的輸出為:lConstructor Demo(int ,int) be calledlX=3 Y=5lConstructor Demo( ) be calledlX=946 Y=928 (隨機值隨機值)C+語言程序設計拷貝構造函數(shù)拷貝構造函數(shù)l拷貝構造函數(shù)是一種特殊的構造函數(shù),其形參為本類

41、的拷貝構造函數(shù)是一種特殊的構造函數(shù),其形參為本類的對象引用。對象引用。l作用:使用一個對象(參數(shù)指定的對象),去初始化一作用:使用一個對象(參數(shù)指定的對象),去初始化一個正在被建立的同類型對象。個正在被建立的同類型對象。 class 類名 public : 類名(形參);/構造函數(shù) 類名(類名 &對象名);/拷貝構造函數(shù) . ; 類名: 類名(類名 &對象名)/拷貝構造函數(shù)的實現(xiàn) 函數(shù)體 構造函數(shù)和析構函數(shù)C+語言程序設計例例 拷貝構造函數(shù)舉例拷貝構造函數(shù)舉例 class Point public: Point(int xx=0,int yy=0); Point( Point &p); int

42、 GetX() return X; int GetY() return Y; private: int X,Y; ;構造函數(shù)和析構函數(shù)lPoint:Point(int xx,int yy)ll X=xx;l Y=yy;llPoint:Point (Point& p)ll X=p.X;l Y=p.Y;l cout拷貝構造函數(shù)被調用拷貝構造函數(shù)被調用endl;llPoint b(1,1);lPoint a(b);34C+語言程序設計拷貝構造函數(shù)被調用的時機拷貝構造函數(shù)被調用的時機l(1)當用類的一個對象去初始化該類的)當用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調用拷貝構造函另一個對象時系統(tǒng)

43、自動調用拷貝構造函數(shù)實現(xiàn)拷貝賦值。數(shù)實現(xiàn)拷貝賦值。 void main(void) Point A(1,2); Point B(A); /拷貝構造函數(shù)被調用拷貝構造函數(shù)被調用 coutB.GetX()endl; 構造函數(shù)和析構函數(shù)C+語言程序設計l(2)若函數(shù)的形參為類對象,調用函)若函數(shù)的形參為類對象,調用函數(shù)時,實參賦值給形參,系統(tǒng)自動調數(shù)時,實參賦值給形參,系統(tǒng)自動調用拷貝構造函數(shù)。例如:用拷貝構造函數(shù)。例如: void fun1(Point p) coutp.GetX()endl; void main() Point A(1,2); fun1(A); /調用拷貝構造函數(shù)調用拷貝構造函數(shù)

44、 構造函數(shù)和析構函數(shù)拷貝構造函數(shù)被調用的時機拷貝構造函數(shù)被調用的時機C+語言程序設計l(3)當函數(shù)的返回值是類對象時,系)當函數(shù)的返回值是類對象時,系統(tǒng)自動調用拷貝構造函數(shù)。例如:統(tǒng)自動調用拷貝構造函數(shù)。例如: Point fun2() Point A(1,2); return A; /調用拷貝構造函調用拷貝構造函數(shù)數(shù) void main() Point B; B=fun2(); 構造函數(shù)和析構函數(shù)拷貝構造函數(shù)被調用的時機拷貝構造函數(shù)被調用的時機C+語言程序設計拷貝構造函數(shù)拷貝構造函數(shù)l如果程序員沒有為類聲明拷貝初始化構造函數(shù),則編譯器自如果程序員沒有為類聲明拷貝初始化構造函數(shù),則編譯器自己生

45、成一個拷貝構造函數(shù)。己生成一個拷貝構造函數(shù)。l這個構造函數(shù)執(zhí)行的功能是:用作為初始值的對象的每個數(shù)這個構造函數(shù)執(zhí)行的功能是:用作為初始值的對象的每個數(shù)據(jù)成員的值,初始化將要建立的對象的對應數(shù)據(jù)成員。據(jù)成員的值,初始化將要建立的對象的對應數(shù)據(jù)成員。lPoint(Point &p) Point A(1,2);lX=p.x; Point B(A);l Y=p.y; B.X=A.Xl 如果沒有定義這個函數(shù)如果沒有定義這個函數(shù) B.Y=A.Y構造函數(shù)和析構函數(shù)C+語言程序設計析構函數(shù)析構函數(shù)l完成對象被刪除前的一些清理工作。完成對象被刪除前的一些清理工作。l在對象的生存期結束的時刻系統(tǒng)自動調在對象的生存

46、期結束的時刻系統(tǒng)自動調用它,然后再釋放此對象所屬的空間。用它,然后再釋放此對象所屬的空間。l如果程序中未聲明析構函數(shù),編譯器將如果程序中未聲明析構函數(shù),編譯器將自動產生一個默認的析構函數(shù)。自動產生一個默認的析構函數(shù)。構造函數(shù)和析構函數(shù)C+語言程序設計構造函數(shù)和析構函數(shù)舉例構造函數(shù)和析構函數(shù)舉例l#includelusing namespace std;lclass Pointl l public:l Point(int xx,int yy);l Point();l /.其它函數(shù)原形其它函數(shù)原形l private:l int X,int Y;l;構造函數(shù)和析構函數(shù)lPoint:Point(int

47、 xx,int yy)l X=xx; Y=yy;llPoint:Point()lll/.其它函數(shù)的實現(xiàn)略其它函數(shù)的實現(xiàn)略41C+語言程序設計l#include lclass Qll int x,y;l public:l Q(int a=0,int b=0)l cout“調用了構造函數(shù)!調用了構造函數(shù)!”endl;l x=a; y=b;l void P(void)l coutxtyn;l Q()l cout“調用了析構函數(shù)!調用了析構函數(shù)!”n;lvoid main(void)ll Q q(50,100);l q.P();l cout“退出主函數(shù)!退出主函數(shù)!n”;ll輸出:調用了構造函數(shù)!輸出

48、:調用了構造函數(shù)!l 50 100l 退出主函數(shù)!退出主函數(shù)! l 調用了析構函數(shù)!調用了析構函數(shù)!l C+語言程序設計類的應用舉例類的應用舉例l一圓型游泳池如圖所示,現(xiàn)在需在其一圓型游泳池如圖所示,現(xiàn)在需在其周圍建一圓型過道,并在其四周圍上柵欄。周圍建一圓型過道,并在其四周圍上柵欄。柵欄價格為柵欄價格為35元元/米,過道造價為米,過道造價為20元元/平平方米。過道寬度為方米。過道寬度為3米,游泳池半徑由鍵盤米,游泳池半徑由鍵盤輸入。要求編程計算并輸出過道和柵欄的輸入。要求編程計算并輸出過道和柵欄的造價。造價。游泳池過道l#include lusing namespace std;lconst

49、 float PI = 3.14159;lconst float FencePrice = 35;lconst float ConcretePrice = 20;l/聲明類聲明類Circle 及其數(shù)據(jù)和方法及其數(shù)據(jù)和方法lclass Circlell private:l float radius;l l public:l Circle(float r); /構造函數(shù)構造函數(shù)l l float Circumference(); /圓周長圓周長l float Area(); /圓面積圓面積l;43l/ 類的實現(xiàn)類的實現(xiàn)l/ 構造函數(shù)初始化數(shù)據(jù)成員構造函數(shù)初始化數(shù)據(jù)成員radiuslCircle:C

50、ircle(float r)lradius=rl/ 計算圓的周長計算圓的周長lfloat Circle:Circumference()ll return 2 * PI * radius;ll l/ 計算圓的面積計算圓的面積 lfloat Circle:Area() ll return PI * radius * radius;l44lvoid main ()ll float radius;l float FenceCost, ConcreteCost; l l / 提示用戶輸入半徑提示用戶輸入半徑l coutradius;l / 聲明聲明 Circle 對象對象l Circle Pool(ra

51、dius);/自動調用構造自動調用構造函數(shù)函數(shù)l Circle PoolRim(radius + 3); 45l/ 計算柵欄造價并輸出計算柵欄造價并輸出l FenceCost = PoolRim.Circumference() * FencePrice;l cout Fencing Cost is ¥ FenceCost endl;l l / 計算過道造價并輸出計算過道造價并輸出l ConcreteCost = (PoolRim.Area() - Pool.Area()*ConcretePrice;l cout Concrete Cost is ¥ ConcreteCost endl;ll運行

52、結果運行結果lEnter the radius of the pool: 10lFencing Cost is ¥2858.85lConcrete Cost is ¥4335.3946C+語言程序設計例:復數(shù)例:復數(shù)(類與對象、內聯(lián)成員函數(shù))(類與對象、內聯(lián)成員函數(shù))l#include l#include lClass complexlPrivate:l double real;l double imag;lPublic:l void init(double r,double i)l real=r;imag=I;l double realcomplex() return real;l doub

53、le imagcomplex() return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l;lvoid main()ll complex a;l a.init(1.1,2.2);l cout“real of complex a=”a.realcomplex()endl;l cout“image of complex a=”a.imagecomplex()endl;l cout“abs of complex a=”a.abscomplex()endl;lC+語言程序設計例:復數(shù)

54、例:復數(shù) (構造函數(shù))(構造函數(shù))l#include l#include lClass complexlPrivate:l double real;l double imag;lPublic:l complex(double r,double i)l real=r;imag=I;l double realcomplex() return real;l double imagcomplex() return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l;lvoid main()l

55、l complex a(1.1,2.2);l cout“real of complex a=”a.realcomplex()endl;l cout“image of complex a=”a.imagecomplex()endl;l cout“abs of complex a=”a.abscomplex()endl;lC+語言程序設計例:復數(shù)例:復數(shù) (帶缺省參數(shù)構造函數(shù))(帶缺省參數(shù)構造函數(shù))l#include l#include lClass complexlPrivate:l double real;l double imag;lPublic:l complex(double r=0.0

56、,double i=0.0)l real=r;imag=I;l double realcomplex() return real;l double imagcomplex() return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l;lvoid main()ll complex a(1.1,2.2);l complex b;l complex c(1.0);l cout“real of complex a=”a.realcomplex()endl;l cout“image o

57、f complex a=”a.imagecomplex()endl;l cout“abs of complex a=”a.abscomplex()endl;lC+語言程序設計例:復數(shù)例:復數(shù) (構造函數(shù)重載)(構造函數(shù)重載)l#include l#include lClass complexlPrivate:l double real;l double imag;lPublic:l complex(double r,double i)l real=r;imag=I;l complex() real=0.0; imag=0.0;l double realcomplex() return real

58、;l double imagcomplex() return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l;lvoid main()ll complex a(1.1,2.2);l cout“real of complex a=”a.realcomplex()endl;l cout“image of complex a=”a.imagecomplex()endl;l cout“abs of complex a=”a.abscomplex()endl;l complex b;l c

59、out“real of complex a=”b.realcomplex()endl;l cout“image of complex a=”b.imagecomplex()endl;l cout“abs of complex a=”b.abscomplex()endl;ll參數(shù)能不能給一個值參數(shù)能不能給一個值l 如:如:complex c(1.1);行嗎?行嗎?C+語言程序設計例:復數(shù)例:復數(shù) (析構函數(shù))(析構函數(shù))l#include l#include lClass complexlPrivate:l double real;l double imag;lPublic:l complex(

60、double r=0.0,double i=0.0)l real=r;imag=I;l complex() cout“destructing.n”;l double realcomplex() return real;l double imagcomplex() return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l;lvoid main()ll complex a(1.1,2.2);l cout“real of complex a=”a.realcomplex()endl

61、;l cout“image of complex a=”a.imagecomplex()endl;l cout“abs of complex a=”a.abscomplex()endl;l complex b;l cout“real of complex a=”b.realcomplex()endl;l cout“image of complex a=”b.imagecomplex()endl;l cout“abs of complex a=”b.abscomplex()endl;lC+語言程序設計例:復數(shù)例:復數(shù) (拷貝構造函數(shù)(拷貝構造函數(shù)應用應用A)l#include l#include

62、 lClass complexlPrivate:l double real;l double imag;lPublic:l complex(double r=0.0,double i=0.0)l real=r;imag=I;l complex(complex &c)l real=c.real; imag=c.imag;l complex() cout“destructing.n”;l double realcomplex() return real;l double imagcomplex() return imag;l double abscomplex()l double t;l t=re

63、al*real+imag*imag;l return sqrt(t);l l;lvoid main()ll complex a(1.1,2.2);l cout“real of complex a=”a.realcomplex()endl;l cout“image of complex a=”a.imagecomplex()endl;l cout“abs of complex a=”a.abscomplex()endl;l complex b(a);l cout“real of complex a=”b.realcomplex()endl;l cout“image of complex a=”b

64、.imagecomplex()endl;l cout“abs of complex a=”b.abscomplex()endl;lC+語言程序設計例:復數(shù)例:復數(shù) (拷貝構造函數(shù)(拷貝構造函數(shù)應用應用B)l#include l#include lClass complexlPrivate:l double real;l double imag;lPublic:l complex(double r=0.0,double i=0.0)l real=r;imag=I;l complex(complex &c)l real=c.real; imag=c.imag;l complex() cout“de

65、structing.n”;l double realcomplex() return real;l double imagcomplex() return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l;lvoid display(complex p)ll cout“real of complex p=”p.realcomplex()endl;l cout“image of complex p=”p.imagecomplex()endl;l cout“abs of complex

66、 p=”p.abscomplex()endl;llvoid main()ll complex a(1.1,2.2);l display(a);l lC+語言程序設計例:復數(shù)例:復數(shù) (拷貝構造函數(shù)(拷貝構造函數(shù)應用應用C)l#include l#include lClass complexlPrivate:l double real;l double imag;lPublic:l complex(double r=0.0,double i=0.0)l real=r;imag=I;l complex(complex &c)l real=c.real; imag=c.imag;l complex() cout“destructing.n”;l double realcomplex() return real;l double imagcomplex() return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l;lcomplex fun()ll complex a(1.1,

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

相關資源

更多
正為您匹配相似的精品文檔
關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網版權所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對上載內容本身不做任何修改或編輯。若文檔所含內容侵犯了您的版權或隱私,請立即通知裝配圖網,我們立即給予刪除!