C語言與程序設(shè)計大學(xué)教程(CPP教材第二版)二275_第1頁
C語言與程序設(shè)計大學(xué)教程(CPP教材第二版)二275_第2頁
C語言與程序設(shè)計大學(xué)教程(CPP教材第二版)二275_第3頁
C語言與程序設(shè)計大學(xué)教程(CPP教材第二版)二275_第4頁
C語言與程序設(shè)計大學(xué)教程(CPP教材第二版)二275_第5頁
已閱讀5頁,還剩270頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

CPP教材(第二版)二李龍澍著C語言與程序設(shè)計大學(xué)教程5/1/20231第四章面向?qū)ο蟾靖拍钆c類

第五章面向?qū)ο蟾靖拍钆c類

第6章指針和引用李龍澍著5/1/20232第四章面向?qū)ο蟾靖拍钆c類本章要點面向?qū)ο蟪绦蛟O(shè)計的概念類的含義成員函數(shù)重載

5/1/20233第四章面向?qū)ο蟾靖拍钆c類4.1算法的概念4.2類4.3成員函數(shù)重載4.4例題分析和小結(jié)實訓(xùn)4建造集合類實訓(xùn)習(xí)題45/1/20234C++是一種面向?qū)ο蟮某绦蛟O(shè)計語言。類(class)是C++語言程序設(shè)計的核心。類是用戶定義的一種新的數(shù)據(jù)類型。第四章面向?qū)ο蟾靖拍钆c類5/1/202354.1面向?qū)ο蟪绦蛟O(shè)計的根本概念為了解決這種不合理現(xiàn)象,必須使用一種與人們認(rèn)識客觀事物的過程一致的方法,這就是面向?qū)ο蟮姆椒?。C++語言是當(dāng)今最流行的一種面向?qū)ο蟮某绦蛟O(shè)計語言。本節(jié)將討論面向?qū)ο蟪绦蛟O(shè)計的根本概念:對象和類,介紹面向?qū)ο蟪绦蛟O(shè)計的三個主要性質(zhì):封裝、繼承和多態(tài)。5/1/202364.1.1對象一個對象是描述客觀事物的一個實體。對象是構(gòu)成信息系統(tǒng)的一個根本單位。對象由對象名、一組屬性和一組操作構(gòu)成。其中,屬性由數(shù)據(jù)表示,操作由函數(shù)實現(xiàn)。對象的結(jié)構(gòu)如圖4.1所示。5/1/20237圖4.1對象模型4.1.1對象5/1/202384.1.1對象【例4.1】將圖形中的一個“點〞表示成一個簡單對象。點有坐標(biāo)位置(x,y)屬性,點有顯示、隱藏、移動等操作。如圖4.2,點對象包括點的屬性和關(guān)于點的操作兩大局部。對象名是“點A〞,(3,5)是點A的位置,x坐標(biāo)為3,y坐標(biāo)為5;其操作是可以顯示也可以隱藏,還可以移動點的位置,移動后表示點的位置的屬性值就會改變。5/1/202394.1.1對象圖4.2對象點A的結(jié)構(gòu)5/1/2023104.1.1對象【例4.2】建造表示學(xué)生張強的對象,包括姓名張強、2年級、男生、程序設(shè)計成績89等信息。可以顯示張強的這些信息,可以修改年級,可以輸入程序設(shè)計成績。張強這個學(xué)生對象有屬性數(shù)據(jù):姓名、年級、性別、程序設(shè)計成績;有操作:顯示姓名、顯示年級、顯示性別、顯示程序設(shè)計成績、修改年級、輸入程序設(shè)計成績。5/1/2023114.1.1對象圖4.3說明了學(xué)生張強的對象結(jié)構(gòu)。對象名是“Zhang〞。同一個對象在不同的信息系統(tǒng)中,由于用途的不同,可以有不同的屬性和不同的操作。例如在學(xué)生管理信息系統(tǒng)中,教學(xué)秘書最關(guān)心的是學(xué)習(xí)成績,輔導(dǎo)員最關(guān)心的思想表現(xiàn),學(xué)校領(lǐng)導(dǎo)最關(guān)心的是升級還是留級。5/1/2023124.1.1對象【例4.3】建造表示學(xué)生張強的對象,用于檔案管理,包括姓名張強、男生、家住鄭州市,父親張山在銀行工作,母親王英在郵局工作;可以顯示張強的這些信息,可以修改父母親的工作,可以修改家庭住址。對象張強有屬性數(shù)據(jù):姓名、性別、父親姓名、父親單位、母親姓名、母親單位;有操作:顯示信息、修改父親工作、修改母親工作、修改家庭住址。5/1/2023134.1.1對象張強的又一個對象如圖4.4所示,對象名是“Qiang〞。同是張強對象,由于在信息系統(tǒng)中的用途不同,從圖4.3和圖4.4中可以看出,它們的屬性和操作有很大區(qū)別。5/1/2023144.1.2抽象抽象是人類認(rèn)識問題的最根本手段之一。面向?qū)ο蠓椒ㄖ械某橄笫侵笇γ恳活悓ο筮M(jìn)行概括,抽出這類對象的公共性質(zhì)并用計算機語言加以描述的過程。把具有相同屬性和相同操作的一些對象抽象為一個類,這些對象都是這個類的實例。類的實例與對象的含義是一樣的。一個類實質(zhì)上是定義了一種對象類型,它描述了屬于該類型的所有對象的屬性和操作。顯然,類也應(yīng)該由三局部組成:類名、一組屬性和一組操作。根本結(jié)構(gòu)如圖4.5所示。5/1/2023154.1.2抽象5/1/2023164.1.2抽象【例4.4】設(shè)計一個表示點的類。如圖4.6的點類說明表示點位置的兩個實數(shù),定義一個表示點的數(shù)據(jù)類型。類名是Point。點類可以有操作顯示、隱藏和移動。5/1/2023174.1.2抽象【例4.5】設(shè)計一個簡單的時鐘類。世界上有成千上萬座時鐘,通過分析,容易看出需要三個整型數(shù)來存儲時間,分別表示時、分和秒,也就是把時鐘表示的時間抽象為表示時、分、秒的三個整數(shù),這是時鐘的屬性;對時鐘可以進(jìn)行顯示時間和設(shè)置時間等簡單的操作,這就是把時鐘的行為抽象為兩個操作。命名這個時鐘類為Clock,得到如圖4.7所示的時鐘類結(jié)構(gòu)。5/1/2023184.1.2抽象在圖4.7中,整型數(shù)H表示小時,整型數(shù)M表示分,整型數(shù)S表示秒,雙斜線(//)后面的漢字是注釋,函數(shù)Display()表示顯示時鐘的時間,函數(shù)Set(int,int,int)表示設(shè)置時鐘的時間,三個參數(shù)分別表示時、分、秒。5/1/2023194.1.2抽象例【4.6】建立一個表示人的根本信息的類,包括身份證號碼、姓名、性別、出生日期等信息,能夠進(jìn)行查找、顯示操作。人的根本信息的類,起名為Person。根據(jù)題意,Person類有屬性身份證號碼、姓名、性別和出生日期,身份證號碼、姓名由字符串表示,性別由字符表示,出生日期由3個整型數(shù)表示。Person類的操作應(yīng)該有根據(jù)身份證號碼查找和根據(jù)姓名查找,還應(yīng)該有顯示操作。5/1/2023204.1.2抽象如圖4.8所示的結(jié)構(gòu),其中No為身份證號碼,Name為姓名,Sex為性別,Y、M、D分別表示出生日期的年、月、日;Display()是顯示操作FindNo(char[])是根據(jù)身份證號碼查找,函數(shù)的參數(shù)是身份證號碼,F(xiàn)indName(char[])是根據(jù)姓名查找,函數(shù)的參數(shù)是姓名。5/1/2023214.1.3封裝封裝是一種信息隱藏技術(shù)。在面向?qū)ο蟪绦蛟O(shè)計中,通過封裝,可以將一局部屬性和操作隱藏起來,不讓使用者訪問,另一局部作為類的外部接口,使用者可以訪問,這樣可以對屬性和操作的訪問權(quán)限進(jìn)行合理控制,減少程序之間的相互影響,降低出錯的可能性。5/1/202322封裝的定義為:(1)一個清楚的邊界。對象的所有屬性和操作被限定在這個邊界內(nèi)。(2)一個外部接口。該接口用以描述這個對象和其它對象之間的相互作用,就是給出在編寫程序中用戶可以直接使用的屬性數(shù)據(jù)和操作。(3)隱藏受保護(hù)的屬性數(shù)據(jù)和內(nèi)部操作。類提供的功能的實現(xiàn)細(xì)節(jié)和供內(nèi)部使用、修改的屬性數(shù)據(jù),不能在定義這個對象的類的外部訪問。4.1.3封裝5/1/202323在C++語言中,對象的結(jié)構(gòu)由類描述,每個類的屬性和操作可以分為私有的和公有的兩種類型。對象的外部只能訪問對象的公有局部,不能直接訪問對象的私有局部。4.1.3封裝5/1/2023244.1.3封裝【例4.7】應(yīng)用封裝概念,設(shè)計一個簡單的時鐘類。在例4.5中,需要三個整型數(shù)來存儲時間,分別表示時、分和秒;對時鐘可以進(jìn)行顯示時間和設(shè)置時間等簡單的操作,就是把時鐘的行為抽象為兩個操作。用戶操作時鐘只需要顯示時間和設(shè)置時間,沒有必要翻開時鐘修改它的時、分、秒,可以防止不懂時鐘結(jié)構(gòu)的人搞壞時鐘,于是就把時、分、秒設(shè)置為私有局部,把顯示時間和設(shè)置時間定義為公有局部?,F(xiàn)在命名這個時鐘類叫ClockOK,得到時鐘類的結(jié)構(gòu)如圖4.9所示。5/1/2023254.1.3封裝人們可以通過外部接口函數(shù)Set(int,int,int)來設(shè)置和修改時鐘的時間,不必直接對H、M、S三個整型數(shù)賦值,也不必關(guān)心Set(int,int,int)函數(shù)怎樣設(shè)置和修改時鐘的時間。這樣規(guī)定是合理的,既減少了勞動,又防止了錯誤,這是面向?qū)ο蟪绦蛟O(shè)計的一個突出優(yōu)點。5/1/2023264.1.4繼承人們在認(rèn)識客觀世界的過程中形成了一個層次結(jié)構(gòu)。例如圖4.11表示的是貓科動物的分類圖。生物的分類與C++的繼承機制非常相似。圖4.12顯示了昆蟲的特征繼承情況,而圖4.13那么顯示的是貓科動物的繼承情況。在C++中,繼承是新建的類從已有的類那里得到已有的特征。已有的類稱為基類或父類,由繼承基類產(chǎn)生的新建類稱為派生類或子類。由父類產(chǎn)生子類的過程稱作類的派生。繼承有效地實現(xiàn)了軟件的重用,增強了系統(tǒng)的可擴(kuò)充性。5/1/2023274.1.4繼承5/1/2023285/1/2023294.1.5多態(tài)在C++的類中,相同的函數(shù)名可以有假設(shè)干個不同的函數(shù)體,在調(diào)用同一函數(shù)時由于環(huán)境的不同,可能引起不同的行為,這種功能被稱為多態(tài)。也就是類中具有相似功能的不同函數(shù)使用同一個函數(shù)名。多態(tài)是人類思維方式的一種模擬。5/1/2023304.1.5多態(tài)函數(shù)名重載是實現(xiàn)多態(tài)的一種手段,兩個同名的Max函數(shù)如下:intMax(intx,inty){if(x<y)returny;elsereturnx;}intMax(intx,inty,intz){intk;if(x<y)k=y;elsek=x;if(k<z)returnz;elsereturnk;}5/1/2023314.1.5多態(tài)多態(tài)既表達(dá)了人類的思維方式,又減少了程序中的標(biāo)識符的個數(shù),方便了程序員編寫程序。多態(tài)是面向?qū)ο蟪绦蛟O(shè)計的一個重要機制。

5/1/2023324.2類在C++中,類(class)也是一種數(shù)據(jù)類型,是程序員可以用聲明語句說明的數(shù)據(jù)類型。類同前面講的int、float等根本數(shù)據(jù)類型一樣,可以生成類的變量。由類生成的變量,不再稱作變量,而稱為對象類有比根本類型更強大的功能,不僅包括這種類型的數(shù)據(jù)結(jié)構(gòu),還包括對數(shù)據(jù)進(jìn)行操作的函數(shù)。類是數(shù)據(jù)和函數(shù)的封裝體。5/1/2023334.2.1類的定義定義一個關(guān)于長方形的類,它包括長和寬兩個數(shù)據(jù),設(shè)置長和寬、求周長、求面積等操作。長方形類定義如下:classRect{private: floatx,y;//實型數(shù)據(jù)長和寬public: voidset(floata,floatb); //設(shè)置長和寬函數(shù) floatperi();//求周長函數(shù)floatarea();//求面積函數(shù)};5/1/2023344.2.1類的定義在長方形類中封裝了關(guān)于長方形的數(shù)據(jù)和函數(shù),在類中數(shù)據(jù)稱為數(shù)據(jù)成員,函數(shù)稱為成員函數(shù)。5/1/2023354.2.1類的定義再看一個表示人的根本信息的簡單類:classPerson{private: charname[8]; //字符串表示姓名 intage; //整型年齡 charsex;//字符型性別 public: voidset(char*str,inta,chars); //設(shè)置姓名、年齡和性別 voidprint(); //顯示姓名、年齡和性別 };5/1/2023364.2.1類的定義在類的定義中,首先用關(guān)鍵字class聲明類的名稱;然后聲明類的數(shù)據(jù)成員;最后聲明類的成員函數(shù);關(guān)鍵字private和public說明了類的數(shù)據(jù)和函數(shù)的訪問權(quán)限。

5/1/2023374.2.1類的定義類定義的一般形式為:class<類名>{ private:<私有的數(shù)據(jù)和函數(shù)> protected: <保護(hù)的數(shù)據(jù)和函數(shù)> public: <公有的數(shù)據(jù)和函數(shù)> };

5/1/2023384.2.1類的定義類的定義包括了4局部:(1)關(guān)鍵字class和類名,類名是程序員為類起的名字,可以用除關(guān)鍵字以外的任何字符串表示;(2)左花括號‘{’;(3)聲明數(shù)據(jù)和函數(shù),數(shù)據(jù)就是用類型說明C++變量,函數(shù)就是一般的C++函數(shù);(4)右花括號‘}’和分號‘;’。5/1/2023394.2.1類的定義例4.7的時鐘類可以定義如下:classClockOK{private:intH,M,S; //時、分、秒public:voidDisplay();voidSet(int,int,int);};注意在定義類時,最后的分號“;〞不可省略。5/1/2023404.2.2類的數(shù)據(jù)成員數(shù)據(jù)成員是類的一個重要組成局部。類的數(shù)據(jù)成員同結(jié)構(gòu)struct中的數(shù)據(jù)是一致的,不僅定義的語法形式一樣,使用的語法形式也一樣。類的名稱和數(shù)據(jù)成員的名稱是程序員給的,可以用英文單詞,可以用漢語拼音,也可以用程序員感興趣的其它字符串。類的數(shù)據(jù)成員是類的根底,應(yīng)該正確、完整地定義類的數(shù)據(jù)成員。5/1/2023414.2.2類的數(shù)據(jù)成員【例4.9】用struct和class分別建立學(xué)生根本信息的數(shù)據(jù)結(jié)構(gòu),包括姓名、年齡、性別、身高等數(shù)據(jù)。首先要分析一下每項數(shù)據(jù)的數(shù)據(jù)類型,姓名為8個字符的數(shù)組,年齡是整型數(shù),性別可以是一個字符,身高是整型數(shù)。用struct建立結(jié)構(gòu)類型如下:structstudent1{ charname[8]; intage; charsex; intheight;};5/1/2023424.2.2類的數(shù)據(jù)成員用class建立與struct等價的結(jié)構(gòu)類型如下:classstudent2{ public: charname[8]; intage; charsex; intheight;};上面建成的兩個類student1和student2是完全等價的,它們都包含了姓名、年齡、性別、身高等數(shù)據(jù)。5/1/2023434.2.2類的數(shù)據(jù)成員【例4.10】建立一個表示日期的類,只定義數(shù)據(jù)成員。表示一個日期需要3個整型數(shù):年、月、日,假設(shè)用Date表示日期類的類名,用整型變量Year表示年,整型變量Month表示月,整型變量Day表示日,不設(shè)計對日期的操作,得到日期類為:classdate{ public: intYear; intMonth; intDay;};5/1/2023444.2.2類的數(shù)據(jù)成員Year、Month、Day三個變量說明可以放在一起,其結(jié)構(gòu)如下:classdate{ public: intYear,Month,Day;};Year、Month、Day三個變量之間用逗號分開。5/1/2023454.2.2類的數(shù)據(jù)成員【例4.11】建立一個表示時間的類,只定義數(shù)據(jù)成員。與例4.10同樣道理,表示時間也需要3個整型數(shù):時、分、秒,用ShiJian表示時間類的類名,用整型變量Shi表示時,整型變量Fen表示分,整型變量Miao表示秒,不考慮對時間的操作,得到時間類為:5/1/2023464.2.2類的數(shù)據(jù)成員classShiJian{ public: intShi; intFen; intMiao;};或?qū)懗桑篶lassShiJian{ public: intShi,Fen,Miao;};在例4.10和例4.11中,可以看出,類的名稱和數(shù)據(jù)成員的名稱是程序員給的,可以用英文單詞,可以用漢語拼音,也可以用程序員感興趣的其它字符串。5/1/2023474.2.3類的成員函數(shù)成員函數(shù)實現(xiàn)對類中數(shù)據(jù)成員的操作,它描述了類的行為。由于對象的封裝性,類的成員函數(shù)是對類的私有數(shù)據(jù)成員進(jìn)行操作的惟一途徑。5/1/2023484.2.3類的成員函數(shù)1.成員函數(shù)的聲明在類中聲明成員函數(shù)同聲明數(shù)據(jù)成員類似,先看一個例子。【例4.12】建立一個表示日期的類,可以設(shè)置日期和顯示日期。由例4.10可知,表示一個日期需要3個整型數(shù):年、月、日。用Date表示日期類的類名,用整型變量Year表示年,整型變量Month表示月,整型變量Day表示日,Set函數(shù)表示設(shè)置日期,Display函數(shù)表示顯示日期,得到日期類為:5/1/2023494.2.3類的成員函數(shù)classDate{ private: intYear; intMonth; intDay; public: voidSet(inty,intm,intd); //成員函數(shù) voidDisplay(); //成員函數(shù)};5/1/2023504.2.3類的成員函數(shù)一般地,類的成員函數(shù)聲明的結(jié)構(gòu)如下:<類型><成員函數(shù)名>(<參數(shù)表>);類型是成員函數(shù)的返回值類型,如果沒有返回值,那么類型為void。成員函數(shù)名是一般的函數(shù)名。參數(shù)表是函數(shù)的形式參數(shù)表,如Date類中Set函數(shù)中的inty、intm和intd。注意類的每個成員函數(shù)聲明中最后的分號是不可以省略的。5/1/2023514.2.3類的成員函數(shù)【例4.13】建立一個表示時間的類,可以設(shè)置時間和顯示時間。與例4.11同樣道理,表示時間需要3個整型數(shù):時、分、秒。用ShiJian表示時間類的類名,用整型變量Shi表示時,整型變量Fen表示分,整型變量Miao表示秒,Set函數(shù)表示設(shè)置時間,Display函數(shù)表示顯示時間,得到時間類為:5/1/2023524.2.3類的成員函數(shù)classShiJian{ private:intShi,Fen,Miao; public: voidSet(intS,intF,intM);//成員函數(shù) voidDisplay();//成員函數(shù)};Set函數(shù)和Display函數(shù)都不需要返回值,所以都為void類型。Set函數(shù)有3個整型參數(shù)分別表示時、分、秒,Display函數(shù)沒有參數(shù)。參數(shù)表中的參數(shù)可以只說明參數(shù)類型,而省略變量標(biāo)識符。5/1/2023534.2.3類的成員函數(shù)時間類可以寫為:classShiJian{ private:intShi,Fen,Miao; public: voidSet(int,int,int);//省略了變量標(biāo)識符的成員函數(shù) voidDisplay();};為了程序的可靠性,一般隱藏類的數(shù)據(jù)成員,而由類的成員函數(shù)實現(xiàn)對類的數(shù)據(jù)成員的操作。5/1/2023544.2.3類的成員函數(shù)2.成員函數(shù)的實現(xiàn)成員函數(shù)的聲明只是說明類中需要這樣一個成員函數(shù),具體這個成員函數(shù)執(zhí)行什么操作,現(xiàn)在還不知道,需要進(jìn)一步定義這個成員函數(shù),來實現(xiàn)它的操作功能。成員函數(shù)定義的結(jié)構(gòu)如下:<類型><類名>::<成員函數(shù)名>(<參數(shù)表>){ <成員函數(shù)體>}5/1/2023554.2.3類的成員函數(shù)成員函數(shù)定義的結(jié)構(gòu)與普通函數(shù)不同的地方是:在類型和成員函數(shù)名之間加了一個類名和雙冒號‘::’。::是作用域運算符,用來標(biāo)識成員函數(shù)或數(shù)據(jù)是屬于哪個類的。實現(xiàn)成員函數(shù)時參數(shù)表中的形參變量標(biāo)識符不能省略。5/1/2023564.2.3類的成員函數(shù)【例4.14】實現(xiàn)例4.12中Date類中的成員函數(shù)。它的類名是Date,所以voidDate::Set(inty,intm,intd){ Year=y; //設(shè)置年份 Month=m; //設(shè)置月份 Day=d; //設(shè)置日}//設(shè)置日期函數(shù)結(jié)束Day<<"日"<<endl;//顯示日,回車}5/1/2023574.2.3類的成員函數(shù)voidDate::Display(){ cout<<"日期為:"<<endl;//顯示“日期為:〞,回車 cout<<"\t"<<Year<<"年";//空幾格后,顯示年份 cout<<Month<<"月";//顯示月份 cout<<Day<<“日〞<<endl;//顯示日,回車}假設(shè)日期是2021年6月10日,那么運行結(jié)果為:日期為: 2021年6月10日5/1/2023584.2.3類的成員函數(shù)【例4.15】實現(xiàn)例4.13中ShiJian類中的成員函數(shù)。由于它的類名是ShiJian,所以voidShiJian::Set(intS,intF,intM){ Shi=S; //設(shè)置時 Fen=F; //設(shè)置分 Miao=M; //設(shè)置秒}5/1/2023594.2.3類的成員函數(shù)voidShiJian::Display(){ cout<<"現(xiàn)在時間是:";//顯示“現(xiàn)在時間是:〞 cout<<Shi<<":"<<Fen<<":"<<Miao; //顯示時間}假設(shè)時間是9時38分25秒,運行結(jié)果為:現(xiàn)在時間是:9:38:255/1/2023604.2.4類成員存取權(quán)限成員函數(shù)的存取權(quán)限有三級:公有的(public)、保護(hù)的(protected)和私有的(private)。公有成員用public關(guān)鍵字聲明,它定義了類的外部接口,只有公有成員才能被用戶程序直接訪問。

私有成員用private關(guān)鍵字聲明,它定義了類的內(nèi)部使用的數(shù)據(jù)和函數(shù),私有成員只能被自己所屬類的成員函數(shù)訪問。

5/1/2023614.2.4類成員存取權(quán)限

保護(hù)的成員用protected關(guān)鍵字聲明,存取權(quán)限介于公有成員和私有成員之間,它在類的繼承中使用。

一個類可以沒有私有成員,但是不能沒有公有成員。因此,設(shè)計一個類時,一定要有公有成員,它是類的外部接口。但是,為了實現(xiàn)信息隱藏,能夠作為私有成員的就一定定義為私有成員。5/1/2023624.2.4類成員存取權(quán)限【例4.16】設(shè)計一個含有四個整數(shù)的類,要求能夠求出這四個數(shù)的最大值和最小值。這個類的名字定義為MaxMin4;類中要有四個整型數(shù),設(shè)為a、b、c、d,為了防止別人修改這四個數(shù)據(jù),一般把它們定義為私有數(shù)據(jù)。計算步驟采取先分別求兩個數(shù)的最大值,再求它們結(jié)果的最大值,例如先求a和b的最大值設(shè)為x,求c和d的最大值設(shè)為y,再求x和y的最大值設(shè)為z,那么z就是a、b、c、d四個數(shù)的最大值。5/1/2023634.2.4類成員存取權(quán)限同樣道理,也可以用這種方法求這四個數(shù)的最小值,就是先分別求兩個數(shù)的最小值,再求它們結(jié)果的最小值。對于這個類,求兩個數(shù)最大值的函數(shù)Max2和求兩個數(shù)最小值的函數(shù)Min2只是在這個類的內(nèi)部使用,沒有必要成為公有函數(shù),應(yīng)該是私有函數(shù)。但是,必須定義一個求四個數(shù)的最大值的公有函數(shù)Max4,也要定義一個求四個數(shù)的最小值的公有函數(shù)Min4。還需要一個設(shè)置四個整數(shù)的函數(shù)Set,可以讓用戶輸入數(shù)據(jù),它必需是公有的。5/1/2023644.2.4類成員存取權(quán)限求四個數(shù)的最大值和最小值類如下:classMaxMin4{ private: inta,b,c,d;

intMax2(int,int); intMin2(int,int); public: voidSet(int,int,int,int); intMax4(); intMin4();}; //類的定義5/1/2023654.2.4類成員存取權(quán)限類中成員函數(shù)的實現(xiàn)。intMaxMin4::Max2(intx,inty)//求二個數(shù)的最大值{ if(x>y)returnx; elsereturny;}intMaxMin4::Min2(intx,inty)//求二個數(shù)的最小值{ if(x>y)returny; elsereturnx;}5/1/2023664.2.4類成員存取權(quán)限voidMaxMin4::Set(intx1,intx2,intx3,intx4){ a=x1;b=x2;c=x3;d=x4;}intMaxMin4::Max4()//求自己類中四個數(shù)的最大值{ intx,y,z; x=Max2(a,b);//a、b、c、d和Max2函數(shù)都是私有成員

y=Max2(c,d); z=Max2(x,y); returnz;}5/1/2023674.2.4類成員存取權(quán)限intMaxMin4::Min4()//求自己類中四個數(shù)的最小值{ intx,y,z; x=Min2(a,b); y=Min2(c,d); z=Min2(x,y); returnz;}注意:Max4()和Min4()兩個函數(shù)都沒有參數(shù),因為它們是求自己類中四個數(shù)的最大值或最小值。5/1/2023684.2.4類成員存取權(quán)限在Max4()中用到的a、b、c、d和Max2函數(shù)都是MaxMin4類的私有成員,私有成員只有自己所在類中的函數(shù)才能訪問;同樣在Min4()中a、b、c、d和Min2函數(shù)也都是MaxMin4類的私有成員,Min4()是私有成員a、b、c、d和Min2()自己類中的函數(shù),所以可以訪問。5/1/2023694.2.4類成員存取權(quán)限

在存取權(quán)限關(guān)鍵詞public、protected和private后面的成員,直到下一個存取權(quán)限關(guān)鍵詞出現(xiàn),都具有前面存取權(quán)限關(guān)鍵詞指定的屬性。如例4.16的整型變量a、b、c、d、函數(shù)Max2(int,int)和函數(shù)Min2(int,int)都是私有的,函數(shù)Set(int,int,int,int)、函數(shù)Max4()和函數(shù)Min4()都是公有的。5/1/2023704.3成員函數(shù)重載類的成員函數(shù)同普通函數(shù)一樣也可以進(jìn)行重載?!纠?.17】使用成員函數(shù)重載設(shè)計一個含有四個整數(shù)的類,要求能夠求出這四個數(shù)的最大值和最小值。仿照例4.16,仍然將這個類的名字定義MaxMin4;類中四個整型數(shù)為a、b、c、d,把它們定義為私有數(shù)據(jù)。5/1/2023714.3成員函數(shù)重載求兩個數(shù)的最大值用函數(shù)名Max,求四個數(shù)的最大值也用函數(shù)名Max;同樣道理,求兩個數(shù)的最小值用函數(shù)名Min,求四個數(shù)的最小值也用函數(shù)名Min。還需要一個設(shè)置四個整數(shù)的函數(shù)Set,同例4.16一樣。求四個數(shù)的最大值和最小值類如下:5/1/2023724.3成員函數(shù)重載classMaxMin4{ private: inta,b,c,d;

intMax(int,int); intMin(int,int); public: voidSet(int,int,int,int); intMax(); intMin();}; //類的定義5/1/2023734.3成員函數(shù)重載類中成員函數(shù)的實現(xiàn)。intMaxMin4::Max(intx,inty)//求二個數(shù)的最大值{ if(x>y)returnx; elsereturny;}intMaxMin4::Min(intx,inty)//求二個數(shù)的最小值{ if(x>y)returny; elsereturnx;}5/1/2023744.3成員函數(shù)重載voidMaxMin4::Set(intx1,intx2,intx3,intx4){ a=x1;b=x2;c=x3;d=x4;}intMaxMin4::Max()//求自己類中四個數(shù)的最大值{ intx,y,z; x=Max(a,b);//a、b、c、d和Max函數(shù)都是私有成員

y=Max(c,d); z=Max(x,y); returnz;}5/1/2023754.3成員函數(shù)重載intMaxMin4::Min()//求自己類中四個數(shù)的最小值{ intx,y,z; x=Min(a,b); y=Min(c,d); z=Min(x,y); returnz;}5/1/2023764.3成員函數(shù)重載當(dāng)Max(int,int)有2個整型參數(shù)時,就是兩個數(shù)求最大值;當(dāng)Max()沒有參數(shù)時,就是4個數(shù)求最大值。同樣地,當(dāng)Min(int,int)有2個整型參數(shù)時,就是兩個數(shù)求最小值;當(dāng)Min()沒有參數(shù)時,就是4個數(shù)求最小值。5/1/2023774.3成員函數(shù)重載【例4.18】分析類A的各成員函數(shù)的功能。classA{ private:intx,y; public: voidSet(int,int); voidPrint(); voidAdd(); voidAdd(int); voidAdd(int,int);}5/1/2023784.3成員函數(shù)重載voidA::Set(inta,intb){x=a;y=b;}voidA::Print(){cout<<x<<’\t’<<y;}voidA::Add(){x=x+y;}voidA::Add(inta){x=x+a;}voidA::Add(inta,intb){x=x+a;y=y+b;}Set(int,int)實現(xiàn)對類的私有數(shù)據(jù)x和y賦值。Print()顯示x和y的值。Add是成員函數(shù)重載,Add()實現(xiàn)將x+y的值賦給x,Add(inta)實現(xiàn)將a+x的值賦給x,Add(inta,intb)實現(xiàn)將a+x的值賦給x和y+b的值賦給y。5/1/2023794.3成員函數(shù)重載成員函數(shù)的重載必須滿足下面兩個條件之一:1)函數(shù)的參數(shù)個數(shù)不同。如Add()、Add(int)、Add(int,int)。2)函數(shù)的對應(yīng)參數(shù)類型不完全相同。如Sub(int,int)、Sub(int,float)、Sub(float,int)、Sub(double,float)、Sub(double,int)、Sub(double,double)等等。類的成員函數(shù)也可以帶有缺省參數(shù)。5/1/2023804.3成員函數(shù)重載【例4.19】分析類B的Set函數(shù)的功能。classB{ private:intx,y; public: voidSet(inta=10,intb=30); voidPrint();};voidB::Set(inta,intb){x=a;y=b;}voidB::Print(){cout<<x<<’\t’<<y;}5/1/2023814.3成員函數(shù)重載Set(inta=10,intb=30)的2個參數(shù)都帶有缺省值,當(dāng)使用Set函數(shù)時,如果沒有給出參數(shù),就默認(rèn)a=10和b=30;如果給出1個參數(shù),就默認(rèn)b=30,a是給出的參數(shù)值。有了Set(inta=10,intb=30)就不能再重載Set(int)和Set()。因為Set(int)默認(rèn)了有2個參數(shù),第2個參數(shù)是30;Set()也默認(rèn)了有2個參數(shù),第1個參數(shù)是10,第2個參數(shù)是30。5/1/2023824.4例題分析和小結(jié)4.4.1例題【例4.20】設(shè)計一個計算器類,可以存儲3個實數(shù)A、B、C,對這些數(shù)可以進(jìn)行加、減、乘、除運算,也就是實現(xiàn)C=A+B,C=A-B,C=A×B,C=A÷B,可以顯示這些數(shù)。5/1/2023834.4.1例題首先要設(shè)計3個實型數(shù)A、B、C,它們不必程序員直接訪問,所以為私有數(shù)據(jù)成員;要修改A、B、C的值,設(shè)計賦值函數(shù)PutA(int)、PutB(int)和PutC(int),還可以設(shè)計同時為A、B、C賦值的函數(shù)Put(int,int,int),有時只需要為A、B賦值,C存放結(jié)果,把C置為0,所以第3個參數(shù)可以缺省為0,這些都是對外接口,為公有的;設(shè)計加、減、乘、除4個函數(shù);設(shè)計顯示函數(shù)Display()顯示A、B、C三個數(shù),可以重載Display(intx)函數(shù),x==1顯示A,x==2顯示B,否那么顯示C,這些函數(shù)也是公有的。5/1/2023844.4.1例題類名設(shè)為JiSuanQi。類定義如下:classJiSuanQi{private:floatA,B,C;public:VoidPutA(int);VoidPutB(int);VoidPutC(int);VoidPut(inta,intb,intc=0);VoidDisplay();VoidDisplay(int);floatAdd();floatSub();floatMult();floatDiv();};5/1/2023854.4.1例題VoidJiSuanQi::PutA(intx){A=x;}VoidJiSuanQi::PutB(intx){B=x;}VoidJiSuanQi::PutA(intx){C=x;}VoidJiSuanQi::Puttinga,intb,intc=0){A=a;B=b;C=c;}VoidJiSuanQi::Display(){cout<<"A="<<A<<"\tB="<<B<<"\tC="<<C<<endl;}VoidJiSuanQi::Display(intx){ if(x==1)cout<<"A="<<A<<endl; elseif(x==2)cout<<"B="<<B<<endl;elsecout<<"C="<<C<<endl;}floatJiSuanQi::Add(){C=A+B;returnC;}floatJiSuanQi::Sub(){C=A-B;returnC;}floatJiSuanQi::Mult(){C=A*B;returnC;}floatJiSuanQi::Div(){if(B==0)C=0;elseC=A/B;returnC;}5/1/2023864.4.2解題分析計算器類的類名不能用C++的關(guān)鍵詞作為類名。C++的關(guān)鍵詞也不能改作其它標(biāo)識符使用。

計算器要存儲數(shù)據(jù),必須有一些存儲單元,這些存儲單元的數(shù)據(jù)用戶不能隨意修改,只能通過相關(guān)的操作,才能修改,因此把數(shù)據(jù)設(shè)為私有成員。

要用戶為3個數(shù)據(jù)變量賦值,就必須設(shè)置3個公有賦值函數(shù)PutA(int)、PutB(int)和PutC(int)。5/1/202387解題分析要知道計算的結(jié)果,必須有顯示函數(shù)Display()顯示A、B、C三個數(shù)。加、減、乘、除運算是計算器具有的外部操作,都應(yīng)是公有的。設(shè)計Add()執(zhí)行C=A+B,Sub()執(zhí)行C=A-B,Mult()執(zhí)行C=A×B,Div()執(zhí)行C=A÷B。

5/1/2023884.4.3小結(jié)面向?qū)ο蟪绦蛟O(shè)計通過類實現(xiàn)了對數(shù)據(jù)和算法的抽象、封裝、繼承和多態(tài),極大提高了軟件的開發(fā)能力,減少了軟件的開發(fā)時間和開發(fā)費用。類是面向?qū)ο蟪绦蛟O(shè)計的根底。類是相關(guān)數(shù)據(jù)和函數(shù)的封裝。類相當(dāng)于用戶自己定義的數(shù)據(jù)類型。對象是描述客觀事物的一個實體。類實現(xiàn)了一類對象的數(shù)據(jù)類型。5/1/2023894.4.3小結(jié)封裝可以將一局部屬性和操作隱藏起來,減少程序之間的相互影響,降低程序出錯的可能性。繼承是新建的類從已有的類那里得到已有的特征,繼承有效地實現(xiàn)了軟件的重用,增強了系統(tǒng)的可擴(kuò)充性。多態(tài)是把具有相似功能的不同函數(shù)使用同一個函數(shù)名,多態(tài)表達(dá)了人類的思維方式。5/1/2023904.4.3小結(jié)類的定義依次包括了如下4大局部:(1)關(guān)鍵字class和類名,類名可以使用除關(guān)鍵字以外的任何字符串;(2)左花括號‘{’;(3)聲明數(shù)據(jù)成員和成員函數(shù);(4)右花括號‘}’和分號‘;’。5/1/2023914.4.3小結(jié)類的成員有公有和私有訪問權(quán)限,公有成員在任何地方都能訪問,是類的外部接口,私有成員只有該類的成員函數(shù)才能訪問,實現(xiàn)了信息隱藏。數(shù)據(jù)成員可以是私有的,也可以是公有的;成員函數(shù)可以是公有的,也可以是私有的。5/1/202392實訓(xùn)41.實訓(xùn)題目設(shè)計一個表示整型數(shù)據(jù)的集合類,可以對集合中的數(shù)據(jù)進(jìn)行添加、刪除,可以判斷一個整數(shù)是否在這個集合里,可以求出集合數(shù)據(jù)的多少,可以判斷集合的空和滿,空集合就是沒有數(shù)據(jù)元素,滿集合是數(shù)據(jù)元素已經(jīng)占滿給出的存儲單元。兩個集合可以做交運算,就是將兩個集合的公共數(shù)據(jù)組成一個新的集合。兩個集合可以做并運算,就是將兩個集合的所有數(shù)據(jù)組成一個新的集合。5/1/202393實訓(xùn)42.實訓(xùn)要求(1)分析集合類的數(shù)據(jù)屬性要求。(2)分析集合類的操作屬性要求。(3)編制集合類的接口定義。(4)實現(xiàn)集合類的屬性函數(shù)。5/1/202394第五章面向?qū)ο蟾靖拍钆c類本章要點對象的概念對象的建立與賦值5/1/202395第五章對象5.1對象的建立和撤銷5.2對象的賦值5.3例題分析和小結(jié)實訓(xùn)5數(shù)組數(shù)據(jù)處理對象實訓(xùn)習(xí)題55/1/202396對象是C++語言程序設(shè)計的根本單位。類描述了一類問題的共同屬性和行為,對象是類的實例,對象是由類作為類型定義的變量。第五章對象5/1/2023975.1對象的建立和撤銷對象同變量一樣,有從自己建立到消亡的生存期,也有與變量一致的作用域。所以,在語法上對象就是由類定義的變量。5/1/2023985.1.1對象的定義定義一個對象同定義一個變量類似,其語法結(jié)構(gòu)如下:<類名><對象名>;例如應(yīng)用例4.12定義的表示日期的類Date:DateMyDate; //定義了一個表示日期的對象MyDate。再例如應(yīng)用例4.13定義的表示時間的類ShiJian: ShiJianTime;//定義了一個表示時間的對象Time。5/1/2023995.1.1對象的定義用類定義了對象以后,對象就具有類的所有性質(zhì)。也就是說,類的數(shù)據(jù)成員就是對象的數(shù)據(jù)成員,類的成員函數(shù)就是對象的成員函數(shù)。訪問對象的公有成員的語法結(jié)構(gòu)如下: <對象名>.<公有數(shù)據(jù)成員>;或<對象名>.<公有成員函數(shù)名>(<參數(shù)表>);例如:MyDate.Display();//顯示MyDate對象的日期。5/1/20231005.1.1對象的定義【例5.1】設(shè)計一個設(shè)置和顯示日期的程序。編制一個程序一般分為四個獨立的局部:⑴聲明頭文件,指出要使用的系統(tǒng)函數(shù)和系統(tǒng)類,本例題用到標(biāo)準(zhǔn)輸入輸出頭文件“iostream.h〞;⑵定義類,本例題定義一個表示日期的類;⑶實現(xiàn)類,編制類的成員函數(shù);⑷編制主程序,生成對象實現(xiàn)程序的功能。完整的程序如下:5/1/20231015.1.1對象的定義#include<iostream.h>//聲明頭文件classDate{ //定義類private: intYear,Month,Day; //年月日三個整型數(shù)據(jù)在一起定義public: voidSet(inty,intm,intd); voidDisplay();};//實現(xiàn)類的成員函數(shù)5/1/20231025.1.1對象的定義voidDate::Set(inty,intm,intd){ Year=y; //設(shè)置年份 Month=m; //設(shè)置月份 Day=d; //設(shè)置日}//設(shè)置日期函數(shù)結(jié)束voidDate::Display(){ cout<<"日期為:"<<endl; //顯示“日期為:〞,回車 cout<<"\t"<<Year<<"年";//空幾格后,顯示年份 cout<<Month<<"月";//顯示月份 cout<<Day<<"日"<<endl;//顯示日,回車}5/1/20231035.1.1對象的定義voidmain() //編制主程序{ DateMyDate;//定義一個日期對象MyDate MyDate.Set(2021,9,18);//設(shè)置日期 cout<<"第1次顯示日期:"<<endl; MyDate.Display();//顯示日期 MyDate.Set(2021,11,26);//設(shè)置日期 cout<<"第2次顯示日期:"<<endl; MyDate.Display();//顯示日期}5/1/20231045.1.1對象的定義該程序第一次設(shè)置日期為2021年9月18該程序第一次設(shè)置日期為2021年9月18日,接著顯示這個日期;第二次設(shè)置日期為2021年11月26日,接著顯示新的日期。運行結(jié)果為:第1次顯示日期:日期為:2021年9月18日第2次顯示日期:日期為:2021年11月26日5/1/20231055.1.1對象的定義【例5.2】定義一個關(guān)于長方形的類,編制求長方型周長和面積的程序,求出長135、寬86長方形的周長和面積,求出長62.2、寬27.5長方形的周長和面積。長方形類定義如下:#include<iostream.h>//聲明頭文件classRect{//定義長方形類Rect private://私有成員 floatx,y;//實型數(shù)據(jù)長x和寬y public://公有成員 voidset(floata=0,floatb=0){x=a;y=b;}//成員函數(shù)在類中實現(xiàn) floatperi(); //求周長函數(shù)floatarea();//求面積函數(shù)};5/1/20231065.1.1對象的定義floatRect::peri()//定義求周長函數(shù){ floatz; z=2*x+2*y; returnz;}floatRect::area()//定義求面積函數(shù){ floatz;z=x*y; returnz;}5/1/20231075.1.1對象的定義voidmain() //主程序{RectObj1,Obj2;//定義兩個長方形對象Obj1和Obj2Obj1.set(135,86); //對象Obj1賦值Obj2.set(62.2,27.5);//對象Obj1賦值cout<<"長方形1的周長為:"<<Obj1.peri()<<",面積為:"<<Obj1.area()<<endl;cout<<"長方形2的周長為:"<<Obj2.peri()<<",面積為:"<<Obj2.area()<<endl;}運行結(jié)果為:長方形1的周長為:442,面積為:11610長方形2的周長為:179.4,面積為:1710.55/1/2023108

5.1.1對象的定義例5.2的長方形類可以定義為: classRect{//定義長方形類Rect floatx,y;//省略了private關(guān)鍵字,在public前都是私有成員 public://公有成員 voidset(floata=0,floatb=0);//設(shè)置長和寬函數(shù),缺省長和寬都為0 floatperi(); //求周長函數(shù)floatarea();//求面積函數(shù)};5/1/20231095.1.1對象的定義同例5.2一樣數(shù)據(jù)成員x、y是私有成員。例5.1省略private關(guān)鍵字后,Date類定義為:classDate{ intYear,Month,Day; public: voidSet(inty,intm,intd); voidDisplay();};Year、Month和Day仍然是私有的數(shù)據(jù)成員。

5/1/20231105.1.2構(gòu)造函數(shù)要創(chuàng)立一個對象,一般要將對象中的數(shù)據(jù)成員進(jìn)行初始化和為對象申請必要的存儲空間。在聲明對象的同時可以指定數(shù)據(jù)成員的初始值,對象如普通變量一樣,在聲明后立即將指定的初始值寫入。C++為對象的初始化提供了必要的機制,可以讓用戶編寫初始化程序,就是構(gòu)造函數(shù)。5/1/20231115.1.2構(gòu)造函數(shù)構(gòu)造函數(shù)的作用就是在對象被創(chuàng)立時利用特定的值構(gòu)造對象,將對象初始化為一個特定的狀態(tài),使此對象具有區(qū)別于其它對象的特征。構(gòu)造函數(shù)在對象被創(chuàng)立的時候由系統(tǒng)自動調(diào)用。構(gòu)造函數(shù)也是類的一個成員函數(shù),構(gòu)造函數(shù)的函數(shù)名與類名相同,而且不能有任何返回類型,也不能標(biāo)為void類型。構(gòu)造函數(shù)一般被聲明為公有函數(shù),構(gòu)造函數(shù)也可以重載。5/1/20231125.1.2構(gòu)造函數(shù)應(yīng)用構(gòu)造函數(shù)定義對象,其語法結(jié)構(gòu)為:<類名><對象名>(<構(gòu)造函數(shù)的參數(shù)表>);比不用構(gòu)造函數(shù)時多了一個構(gòu)造函數(shù)的參數(shù)表,實際上,不用構(gòu)造函數(shù)定義對象就是自動調(diào)用無參數(shù)構(gòu)造函數(shù),所以,編制構(gòu)造函數(shù)以后,定義對象就必須具有與構(gòu)造函數(shù)一致的參數(shù)表。5/1/20231135.1.2構(gòu)造函數(shù)【例5.3】設(shè)計一個設(shè)置和顯示日期的程序,日期類中要使用構(gòu)造函數(shù)。編制這個程序的思路與例5.1相同。程序如下:classDate{//定義類 intYear,Month,Day; public: Date(inty,intm,intd);//構(gòu)造函數(shù) voidSet(inty,intm,intd); voidDisplay();};//實現(xiàn)類的成員函數(shù)5/1/2023114Date::Date(inty,intm,intd)//這是構(gòu)造函數(shù){ Year=y; //設(shè)置年份 Month=m; //設(shè)置月份 Day=d; //設(shè)置日} //構(gòu)造函數(shù)結(jié)束voidDate::Set(inty,intm,intd){ Year=y; //設(shè)置年份 Month=m; //設(shè)置月份 Day=d; //設(shè)置日} //設(shè)置日期函數(shù)結(jié)束5.1.2構(gòu)造函數(shù)5/1/2023115voidDate::Display(){ cout<<"日期為:"<<endl;//顯示“日期為:〞,回車 cout<<"\t"<<Year<<"年";//空幾格后,顯示年份 cout<<Month<<"月";//顯示月份 cout<<Day<<"日"<<endl//顯示日,回車}5.1.2構(gòu)造函數(shù)5/1/20231165.1.2構(gòu)造函數(shù)voidmain()//編制主程序{ DateMyDate(2021,1,1);//定義日期對象MyDate,初值為2021年1月1日 cout<<"第1次顯示初值的日期:"<<endl; MyDate.Display();//顯示日期 MyDate.Set(2021,10,15);//設(shè)置日期 cout<<"第2次顯示設(shè)置的日期:"<<endl; MyDate.Display();//顯示日期 MyDate.Set(2021,11,9);//設(shè)置日期 cout<<"第3次顯示設(shè)置的日期:"<<endl; MyDate.Display();//顯示日期}5/1/20231175.1.2構(gòu)造函數(shù)運行結(jié)果為:第1次顯示初值的日期:日期為:2021年1月1日第2次顯示設(shè)置的日期:日期為:2021年10月15日第3次顯示設(shè)置的日期:日期為:2021年11月9日構(gòu)造函數(shù)的參數(shù)也可以帶缺省值。5/1/20231185.1.2構(gòu)造函數(shù)

【例5.4】定義一個關(guān)于長方形的類,編制求長方型周長和面積的程序,長78.5寬52長方形的對象Obj1,定義長56.8、寬35.7長方形的對象Obj2,求出它們的周長和面積。長方形類定義如下:5/1/20231195.1.2構(gòu)造函數(shù)classRect{ //定義長方形類Rectfloatx,y;//實型數(shù)據(jù)長x和寬y public://公有成員 Rect(floata=1,floatb=1){x=a;y=b;}//構(gòu)造函數(shù)在類中實現(xiàn) voidset(floata=0,floatb=0){x=a;y=b;}//設(shè)置長和寬函數(shù),缺省長和寬都為0 floatperi(); //求周長函數(shù)floatarea(); //求面積函數(shù)};5/1/20231205.1.2構(gòu)造函數(shù)floatRect::peri()//定義求周長函數(shù){ floatz; z=2*x+2*y; returnz;}floatRect::area() //定義求面積函數(shù){ floatz; z=x*y; returnz;}5/1/20231215.1.2構(gòu)造函數(shù)voidmain() //主程序{ RectObj1(78.5,52),Obj2; //定義兩個長方形對象Obj1和Obj2 cout<<"第1次計算結(jié)果:"<<endl; cout<<"長方形1的周長為:"<<Obj1.peri()<<",面積為:"<<Obj1.area()<<endl; cout<<"長方形2的周長為:"<<Obj2.peri()<<",面積為:"<<Obj2.area()<<endl; cout<<"第2次計算結(jié)果:"<<endl; Obj1.set(78.5,52); //對象Obj1賦值 Obj2.set(56.8,35.7); //對象Obj1賦值 cout<<"長方形1的周長為:"<<Obj1.peri()<<",面積為:"<<Obj1.area()<<endl; cout<<"長方形2的周長為:"<<Obj2.peri()<<",面積為:"<<Obj2.area()<<endl;}5/1/20231225.1.2構(gòu)造函數(shù)運行結(jié)果為:第1次計算結(jié)果:長方形1的周長為:261,面積為:4082長方形2的周長為:4,面積為:1第2次計算結(jié)果:長方形1的周長為:261,面積為:4082長方形2的周長為:185,面積為:2027.76建立Obj2時,用了構(gòu)造函數(shù)的缺省值長為1并且寬也為1。

5/1/20231235.1.2構(gòu)造函數(shù)【例5.5】應(yīng)用例5.4定義的長方形類Rect,定義一個對象數(shù)組,并且測試這個數(shù)組對象的功能。程序如下:voidmain() //主程序{ RectObj[6]; //定義一個長方形對象數(shù)組Obj[6] cout<<"使用缺省構(gòu)造函數(shù)的計算結(jié)果:"<<endl; for(inti=0;i<6;i++) cout<<"長方形"<<i+1<<"的周長為:"<<Obj[i].peri()<<",面積為:"<<Obj[i].area()<<endl;5/1/20231245.1.2構(gòu)造函數(shù)for(i=0;i<6;i++) Obj[i].set(i+30,i+20); //對象Obj1賦值 cout<<"賦值后的計算結(jié)果:"<<endl;for(i=0;i<6;i++) cout<<"長方形"<<i+1<<"的周長為:"<<Obj[i].peri()<<",面積為:"<<Obj[i].area()<<endl;}5/1/20231255.1.2構(gòu)造函數(shù)運行結(jié)果為:使用缺省構(gòu)造函數(shù)的計算結(jié)果:長方形1的周長為:4,面積為:1長方形2的周長為:4,面積為:1長方形3的周長為:4,面積為:1長方形4的周長為:4,面積為:1長方形5的周長為:4,面積為:1長方形6的周長為:4,面積為:15/1/20231265.1.2構(gòu)造函數(shù)賦值后的計算結(jié)果:長方形1的周長為:100,面積為:600長方形2的周長為:104,面積為:651長方形3的周長為:108,面積為:704長方形4的周長為:112,面積為:759長方形5的周長為:116,面積為:816長方形6的周長為:120,面積為:8755/1/20231275.1.2構(gòu)造函數(shù)【例5.6】利用構(gòu)造函數(shù)重載定義一個關(guān)于圓的類,編制求圓的周長和面積的程序,舉例定義圓對象,求出它們的周長和面積。圓的類定義如下:classCircle{//定義圓類Circlefloatr;//圓的半徑public://公有成員 Circle(){r=0;} //無參數(shù)的構(gòu)造函數(shù) Circle(floatx){r=x;}//帶一個參數(shù)的構(gòu)造函數(shù)voidset(floatx){r=x;} //設(shè)置半徑5/1/20231285.1.2構(gòu)造函數(shù)floatperi(){return(r*2*3.1416);}//求周長函數(shù)floatarea(){return(r*r*3.1416);}//求面積函數(shù)};voidmain() //主程序{ CircleObj1(25.6),Obj2;//定義兩個圓對象Obj1和Obj2cout<<"第1次計算結(jié)果:"<<endl;cout<<"圓1的周長為:"<<Obj1.peri()<<",面積為:"<<Obj1.area()<<endl;5/1/20231295.1.2構(gòu)造函數(shù)cout<<"圓2的周長為:"<<Obj2.peri()<<",面積為:"<<Obj2.area()<<endl;Obj1.set(42.3); //對象Obj1賦值Obj2.set(36.8); //對象Obj1賦值cout<<"第2次計算結(jié)果:"<<endl;cout<<"圓1的周長為:"<<Obj1.peri()<<",面積為:"<<Obj1.area()<<endl; cout<<"圓2的周長為:"<<Obj2.peri()<<",面積為:"<<Obj2.area()<<endl;}5/1/20231305.1.2構(gòu)造函數(shù)運行結(jié)果為:第1次計算結(jié)果:圓1的周長為:160.85,面積為:2058.88圓2的周長為:0,面積為:0第2次計算結(jié)果:圓1的周長為:265.779,面積為:5621.23圓2的周長為:231.222,面積為:4254.48從計算結(jié)果可以看出,Obj1(25.6)使用的是有參構(gòu)造函數(shù),Obj2使用的是無參構(gòu)造函數(shù)。5/1/20231315.1.2構(gòu)造函數(shù)構(gòu)造函數(shù)的特點如下:(1)構(gòu)造函數(shù)是特殊的成員函數(shù),該函數(shù)的名字與類名相同,該函數(shù)不能指定返回類型;(2)構(gòu)造函數(shù)可以重載,即可以定義多個參數(shù)個數(shù)不同或參數(shù)類型不同的構(gòu)造函數(shù);(3)構(gòu)造函數(shù)在定義對象時被直接調(diào)用,程序中不能直接調(diào)用構(gòu)造函數(shù)。5/1/20231325.1.3析構(gòu)函數(shù)析構(gòu)函數(shù)是對象的生命期結(jié)束時要執(zhí)行的一段程序,用來完成對象被刪除前的一些清理工作。析構(gòu)函數(shù)的名稱和類名相同,在類名前面加上一個波浪號‘~’。析構(gòu)函數(shù)同構(gòu)造函數(shù)一樣,不能有任何返回類型,也不能有void類型。析構(gòu)函數(shù)是無參函數(shù),不能重載,一個類只能有一個析構(gòu)函數(shù)。5/1/20231335.1.3析構(gòu)函數(shù)【例5.7】建立一個表示人的根本信息的類,包括身份證號碼、姓名、性別、年齡等信息,能夠進(jìn)行設(shè)置和顯示操作,編寫程序驗證人的對象。關(guān)于人的類起名為Person,其類定義如下:#include<iostream.h>#include<string.h> //這里要用到string.h頭文件處理字符串5/1/20231345.1.3析構(gòu)函數(shù)classPerson{ charnumber[20];//number表示身份證號碼 charname[9];//number表示姓名 charsex;//字符型性別 intage;//整型年齡 public: Person(char*,char*,char,int);//構(gòu)造函數(shù),省略了參數(shù)的變量標(biāo)識符 voidset(char*,char*,char,int); //設(shè)置身份號、姓名、性別和年齡5/1/20231355.1.3析構(gòu)函數(shù)voidprint();//顯示身份證號、姓名、性別和年齡 ~Person(){cout<<"執(zhí)行析構(gòu)函數(shù)";} //析構(gòu)函數(shù),不能有參數(shù)};Person::Person(char*s1,char*s2,chars,inta){ strcpy(number,s1); strcpy(name,s2); sex=s; age=a;}5/1/20231365.1.3析構(gòu)函數(shù)voidPerson::set(char*s1,char*s2,chars,inta){ strcpy(number,s1); strcpy(name,s2); sex=s; age=a;}5/1/20231375.1.3析構(gòu)函數(shù)voidPerson::print(){ cout<<"身份證號碼:"<<number<<"\t姓名:"<<name; if(sex=='M')cout<<"\t性別:男"; elsecout<<"\t性別:女"; cout<<"\t年齡:"<<age<<endl;}voidmain()謝強",'M',40);5/1/20231385.1.3析構(gòu)函數(shù) 周敏",'F',35); p1.print(); p2.print();趙福",'M',29);錢英",'F',20); p1.print(); p2.print();}5/1/20231395.1.3析構(gòu)函數(shù)運行結(jié)果為:身份證號碼:姓名:謝強性別:男年齡:40身份證號碼:姓名:周敏性別:女年齡:35身份證號碼:姓名:趙福性別:男年齡:29身份證號碼:姓名:錢英性別:女年齡:20執(zhí)行析構(gòu)函數(shù)執(zhí)行析構(gòu)函數(shù)5/1/20231405.1.3析構(gòu)函數(shù)【例5.8】分析以下程序的執(zhí)行結(jié)果。classPoint{ floatx,y;public: Point() { x=0; y=0; cout<<"執(zhí)行Point()構(gòu)造函數(shù)"<<endl; }5/1/20231415.1.3析構(gòu)函數(shù)Point(floata,floatb){ x=a;y=b; cout<<"執(zhí)行Point(floata,floatb)構(gòu)造函數(shù)"<<endl;}~Point(){cout<<’(‘<<x<<’,’<<y<<")執(zhí)行析構(gòu)函數(shù)"<<endl;} voidSet(floata=0,floatb=0){x=a;y=b;} voidDisplay(){cout<<"點的位置是;("<<x<<’,’<<y<<")\n";}}; //所有成員函數(shù)都在類中定義5/1/20231425.1.3析構(gòu)函數(shù)voidmain(){ Pointa,b(3,5); a.Display(); b.Display(); a.Set(6,8); b.Set(12.5,25.37); a.Display(); b.Display();}5/1/20231435.1.3析構(gòu)函數(shù)運行結(jié)果為:執(zhí)行Point()構(gòu)造函數(shù)執(zhí)行Point(floata,floatb)構(gòu)造函數(shù)點的位置是;(0,0)點的位置是;(3,5)點的位置是;(6,8)點的位置是;(12.5,25.37)(12.5,25.37)執(zhí)行析構(gòu)函數(shù)(6,8)執(zhí)行析構(gòu)函數(shù)5/1/20231445.1.3析構(gòu)函數(shù)【例5.9】分析以下程序的執(zhí)行結(jié)果。voidmain(){ Pointa(4,6);//Point類在例5.8中定義 a.Display(); { cout<<"進(jìn)入了程序塊\n"; Pointb(3,5); a.Display(); b.Display(); }5/1/20231455.1.3析構(gòu)函數(shù)cout<<"退出了程序塊\n"; a.Display();// b.Display(); 假設(shè)加了這一句,那么出錯顯示'b':undeclaredidentifier}運行結(jié)果為:執(zhí)行Point(floata,floatb)構(gòu)造函數(shù)點的位置是;(4,6)進(jìn)入了程序塊執(zhí)行Point(floata,floatb)構(gòu)造函數(shù)5/1/20231465.1.3析構(gòu)函數(shù)點的位置是;(4,6)點的位置是;(3,5)(3,5)執(zhí)行析構(gòu)函數(shù)退出了程序塊點的位置是;(4,6)(4,6)執(zhí)行析構(gòu)函數(shù)5/1/20231475.1.3析構(gòu)函數(shù)析構(gòu)函數(shù)的特點如下:(1)析構(gòu)函數(shù)是特殊的成員函數(shù),該函數(shù)的名字為波浪號‘~’后面跟著類名,該函數(shù)不能指定返回類型,也不能有參數(shù);(2)一個類只能定義一個析構(gòu)函數(shù);(3)析構(gòu)函數(shù)在對象生命期結(jié)束時被直接調(diào)用,程序中一般不要調(diào)用析構(gòu)函數(shù)。5/1/20231485.2.對象的賦值面向?qū)ο蟪绦蛟O(shè)計如實反響了現(xiàn)實世界解決問題的本來面目,對象的復(fù)制是C++程序設(shè)計的重要能力。5/1/20231495.2.1復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)是一個特殊的構(gòu)造函數(shù),具有一般構(gòu)造函數(shù)的所有特性,它只有一個參數(shù),參數(shù)類型是本類對象的引用。其功能應(yīng)該設(shè)計為將對象的值復(fù)制

溫馨提示

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

最新文檔

評論

0/150

提交評論