《C++程序設計(第二版課件第6章 類與對象.ppt》由會員分享,可在線閱讀,更多相關《C++程序設計(第二版課件第6章 類與對象.ppt(58頁珍藏版)》請在匯文網(wǎng)上搜索。
1、 第第6章章 類與對象類與對象6.1 面向對象程序設計的基本概念面向對象程序設計的基本概念6.2 類與對象的定義類與對象的定義6.3 對象的初始化對象的初始化6.4 對象數(shù)組與對象指針對象數(shù)組與對象指針6.5 友元友元6.6 類成員的共享與保護類成員的共享與保護6.7 程序實例程序實例6.1 從面向過程到面向對象從面向過程到面向對象6.1.1 面向對象程序設計的基本概念面向對象程序設計的基本概念1對象對象對象(對象(Object)是面向對象程序設計的核心,是程)是面向對象程序設計的核心,是程序的主要組成部分,一個程序就是一組對象的總和。序的主要組成部分,一個程序就是一組對象的總和。對象是由數(shù)據(jù)
2、及對數(shù)據(jù)進行處理的方法和行為組成對象是由數(shù)據(jù)及對數(shù)據(jù)進行處理的方法和行為組成的。換言之,對象是具有某種特殊屬性(數(shù)據(jù))和的。換言之,對象是具有某種特殊屬性(數(shù)據(jù))和行為方式(方法)的實體。行為方式(方法)的實體。每個對象都有其自身的屬性和行為。對同一類對象每個對象都有其自身的屬性和行為。對同一類對象而言其對象的行為是相同的。但每個對象的屬性而言其對象的行為是相同的。但每個對象的屬性(即狀態(tài))卻是相對獨立的。(即狀態(tài))卻是相對獨立的。2類類類是同一類型對象(具有相似行為的對象)的集合和類是同一類型對象(具有相似行為的對象)的集合和抽象,是面向對象語言必須提供的由用戶定義的數(shù)據(jù)抽象,是面向對象語言
3、必須提供的由用戶定義的數(shù)據(jù)類型,它將具有相同狀態(tài)、行為和訪問機制的多個對類型,它將具有相同狀態(tài)、行為和訪問機制的多個對象抽象成一個類。定義類之后,屬于這種類的一個對象抽象成一個類。定義類之后,屬于這種類的一個對象稱為類實例或類對象。類代表一般,而類的一個對象稱為類實例或類對象。類代表一般,而類的一個對象代表具體,描述了屬于該類型的所有對象的性質。象代表具體,描述了屬于該類型的所有對象的性質。3消息和方法消息和方法所謂消息(所謂消息(Message)就是用來請求對象執(zhí)行某一)就是用來請求對象執(zhí)行某一處理或回答某些信息的要求,消息統(tǒng)一了數(shù)據(jù)和控處理或回答某些信息的要求,消息統(tǒng)一了數(shù)據(jù)和控制流。程序
4、的執(zhí)行是靠對象間消息的傳遞來完成的。制流。程序的執(zhí)行是靠對象間消息的傳遞來完成的。方法(方法(Method)是類的行為屬性的總稱,是允許作)是類的行為屬性的總稱,是允許作用于該類對象上的各種操作。一個類可以有多個方用于該類對象上的各種操作。一個類可以有多個方法,表示該類所具有的功能和操作,通過對象調用法,表示該類所具有的功能和操作,通過對象調用類中的方法就可以改變對象域中變量的值。類中的方法就可以改變對象域中變量的值。4面向對象的基本特征面向對象的基本特征(1)封裝性。封裝性()封裝性。封裝性(Encapsulation)是指把對象)是指把對象屬性和操作結合在一起,構成獨立的單元,它的內部屬性
5、和操作結合在一起,構成獨立的單元,它的內部信息對外界是隱蔽的,不允許外界直接存取對象的屬信息對外界是隱蔽的,不允許外界直接存取對象的屬性,只能通過有限的接口與對象發(fā)生聯(lián)系。性,只能通過有限的接口與對象發(fā)生聯(lián)系。(2)繼承性。類的繼承性()繼承性。類的繼承性(Inheritance)指的是從已)指的是從已有的一個類可以構造新的類,使得新類具有原類的所有的一個類可以構造新的類,使得新類具有原類的所有特性,并且新類還可以增加一些新的特性。有特性,并且新類還可以增加一些新的特性。繼承反映的是類與類之間抽象級別的不同,使得程序繼承反映的是類與類之間抽象級別的不同,使得程序設計人員可以在已有的類的基礎上定
6、義和實現(xiàn)新類,設計人員可以在已有的類的基礎上定義和實現(xiàn)新類,所以有效地支持了軟件組件的復用,使得當需要在系所以有效地支持了軟件組件的復用,使得當需要在系統(tǒng)中增加新特征時所需的新代碼最少。統(tǒng)中增加新特征時所需的新代碼最少。(3)多態(tài)性。對象根據(jù)接收的消息而做出動作,同)多態(tài)性。對象根據(jù)接收的消息而做出動作,同樣的消息被不同的對象接收時可導致完全不同的行動,樣的消息被不同的對象接收時可導致完全不同的行動,這種現(xiàn)象稱為多態(tài)性(這種現(xiàn)象稱為多態(tài)性(Polymorphisn)。多態(tài)性機制)。多態(tài)性機制不僅增加了面向對象軟件系統(tǒng)的靈活性,進一步減少不僅增加了面向對象軟件系統(tǒng)的靈活性,進一步減少了信息冗余,
7、而且顯著地提高了軟件的可重用性和可了信息冗余,而且顯著地提高了軟件的可重用性和可擴充性。擴充性。6.2.1 C+面向對象程序的結構面向對象程序的結構一個面向對象的一個面向對象的C+程序一般由類的聲明和類的使用程序一般由類的聲明和類的使用兩部分組成。類的使用部分一般由主函數(shù)和有關子函兩部分組成。類的使用部分一般由主函數(shù)和有關子函數(shù)組成。數(shù)組成。6.2 類與對象的定義類與對象的定義以下是一個典型的以下是一個典型的C+程序結構。程序結構。#include using namespace std;/類的定義部分類的定義部分class C int x,y,z;/類類C的數(shù)據(jù)成員聲明的數(shù)據(jù)成員聲明f();
8、/類類C的成員函數(shù)聲明的成員函數(shù)聲明;/類的使用部分類的使用部分void main()C a;/建立一個類建立一個類C的對象的對象aa.f();/給對象給對象a發(fā)消息,調用成員函數(shù)發(fā)消息,調用成員函數(shù)f()在在C+程序中,程序設計始終圍繞程序中,程序設計始終圍繞“類類”展開。通過展開。通過聲明類,構建了程序所要完成的功能,體現(xiàn)了面向對聲明類,構建了程序所要完成的功能,體現(xiàn)了面向對象程序設計的思想。下面看一個具體的例子,直觀地象程序設計的思想。下面看一個具體的例子,直觀地了解一下面向對象程序設計方法與結構化程序設計方了解一下面向對象程序設計方法與結構化程序設計方法的區(qū)別。法的區(qū)別?!纠?.1】
9、類的應用示例。類的應用示例。6.2.2 類的定義類的定義在在C+中,一個類指定一個獨立的對象集合,該對象中,一個類指定一個獨立的對象集合,該對象集合由組成該類的對象以及這些對象所允許的操作組集合由組成該類的對象以及這些對象所允許的操作組成。成。1類的定義形式類的定義形式類定義的一般形式如下:類定義的一般形式如下:class 類名類名 public:數(shù)據(jù)成員或成員函數(shù)的定義數(shù)據(jù)成員或成員函數(shù)的定義private:數(shù)據(jù)成員或成員函數(shù)的定義數(shù)據(jù)成員或成員函數(shù)的定義protected:數(shù)據(jù)成員或成員函數(shù)的定義數(shù)據(jù)成員或成員函數(shù)的定義;2類成員函數(shù)的定義類成員函數(shù)的定義對類的成員函數(shù)的定義通常有兩種形式
10、,一種是在類對類的成員函數(shù)的定義通常有兩種形式,一種是在類的定義中直接定義函數(shù),一種是在類外定義。前面的的定義中直接定義函數(shù),一種是在類外定義。前面的例例6.1就是在類內部實現(xiàn)成員函數(shù),下面再看一個例就是在類內部實現(xiàn)成員函數(shù),下面再看一個例子。子。【例例6.2】求求 ,其中,其中 。按照類的定義形式,可以在類定義中只給出成員函數(shù)按照類的定義形式,可以在類定義中只給出成員函數(shù)的原型,而在類外部定義具體的成員函數(shù)。這種成員的原型,而在類外部定義具體的成員函數(shù)。這種成員函數(shù)在類外定義的一般形式如下:函數(shù)在類外定義的一般形式如下:函數(shù)返回值的類型函數(shù)返回值的類型 類名類名:函數(shù)名函數(shù)名(形參表形參表)
11、(函數(shù)體)(函數(shù)體)其中雙冒號其中雙冒號:是作用域運算符,它指出該函數(shù)是屬于是作用域運算符,它指出該函數(shù)是屬于哪一個類的成員函數(shù)。哪一個類的成員函數(shù)。6.2.3 對象的定義與使用對象的定義與使用1對象的定義對象的定義對象的定義形式如下:對象的定義形式如下:類名類名 對象名表對象名表;其中對象名表代表有多個對象名,各對象名之間以逗其中對象名表代表有多個對象名,各對象名之間以逗號分隔。號分隔。2對象成員引用對象成員引用具體引用形式為:具體引用形式為:對象名對象名.數(shù)據(jù)成員名數(shù)據(jù)成員名對象名對象名.成員函數(shù)名成員函數(shù)名(實參表實參表)【例例6.3】定義一個時鐘類,類中有定義一個時鐘類,類中有3個私有
12、數(shù)據(jù)成個私有數(shù)據(jù)成員(員(Hour、Minute和和Second)和兩個公有成員函數(shù))和兩個公有成員函數(shù)(SetTime和和ShowTime)。)。SetTime根據(jù)傳遞的根據(jù)傳遞的3個個參數(shù)為對象設置時間,參數(shù)為對象設置時間,ShowTime負責將對象表示的負責將對象表示的時間顯示輸出。在主函數(shù)中,建立一個時間類的對象,時間顯示輸出。在主函數(shù)中,建立一個時間類的對象,先利用默認時間設置,再設置時間為先利用默認時間設置,再設置時間為10時時23分分45秒并秒并顯示該時間。顯示該時間。6.2.4 類與結構體的區(qū)別類與結構體的區(qū)別在在C+語言中,結構體除了具有原先語言中,結構體除了具有原先C語言定
13、義的功能語言定義的功能外,還具有類似于類的功能,即也可以在其中定義函外,還具有類似于類的功能,即也可以在其中定義函數(shù)。它們之間的區(qū)別是:在結構體中,成員的默認訪數(shù)。它們之間的區(qū)別是:在結構體中,成員的默認訪問權限是問權限是public,而類成員的默認訪問權限是,而類成員的默認訪問權限是private。【例例6.4】用結構體定義類的示例。用結構體定義類的示例。6.3 對象的初始化對象的初始化在類的定義中不能給數(shù)據(jù)成員賦初值。在類的定義中不能給數(shù)據(jù)成員賦初值。從封裝的目的出發(fā),類的數(shù)據(jù)成員應該多為私有的,從封裝的目的出發(fā),類的數(shù)據(jù)成員應該多為私有的,對私有數(shù)據(jù)成員的訪問只能通過成員函數(shù),而不能通對
14、私有數(shù)據(jù)成員的訪問只能通過成員函數(shù),而不能通過成員引用的方式來賦值。過成員引用的方式來賦值。C+中定義了一種特殊的初始化函數(shù),稱之為構造函中定義了一種特殊的初始化函數(shù),稱之為構造函數(shù)(數(shù)(Constructor)。在特定對象使用結束時,還將進)。在特定對象使用結束時,還將進行一些清除工作。對象清除工作由析構函數(shù)行一些清除工作。對象清除工作由析構函數(shù)(Destructor)來完成。)來完成。6.3.1 構造函數(shù)構造函數(shù)1構造函數(shù)的特點構造函數(shù)的特點(1)構造函數(shù)名與類名相同,且沒有返回值,不能)構造函數(shù)名與類名相同,且沒有返回值,不能指定函數(shù)類型。指定函數(shù)類型。(2)構造函數(shù)必須使具有公有屬性,
15、但它不能像其)構造函數(shù)必須使具有公有屬性,但它不能像其它成員函數(shù)那樣被顯式地調用,它是在定義對象的同它成員函數(shù)那樣被顯式地調用,它是在定義對象的同時被系統(tǒng)自動調用的。時被系統(tǒng)自動調用的。(3)構造函數(shù)是特殊的成員函數(shù),函數(shù)體可以寫在)構造函數(shù)是特殊的成員函數(shù),函數(shù)體可以寫在類體內,也可以寫在類體外。類體內,也可以寫在類體外。(4)構造函數(shù)可以重載,即一個類中可以定義多個)構造函數(shù)可以重載,即一個類中可以定義多個參數(shù)個數(shù)或參數(shù)類型不同的構造函數(shù)。參數(shù)個數(shù)或參數(shù)類型不同的構造函數(shù)?!纠?.5】使用構造函數(shù)替代例使用構造函數(shù)替代例6.3中中SetTime()成員函成員函數(shù),并在主函數(shù)中,使用構造函
16、數(shù)設置時間為數(shù),并在主函數(shù)中,使用構造函數(shù)設置時間為15時時19分分56秒并顯示該時間。秒并顯示該時間。構造函數(shù)也可以重載。關于重載的概念將在第構造函數(shù)也可以重載。關于重載的概念將在第7章詳章詳細介紹,這里先看一個例子。細介紹,這里先看一個例子?!纠?.6】構造函數(shù)重載定義示例。構造函數(shù)重載定義示例。綜上所述,構造函數(shù)是一個有著特殊名字,在對象創(chuàng)綜上所述,構造函數(shù)是一個有著特殊名字,在對象創(chuàng)建時被自動調用的一種函數(shù),它的功能就是完成對象建時被自動調用的一種函數(shù),它的功能就是完成對象的初始化。的初始化。2默認的構造函數(shù)默認的構造函數(shù)如果類定義中沒有給出構造函數(shù),則如果類定義中沒有給出構造函數(shù),則C+編譯器自動編譯器自動給出一個默認的構造函數(shù),而且默認的構造函數(shù)只能給出一個默認的構造函數(shù),而且默認的構造函數(shù)只能有一個,形式如下:有一個,形式如下:類名類名:默認構造函數(shù)名默認構造函數(shù)名()沒有定義過任何形式的構造函數(shù),系統(tǒng)會自動生成默沒有定義過任何形式的構造函數(shù),系統(tǒng)會自動生成默認的構造函數(shù)。若已經(jīng)定義過構造函數(shù),則系統(tǒng)不會認的構造函數(shù)。若已經(jīng)定義過構造函數(shù),則系統(tǒng)不會自動生成默認的構造函