![Visual-C++面向?qū)ο蟪绦蛟O(shè)計(jì)教程和實(shí)驗(yàn)第二版清華大學(xué)出版社1-8章答案及解析_第1頁(yè)](http://file4.renrendoc.com/view/2960e8d4e6a078dc6ea0ff4addac1ede/2960e8d4e6a078dc6ea0ff4addac1ede1.gif)
![Visual-C++面向?qū)ο蟪绦蛟O(shè)計(jì)教程和實(shí)驗(yàn)第二版清華大學(xué)出版社1-8章答案及解析_第2頁(yè)](http://file4.renrendoc.com/view/2960e8d4e6a078dc6ea0ff4addac1ede/2960e8d4e6a078dc6ea0ff4addac1ede2.gif)
![Visual-C++面向?qū)ο蟪绦蛟O(shè)計(jì)教程和實(shí)驗(yàn)第二版清華大學(xué)出版社1-8章答案及解析_第3頁(yè)](http://file4.renrendoc.com/view/2960e8d4e6a078dc6ea0ff4addac1ede/2960e8d4e6a078dc6ea0ff4addac1ede3.gif)
![Visual-C++面向?qū)ο蟪绦蛟O(shè)計(jì)教程和實(shí)驗(yàn)第二版清華大學(xué)出版社1-8章答案及解析_第4頁(yè)](http://file4.renrendoc.com/view/2960e8d4e6a078dc6ea0ff4addac1ede/2960e8d4e6a078dc6ea0ff4addac1ede4.gif)
![Visual-C++面向?qū)ο蟪绦蛟O(shè)計(jì)教程和實(shí)驗(yàn)第二版清華大學(xué)出版社1-8章答案及解析_第5頁(yè)](http://file4.renrendoc.com/view/2960e8d4e6a078dc6ea0ff4addac1ede/2960e8d4e6a078dc6ea0ff4addac1ede5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
..第一章1.什么是面向?qū)ο蟪绦蛟O(shè)計(jì)?它與傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)有什么不同?面向?qū)ο蟪绦蛟O(shè)計(jì)既吸取了結(jié)構(gòu)化程序設(shè)計(jì)的一切優(yōu)點(diǎn),又考慮了現(xiàn)實(shí)世界與面向?qū)ο蠼饪臻g的映射關(guān)系,它所追求的目標(biāo)是將現(xiàn)實(shí)世界的問(wèn)題求解盡可能簡(jiǎn)單化。面向?qū)ο蟪绦蛟O(shè)計(jì)將數(shù)據(jù)及對(duì)數(shù)據(jù)的操作放在一起,作為一個(gè)相互依存、不可分割的整體來(lái)處理,它采用了數(shù)據(jù)抽象和信息隱藏技術(shù)。它將對(duì)象及對(duì)對(duì)象的操作抽象成一種新的數(shù)據(jù)類型—類,并且考慮不同對(duì)象之間的聯(lián)系和對(duì)象所在類的重要性。面向?qū)ο蟪绦蛟O(shè)計(jì)優(yōu)于傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì),其優(yōu)越性表現(xiàn)在,它有希望解決軟件工程的兩個(gè)主要的問(wèn)題——軟件復(fù)雜性控制和軟件生產(chǎn)率的提高,此外它還符合人類的思維習(xí)慣,能夠自然地表現(xiàn)現(xiàn)實(shí)世界的實(shí)體和問(wèn)題,它對(duì)軟件開(kāi)發(fā)過(guò)程具有重要的意義。在面向?qū)ο蟪绦蛟O(shè)計(jì)中可以用下面的式子表示程序:程序=對(duì)象+對(duì)象+…+對(duì)象對(duì)象=算法+數(shù)據(jù)結(jié)構(gòu)+程序設(shè)計(jì)語(yǔ)言+語(yǔ)言環(huán)境在結(jié)構(gòu)化程序設(shè)計(jì)中可以用下面的式子表示程序:程序=數(shù)據(jù)結(jié)構(gòu)+算法+程序設(shè)計(jì)語(yǔ)言+語(yǔ)言環(huán)境2.面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言有哪幾類?<1>LISP家族LISP是50年代開(kāi)發(fā)出來(lái)的一種語(yǔ)言,它以表處理為特色,是一種人工智能語(yǔ)言,70年代以來(lái),在LISP基礎(chǔ)上開(kāi)發(fā)了很多LISP家族的面向?qū)ο笳Z(yǔ)言。<2>SimulaSimula語(yǔ)言是60年代開(kāi)發(fā)出來(lái)的,在Simula中引入了幾個(gè)面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言中最重要的概念和特性,即數(shù)據(jù)抽象、類和繼承性機(jī)制。Simula67是它具有代表性的一個(gè)版本,70年代發(fā)展起來(lái)的CLU,Ada,Modula-2等語(yǔ)言是在它的基礎(chǔ)上發(fā)展起來(lái)的。<3>SmalltalkSmalltalk是第一個(gè)真正的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,它體現(xiàn)了純粹的OOP設(shè)計(jì)思想,是最純的OOP語(yǔ)言。它起源于Simula語(yǔ)言。盡管Smalltalk不斷完善,但在那個(gè)時(shí)期,面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言并沒(méi)有得到廣泛的重視,程序設(shè)計(jì)的主流是結(jié)構(gòu)化程序設(shè)計(jì)。<4>C家族在19世紀(jì)80年代,C語(yǔ)言成為一種極其流行、應(yīng)用非常廣泛的語(yǔ)言。C++是在C語(yǔ)言的基礎(chǔ)上進(jìn)行擴(kuò)充,并增加了類似Smalltalk語(yǔ)言中相應(yīng)的對(duì)象機(jī)制。它將"類"看作是用戶定義類型,使其擴(kuò)充比較自然。C++以其高效的執(zhí)行效率贏得了廣大程序設(shè)計(jì)員的青睞,在C++中提供了對(duì)C語(yǔ)言的兼容性,因此,很多已有的C程序稍加改造甚至不加改造就可以重用,許多有效的算法也可以重新利用。它是一種混合型的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,由于它的出現(xiàn),才使面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言越來(lái)越得到重視和廣泛的應(yīng)用。JAVA語(yǔ)言是一種適用于分布式計(jì)算的新型面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,可以看作是C++語(yǔ)言的派生,它從C++語(yǔ)言中繼承了大量的語(yǔ)言成分,拋棄了C++語(yǔ)言中冗余的、容易引起問(wèn)題的功能,增加了多線程、異常處理、網(wǎng)絡(luò)程序設(shè)計(jì)等方面的支持,掌握了C++語(yǔ)言,可以很快學(xué)會(huì)JAVA語(yǔ)言。3.面向?qū)ο笙到y(tǒng)有哪些特性?分別加以解釋。<1>抽象性〔abstract抽象是一種從一般的觀點(diǎn)看待事物的方法,它要求程序員集中于事物的本質(zhì)特征,而不是具體細(xì)節(jié)或具體實(shí)現(xiàn)。類的概念來(lái)自人們認(rèn)識(shí)自然、認(rèn)識(shí)社會(huì)的過(guò)程。在這一過(guò)程中,人們主要使用兩種方法:從特殊到一般的歸納法和從一般到特殊的演繹法。在歸納的過(guò)程中,我們從一個(gè)個(gè)具體的事物中把共同的特征抽取出來(lái),形成一個(gè)一般的概念,這就是"歸類";在演繹的過(guò)程中,我們又把同類的事物,根據(jù)不同的特征分成不同的小類,這就是"分類"。對(duì)于一個(gè)具體的類,它有許多具體的個(gè)體,我們稱這些個(gè)體叫做"對(duì)象"。<2>封裝性〔encapsulation>所謂數(shù)據(jù)封裝就是指一組數(shù)據(jù)和與這組數(shù)據(jù)有關(guān)的操作集合組裝在一起,形成一個(gè)能動(dòng)的實(shí)體,也就是對(duì)象。數(shù)據(jù)封裝就是給數(shù)據(jù)提供了與外界聯(lián)系的標(biāo)準(zhǔn)接口,無(wú)論是誰(shuí),只有通過(guò)這些接口,使用規(guī)范的方式,才能訪問(wèn)這些數(shù)據(jù)。數(shù)據(jù)封裝是軟件工程發(fā)展的必然產(chǎn)物,使得程序員在設(shè)計(jì)程序時(shí)可以專注于自己的對(duì)象,同時(shí)也切斷了不同模塊之間數(shù)據(jù)的非法使用,減少了出錯(cuò)的可能性。<3>繼承性〔inheritance從已有的對(duì)象類型出發(fā)建立一種新的對(duì)象類型,使它繼承原對(duì)象的特點(diǎn)和功能,這種思想是面向?qū)ο笤O(shè)計(jì)方法的主要貢獻(xiàn)。繼承是對(duì)許多問(wèn)題中分層特性的一種自然描述,因而也是類的具體化和被重新利用的一種手段,它所表達(dá)的就是一種對(duì)象類之間的相交關(guān)系。它使得某類對(duì)象可以繼承另外一類對(duì)象的特征和能力。繼承所具有的作用有兩個(gè)方面:一方面可以減少代碼冗余;另一方面可以通過(guò)協(xié)調(diào)性來(lái)減少相互之間的接口和界面。<4>多態(tài)性<polymorphism>不同的對(duì)象接收到相同的消息時(shí)產(chǎn)生多種完全不同的行為的現(xiàn)象稱為多態(tài)性。C++語(yǔ)言支持兩種多態(tài)性即編譯時(shí)的多態(tài)性和運(yùn)行時(shí)的多態(tài)性。編譯時(shí)的多態(tài)性通過(guò)重載函數(shù)實(shí)現(xiàn),而運(yùn)行時(shí)的多態(tài)性通過(guò)虛函數(shù)實(shí)現(xiàn)。使用多態(tài)性可以大大提高了我們解決復(fù)雜問(wèn)題的能力。4.解釋類、對(duì)象、消息和方法的概念。<1>類<class>在面向?qū)ο笙到y(tǒng)中,并不是將各個(gè)具體的對(duì)象都進(jìn)行描述,而是忽略其非本質(zhì)的特性,找出其共性,將對(duì)象劃分成不同的類,這一過(guò)程為抽象過(guò)程。類是對(duì)象的抽象及描述,是具有共同屬性和操作的多個(gè)對(duì)象的相似特性的統(tǒng)一描述體。在類的描述中,每個(gè)類要有一個(gè)名字標(biāo)識(shí),用以表示一組對(duì)象的共同特征。類中的每個(gè)對(duì)象都是該類的實(shí)例。類提供了完整的解決特定問(wèn)題的能力,因?yàn)轭惷枋隽藬?shù)據(jù)結(jié)構(gòu)〔對(duì)象屬性、算法〔服務(wù)、方法和外部接口〔消息協(xié)議,是一種用戶自定義的數(shù)據(jù)類型。<2>對(duì)象〔object在面向?qū)ο笙到y(tǒng)中,對(duì)象是系統(tǒng)中用來(lái)描述客觀事物的一個(gè)實(shí)體,它是構(gòu)成系統(tǒng)的一個(gè)基本單位。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的一組服務(wù)構(gòu)成。屬性和服務(wù)是構(gòu)成對(duì)象的兩個(gè)主要因素,屬性是一組數(shù)據(jù)機(jī)構(gòu)的集合,表示對(duì)象的一種狀態(tài),對(duì)象的狀態(tài)只供對(duì)象自身使用,用來(lái)描述靜態(tài)特性,而服務(wù)是用來(lái)描述對(duì)象動(dòng)態(tài)特征〔行為的一個(gè)操作序列,是對(duì)象一組功能的體現(xiàn)。對(duì)象是類的實(shí)例。<3>消息<message>消息是面向?qū)ο笙到y(tǒng)中實(shí)現(xiàn)對(duì)象間的通信和請(qǐng)求任務(wù)的操作,是要求某個(gè)對(duì)象執(zhí)行其中某個(gè)功能操作的規(guī)格說(shuō)明。發(fā)送消息的對(duì)象稱為發(fā)送者,接受消息的對(duì)象稱為接收者。對(duì)象間的聯(lián)系,只能通過(guò)消息來(lái)進(jìn)行。對(duì)象在接收到消息時(shí)才被激活。<4>方法〔method在面向?qū)ο蟪绦蛟O(shè)計(jì)中,要求某一對(duì)象做某一操作時(shí),就向?qū)ο蟀l(fā)送一個(gè)相應(yīng)的消息,當(dāng)對(duì)象接收到發(fā)向它的消息時(shí),就調(diào)用有關(guān)的方法,執(zhí)行相應(yīng)的操作。方法就是對(duì)象所能執(zhí)行的操作。方法包括界面和方法體兩部分。方法的界面就是消息的模式,它給出了方法的調(diào)用協(xié)議;方法體則是實(shí)現(xiàn)某種操作的一系列計(jì)算步驟,也就是一段程序。消息和方法的關(guān)系是:對(duì)象根據(jù)接收到的消息,調(diào)用相應(yīng)的方法;反過(guò)來(lái),有了方法,對(duì)象才能響應(yīng)相應(yīng)的消息。所以消息模式與方法界面應(yīng)該是一致的。同時(shí),只要方法界面保持不變,方法體的改動(dòng)不會(huì)影響方法的調(diào)用。在C++語(yǔ)言中方法是通過(guò)函數(shù)來(lái)實(shí)現(xiàn)的,稱為成員函數(shù)。第二章1.分析下列程序的執(zhí)行結(jié)果:輸出隨機(jī)數(shù)2.分析下列程序的執(zhí)行結(jié)果:i=03.C++語(yǔ)言對(duì)C語(yǔ)言在結(jié)構(gòu)化程序設(shè)計(jì)方面進(jìn)行了哪些擴(kuò)充?主要在以下方面進(jìn)行了擴(kuò)充:文件擴(kuò)展名、注釋符、名字空間、輸入輸出、變量的定義、強(qiáng)制類型轉(zhuǎn)換、動(dòng)態(tài)內(nèi)存的分配與釋放、作用域運(yùn)算符::、引用、const修飾符、字符串、函數(shù)4.下述C++程序有若干處錯(cuò)誤,試找出并糾正之。正確程序?yàn)椋?include<iostream.h>constfloatPAI=3.14159265;丟失分號(hào)丟失分號(hào)floatsquare<floatr>{returnPAI*r*r;}floatsquare<floathigh,float丟失float數(shù)據(jù)類型length=0此處去掉了丟失float數(shù)據(jù)類型此處去掉了.{returnhigh*length;}float<*fs><float,float=0>;voidmain<>{fs=□cout<<"Thecircle'ssquareis"<<fs<1.0>此處調(diào)用的是求長(zhǎng)方形面積的函數(shù),求出的面積為0,而并不是求圓的面積<<'\n';此處調(diào)用的是求長(zhǎng)方形面積的函數(shù),求出的面積為0,而并不是求圓的面積}5.引用類型與指針類型有什么區(qū)別?指針的內(nèi)容或值是某一變量的內(nèi)存單元地址,而引用則與初始化它的變量具有相同的內(nèi)存單元地址。指針是個(gè)變量,可以把它再賦值成其它的地址,然而,建立引用時(shí)必須進(jìn)行初始化并且決不會(huì)再指向其它不同的變量。C++沒(méi)有提供訪問(wèn)引用本身地址的方法,因?yàn)樗c指針或其它變量的地址不同,它沒(méi)有任何意義。引用總是作為變量的別名使用,引用的地址也就是變量的地址。引用一旦初始化,就不會(huì)與初始化它的變量分開(kāi)。6.函數(shù)、內(nèi)聯(lián)函數(shù)以及宏的區(qū)別。程序的模塊在C++中通過(guò)函數(shù)來(lái)實(shí)現(xiàn),函數(shù)由函數(shù)說(shuō)明和函數(shù)體2部分組成。內(nèi)聯(lián)函數(shù)是C++語(yǔ)言特有的一種函數(shù)附加類別,是通過(guò)在函數(shù)聲明之前插入"inline"關(guān)鍵字實(shí)現(xiàn)的。編譯器會(huì)將編譯后的全部?jī)?nèi)聯(lián)函數(shù)的目的機(jī)器代碼復(fù)制到程序內(nèi)所有的引用位置并把往返傳送的數(shù)據(jù)也都溶合進(jìn)引用位置的計(jì)算當(dāng)中,用來(lái)避免函數(shù)調(diào)用機(jī)制所帶來(lái)的開(kāi)銷,提高程序的執(zhí)行效率。顯然這是以增加程序代碼空間為代價(jià)換來(lái)的。宏定義是編譯預(yù)處理命令,分為帶參數(shù)的和不帶參數(shù)的宏定義。在編譯之前進(jìn)行預(yù)處理時(shí),用宏定義中的字符串替換程序中所有出現(xiàn)的宏名。7.函數(shù)重載有什么好處?函數(shù)重載使函數(shù)方便使用,便于記憶,也使程序設(shè)計(jì)更加靈活,增加程序的可讀性。例如,求兩個(gè)數(shù)中最大值的函數(shù)max,不管其參數(shù)是整數(shù)類型、實(shí)數(shù)類型、字符串,都可以使用同名函數(shù)來(lái)實(shí)現(xiàn),調(diào)用時(shí)只需使用max就可以了,編譯器將根據(jù)實(shí)參的類型判斷應(yīng)該調(diào)用哪一個(gè)函數(shù)。8.模板有什么作用?函數(shù)模板和模板函數(shù)有什么區(qū)別?所謂模板是一種使用無(wú)類型參數(shù)來(lái)產(chǎn)生一系列函數(shù)或類的機(jī)制,是C++的一個(gè)重要特征。通過(guò)模板可以產(chǎn)生類或函數(shù)的集合,使它們操作不同的數(shù)據(jù)類型,從而避免為每一種數(shù)據(jù)類型產(chǎn)生一個(gè)單獨(dú)的類或函數(shù)。函數(shù)模板提供了傳遞類型的機(jī)制。函數(shù)模板定義不是一個(gè)實(shí)實(shí)在在的函數(shù),編譯系統(tǒng)不為其產(chǎn)生任何執(zhí)行代碼。該定義只是對(duì)函數(shù)的描述,表示它每次能單獨(dú)處理在類型形式參數(shù)表中說(shuō)明的數(shù)據(jù)類型。函數(shù)模板只是說(shuō)明,不能直接執(zhí)行,需要實(shí)例化為模板函數(shù)后才能執(zhí)行。當(dāng)編譯系統(tǒng)發(fā)現(xiàn)有一個(gè)函數(shù)調(diào)用:<函數(shù)名><實(shí)參表>;時(shí),將根據(jù)<實(shí)參表>中的類型生成一個(gè)重載函數(shù),即模板函數(shù)。該模板函數(shù)的定義體與函數(shù)模板的函數(shù)定義體相同,而<形參表>的類型則以<實(shí)參表>的實(shí)際類型為依據(jù)。第三章為什么要引入構(gòu)造函數(shù)和析構(gòu)函數(shù)?對(duì)象的初始化是指對(duì)象數(shù)據(jù)成員的初始化,在使用對(duì)象前,一定要初始化。由于數(shù)據(jù)成員一般為私有的<private>,所以不能直接賦值。對(duì)對(duì)象初始化有以下兩種方法:類中提供一個(gè)普通成員函數(shù)來(lái)初始化,但是會(huì)造成使用上的不便〔使用對(duì)象前必須顯式調(diào)用該函數(shù)和不安全<未調(diào)用初始化函數(shù)就使用對(duì)象>。當(dāng)定義對(duì)象時(shí),編譯程序自動(dòng)調(diào)用構(gòu)造函數(shù)。析構(gòu)函數(shù)的功能是當(dāng)對(duì)象被撤消時(shí),釋放該對(duì)象占用的內(nèi)存空間。析構(gòu)函數(shù)的作用與構(gòu)造函數(shù)正好相反,一般情況下,析構(gòu)函數(shù)執(zhí)行構(gòu)造函數(shù)的逆操作。在對(duì)象消亡時(shí),系統(tǒng)將自動(dòng)調(diào)用析構(gòu)函數(shù),執(zhí)行一些在對(duì)象撤消前必須執(zhí)行的清理任務(wù)。2.類的公有、私有和保護(hù)成員之間的區(qū)別是什么?①私有成員private:私有成員是在類中被隱藏的部分,它往往是用來(lái)描述該類對(duì)象屬性的一些數(shù)據(jù)成員,私有成員只能由本類的成員函數(shù)或某些特殊說(shuō)明的函數(shù)〔如第4章講到的友員函數(shù)訪問(wèn),而類的外部根本就無(wú)法訪問(wèn),實(shí)現(xiàn)了訪問(wèn)權(quán)限的有效控制,使數(shù)據(jù)得到有效的保護(hù),有利于數(shù)據(jù)的隱藏,使內(nèi)部數(shù)據(jù)不能被任意的訪問(wèn)和修改,也不會(huì)對(duì)該類以外的其余部分造成影響,使模塊之間的相互作用被降低到最小。private成員若處于類聲明中的第一部分,可省略關(guān)鍵字private。②公有成員public:公有成員對(duì)外是完全開(kāi)放的,公有成員一般是成員函數(shù),它提供了外部程序與類的接口功能,用戶通過(guò)公有成員訪問(wèn)該類對(duì)象中的數(shù)據(jù)。③保護(hù)成員protected:只能由該類的成員函數(shù),友元,公有派生類成員函數(shù)訪問(wèn)的成員。保護(hù)成員與私有成員在一般情況下含義相同,它們的區(qū)別體現(xiàn)在類的繼承中對(duì)產(chǎn)生的新類的影響不同,具體內(nèi)容將在第5章中介紹。缺省訪問(wèn)控制〔未指定private、protected、public訪問(wèn)權(quán)限時(shí),系統(tǒng)認(rèn)為是私有private成員。3.什么是拷貝構(gòu)造函數(shù),它何時(shí)被調(diào)用?拷貝構(gòu)造函數(shù)的功能是用一個(gè)已有的對(duì)象來(lái)初始化一個(gè)被創(chuàng)建的同類對(duì)象,是一種特殊的構(gòu)造函數(shù),具有一般構(gòu)造函數(shù)的所有特性,當(dāng)創(chuàng)建一個(gè)新對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用它;其形參是本類對(duì)象的引用,它的特殊功能是將參數(shù)代表的對(duì)象逐域拷貝到新創(chuàng)建的對(duì)象中。在以下四種情況下系統(tǒng)會(huì)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù):①用類的一個(gè)對(duì)象去初始化另一個(gè)對(duì)象catcat1;catcat2<cat1>;//創(chuàng)建cat2時(shí)系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù),//用cat1初始化cat2。②用類的一個(gè)對(duì)象去初始化另一個(gè)對(duì)象時(shí)的另外一種形式Catcat2=cat1;//注意并非catcat1,cat2;cat2=cat1;③對(duì)象作為函數(shù)參數(shù)傳遞時(shí),調(diào)用拷貝構(gòu)造函數(shù)。f<cata>{}//定義f函數(shù),形參為cat類對(duì)象 catb;//定義對(duì)象b f<b>;//進(jìn)行f函數(shù)調(diào)用時(shí),系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)④如果函數(shù)的返回值是類的對(duì)象,函數(shù)調(diào)用返回時(shí),調(diào)用拷貝構(gòu)造函數(shù)。4.設(shè)計(jì)一個(gè)計(jì)數(shù)器類,當(dāng)建立該類的對(duì)象時(shí)其初始狀態(tài)為0,考慮為計(jì)數(shù)器定義哪些成員?//counter.h#ifndefcounter_h#definecounter_hclasscounter{private: intcount;public: counter<>; voidsetCount<inti>; intgetCount<>; voiddisplayCount<>; voidincrementCount<>; voiddecrementCount<>; ~counter<>{}};#endif//counter.cpp#include"counter.h"#include<iostream.h>counter::counter<>{ count=0;}voidcounter::displayCount<>{ cout<<count<<endl;}intcounter::getCount<>{ returncount;}voidcounter::setCount<inti>{ count=i;}voidcounter::incrementCount<>{ count++;}voidcounter::decrementCount<>{ count--;}//MAIN.CPP#include"counter.h"#include<iostream.h>voidmain<>{ counterc1; c1.displayCount<>; c1.setCount<4>; c1.displayCount<>; for<inti=0;i<=10;i++>{ c1.incrementCount<>; c1.displayCount<>; }}5.定義一個(gè)時(shí)間類,能提供和設(shè)置由時(shí)、分、秒組成的時(shí)間,并編寫出應(yīng)用程序,定義時(shí)間對(duì)象,設(shè)置時(shí)間,輸出該對(duì)象提供的時(shí)間。#include<iostream.h>classTime{ inthour,minute,second;public: Time<inth=0,intm=0,ints=0>{ hour=h; minute=m; second=s; } voidsetHour<inth>{ hour=h; } voidsetMinute<intm>{ minute=m; } voidsetSecond<ints>{ second=s; } voiddisplay<>{ cout<<hour<<":"<<minute<<":"<<second<<endl; }};voidmain<>{ Timet; t.display<>; t.setHour<13>; t.setMinute<15>; t.setSecond<30>; t.display<>;}6.設(shè)計(jì)一個(gè)學(xué)生類student,它具有的私有數(shù)據(jù)成員是:注冊(cè)號(hào)、姓名、數(shù)學(xué)、英語(yǔ)、計(jì)算機(jī)成績(jī);具有的公有成員函數(shù)是:求三門課總成績(jī)的函數(shù)sum;求三門課平均成績(jī)的函數(shù)average;顯示學(xué)生數(shù)據(jù)信息的函數(shù)print;獲取學(xué)生注冊(cè)號(hào)的函數(shù)get_reg_num;設(shè)置學(xué)生數(shù)據(jù)信息的函數(shù)set_stu_inf。編制主函數(shù),說(shuō)明一個(gè)student類對(duì)象的數(shù)組并進(jìn)行全班學(xué)生信息的輸入與設(shè)置,而后求出每一學(xué)生的總成績(jī)、平均成績(jī)、全班學(xué)生總成績(jī)最高分、全班學(xué)生總平均分,并在輸入一個(gè)注冊(cè)號(hào)后,輸出該學(xué)生有關(guān)的全部數(shù)據(jù)信息。#include<iostream>#include<string>usingnamespacestd;classStudent{private: intnum; charname[10]; floatmath; floatenglish; floatcomputer; public: voidset_stu_inf<intn,char*ch,floatm,floate,floatc> { num=n;strcpy<name,ch>;math=m;english=e;computer=c; }floatsum<> { return<math+english+computer>; } floataverage<> { return<math+english+computer>/3; } intget_reg_num<> { returnnum; } voidprint<> { cout<<"學(xué)號(hào):"<<num<<endl <<"姓名:"<<name<<endl <<"數(shù)學(xué):"<<math<<endl <<"英語(yǔ):"<<english<<endl <<"計(jì)算機(jī):"<<computer<<endl <<"總分:"<<sum<><<endl <<"平均分:"<<average<><<endl; }};voidmain<>{Studentstu[50];inti,q,a,z,x,max=0,aver=0;//i為循環(huán)變量,q:學(xué)號(hào);a:數(shù)學(xué)//成績(jī);z:英語(yǔ)成績(jī);x:計(jì)算機(jī)成績(jī) intcount=0;//表示學(xué)生人數(shù) char*we=newchar[10]; //輸入學(xué)生信息 for<;;> { cout<<"請(qǐng)輸入學(xué)生的學(xué)號(hào)、姓名、數(shù)學(xué)成績(jī)、英語(yǔ)成績(jī)、計(jì)算機(jī)成績(jī):<若輸入的學(xué)號(hào)為0則表示退出>"<<endl; cin>>q>>we>>a>>z>>x; if<q==0> break; stu[count++].set_stu_inf<q,we,a,z,x>; if<max>a+z+x>; elsemax=a+z+x; aver+=<a+z+x>; } //輸出所有學(xué)生信息 cout<<"學(xué)生信息為:"<<endl<<endl; for<i=0;i<count;i++>{ stu[i].print<>; cout<<endl; } cout<<"全班學(xué)生總成績(jī)最高分為"<<max<<endl <<"全班學(xué)生總平均分為"<<aver/3<<endl<<endl; cout<<"請(qǐng)輸入要查的學(xué)生的學(xué)號(hào):"<<endl; cin>>q; for<i=0;i<count;i++>{ if<q==stu[i].get_reg_num<>> { cout<<"此學(xué)生信息為:"<<endl; stu[i].print<>; break; } } if<i==count> cout<<"查無(wú)此人"<<endl;}7.模擬棧模型的操作,考慮順序棧和鏈棧兩種形式。鏈棧:#include<iostream.h>classStack//定義堆棧類{structNode{intcontent;Node*next;}*top;public:Stack<>{top=NULL;}//構(gòu)造函數(shù)的定義boolpush<inti>;//壓棧成員函數(shù)的聲明boolpop<int&i>;//彈棧成員函數(shù)的聲明};boolStack::push<inti>//壓棧成員函數(shù)的定義{Node*p=newNode;if<p==NULL>{cout<<"Stackisoverflow.\n";returnfalse;}else{p->content=i;p->next=top;top=p;returntrue;}}boolStack::pop<int&i>//彈棧成員函數(shù)的定義{if<top==NULL>{cout<<"Stackisempty.\n";returnfalse;}else{Node*p=top;top=top->next;i=p->content;deletep;returntrue;}}voidmain<>{Stackst1,st2;//定義對(duì)象st1和st2intx;for<inti=1;i<=5;i++>{st1.push<i>;//壓棧成員函數(shù)的調(diào)用st2.push<i>;//壓棧成員函數(shù)的調(diào)用}cout<<"stack1:"<<endl;for<i=1;i<=3;i++>{st1.pop<x>;//彈棧成員函數(shù)的調(diào)用cout<<x<<endl;}st1.push<20>;for<i=1;i<=4;i++>{if<st1.pop<x>>cout<<x<<endl;elsebreak;}cout<<"stack2:"<<endl;while<st2.pop<x>>cout<<x<<endl;}順序棧采用一維數(shù)組來(lái)實(shí)現(xiàn)。〔略8.寫出下列程序的運(yùn)行結(jié)果:Constructing2211Constructing2010display:2211display:2010Destructing2010Destructing2211第五章什么是類的繼承與派生? 繼承性是面向?qū)ο蟪绦蛟O(shè)計(jì)的第二個(gè)重要特性,通過(guò)繼承實(shí)現(xiàn)了數(shù)據(jù)抽象基礎(chǔ)上的代碼重用。繼承是對(duì)許多問(wèn)題中分層特性的一種自然描述,因而也是類的具體化和被重新利用的一種手段,它所表達(dá)的就是一種對(duì)象類之間的相交關(guān)系。它使得某類對(duì)象可以繼承另外一類對(duì)象的特征和能力。繼承所具有的作用有兩個(gè)方面:一方面可以減少代碼冗余;另一方面可以通過(guò)協(xié)調(diào)性來(lái)減少相互之間的接口和界面。通過(guò)繼承方式定義的子類也稱為派生類。類的三種繼承方式之間的區(qū)別是什么?類的繼承方式有public〔公有繼承、protected〔保護(hù)繼承和private〔私有繼承三種。對(duì)于不同的繼承方式,會(huì)導(dǎo)致基類成員原來(lái)的訪問(wèn)屬性在派生類中有所變化。表5.1列出了不同繼承方式下基類成員訪問(wèn)屬性的變化情況。表5.1不同繼承方式下基類成員的訪問(wèn)屬性訪問(wèn)屬性繼承方式publicprotectedprivatepublicpublicprotected不可訪問(wèn)的protectedprotectedprotected不可訪問(wèn)的privateprivateprivate不可訪問(wèn)的說(shuō)明:該表第1列給出3種繼承方式,第1行給出基類成員的3種訪問(wèn)屬性。其余單元格內(nèi)容為基類成員在派生類中的訪問(wèn)屬性。從表中可以看出:<1>基類的私有成員在派生類中均是不可訪問(wèn)的,它只能由基類的成員訪問(wèn)。<2>在公有繼承方式下,基類中的公有成員和保護(hù)成員在派生類中的訪問(wèn)屬性不變。<3>在保護(hù)繼承方式下,基類中的公有成員和保護(hù)成員在派生類中均為保護(hù)的。<4>在私有繼承方式下,基類中的公有成員和保護(hù)成員在派生類中均為私有的。需要注意的是:保護(hù)成員與私有成員唯一的不同是當(dāng)發(fā)生派生后,處在基類protected區(qū)的成員可被派生類直接訪問(wèn),而私有成員在派生類中是不可訪問(wèn)的。在同一類中私有成員和保護(hù)成員的用法完全一樣。派生類能否直接訪問(wèn)基類的私有成員?若否,應(yīng)如何實(shí)現(xiàn)? 派生類不能直接訪問(wèn)基類的私有成員。 具體實(shí)現(xiàn)方式:<1>在類定義體中增加保護(hù)段為了便于派生類的訪問(wèn),可以將基類私有成員中需提供給派生類訪問(wèn)的部分定義為保護(hù)段成員。保護(hù)段成員可以被它的派生類訪問(wèn),但是對(duì)于外界是隱藏起來(lái)的。這樣,既方便了派生類的訪問(wèn),又禁止外界對(duì)它的派生類訪問(wèn)。這種方式的缺點(diǎn)是在公有派生的情況下,如果把成員設(shè)為保護(hù)訪問(wèn)控制,則為外界訪問(wèn)基類的保護(hù)段成員提供了機(jī)會(huì),而三種派生方式,我們經(jīng)常使用的是公有派生。<2>將需訪問(wèn)基類私有成員的派生類成員函數(shù)聲明為基類的友元這樣派生類中的其它成員函數(shù)均無(wú)權(quán)訪問(wèn)它,外界不可能通過(guò)派生新類來(lái)達(dá)到訪問(wèn)基類私有成員的目的。派生類構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行順序是怎樣的?在多繼承中,派生類構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行順序又是怎樣的?構(gòu)造函數(shù)的執(zhí)行順序:先祖先<基類>、再客人<對(duì)象成員>,后自己<派生類本身>。析構(gòu)函數(shù)的執(zhí)行順序和構(gòu)造函數(shù)正好嚴(yán)格相反:先自己<派生類本身>,再客人<對(duì)象成員>,后祖先<基類>。 在多個(gè)基類之間嚴(yán)格按照派生類定義時(shí)從左到右的順序來(lái)排列先后。而析構(gòu)函數(shù)的調(diào)用順序剛好與構(gòu)造函數(shù)的相反。派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的作用是什么?在下面兩種情況下,必須定義派生類的構(gòu)造函數(shù):派生類本身需要構(gòu)造函數(shù);在定義派生類對(duì)象時(shí),其相應(yīng)的基類對(duì)象需調(diào)用帶有參數(shù)的構(gòu)造函數(shù)。派生類對(duì)象的初始化也是通過(guò)派生類的構(gòu)造函數(shù)實(shí)現(xiàn)的。具體來(lái)說(shuō),就是對(duì)該類的數(shù)據(jù)成員賦初值。派生類析構(gòu)函數(shù)的功能與沒(méi)有繼承關(guān)系的類中析構(gòu)函數(shù)的功能一樣,也是在對(duì)象消亡之前進(jìn)行一些必要的清理工作。多繼承一般應(yīng)用在哪些場(chǎng)合?對(duì)于多重繼承,派生類可以有多個(gè)直接基類。這時(shí)的派生類同時(shí)得到了多個(gè)已有類的特征。在類的派生中為何引入虛基類?在含有虛基類的派生類中,當(dāng)創(chuàng)建它的對(duì)象時(shí),構(gòu)造函數(shù)的執(zhí)行順序如何?當(dāng)在多條繼承路徑上有一個(gè)公共的基類,在這些路徑中的某幾條路徑匯合處,這個(gè)公共的基類就會(huì)產(chǎn)生多個(gè)實(shí)例〔或多個(gè)副本,若想只保存這個(gè)基類的一個(gè)實(shí)例,可以將這個(gè)公共基類說(shuō)明為虛基類。從基類派生新類時(shí),使用關(guān)鍵字virtual可以將基類說(shuō)明成虛基類。在多個(gè)基類之間嚴(yán)格按照派生類定義時(shí)從左到右的順序來(lái)排列先后。而析構(gòu)函數(shù)的調(diào)用順序剛好與構(gòu)造函數(shù)的相反。如果基類中有虛基類,則構(gòu)造函數(shù)的調(diào)用順序采用下列規(guī)則:<1>虛基類的構(gòu)造函數(shù)在非虛基類之前調(diào)用。<2>若同一層次中包含多個(gè)虛基類,這些虛基類的構(gòu)造函數(shù)按照他們說(shuō)明的次序調(diào)用;<3>若虛基類由非虛基類派生而來(lái),則仍然先調(diào)用基類構(gòu)造函數(shù),再調(diào)用派生類的構(gòu)造函數(shù)。特別需要注意,當(dāng)一個(gè)派生類同時(shí)有多個(gè)基類時(shí),對(duì)于所有需要給予參數(shù)進(jìn)行初始化的基類,都要顯式給出基類名和參數(shù)表。對(duì)于使用默認(rèn)構(gòu)造函數(shù)的基類,可以不給出類名。同樣,對(duì)于對(duì)象成員,如果是使用默認(rèn)構(gòu)造函數(shù),也不需要寫出對(duì)象名和參數(shù)表。而對(duì)于單繼承,就只需要寫一個(gè)基類名就可以了。設(shè)計(jì)一個(gè)大學(xué)的類系統(tǒng),學(xué)校中有學(xué)生、教師、職員,每種人員都有自己的特性,他們之間又有相同的地方。利用繼承機(jī)制定義這個(gè)系統(tǒng)中的各個(gè)類及類上必須的操作。參考程序:#include<iostream.h>#include<string.h>classPerson{protected: charm_strName[10]; intm_nSex; int m_nAge;public: Person<char*name,intage,charsex>{ strcpy<m_strName,name>; m_nSex=<sex=='m'?0:1>; m_nAge=age; } voidsetName<char*name>{ strcpy<m_strName,name>; } voidsetSex<intsex>{ m_nSex=<sex=='m'?0:1>; } voidsetAge<intage>{ m_nAge=age; } char*getName<>{ returnm_strName; } intgetAge<>{ returnm_nAge; } intgetSex<>{ returnm_nSex; } voidShowMe<>{ cout<<"姓名:"<<m_strName<<endl; cout<<"性別:"<<<m_nSex==0?"男":"女"><<endl; cout<<"年齡:"<<m_nAge<<endl; }};classTeacher:publicPerson{ charm_strDept[20]; intm_fSalary;public: Teacher<char*name,intage,charsex,char*dept,intsalary> :Person<name,age,sex>{ strcpy<m_strDept,dept>; m_fSalary=salary; } voidShowMe<>{ Person::ShowMe<>; cout<<"工作單位:"<<m_strDept<<endl; cout<<"月薪:"<<m_fSalary<<endl; } voidsetSalary<intsalary>{ m_fSalary=salary; } intgetSalary<>{ returnm_fSalary; }};classStudent:publicPerson{ charm_strID[12]; charm_strClass[12];public: Student<char*name,intage,charsex,char*ID,char*Class> :Person<name,age,sex>{ strcpy<m_strID,ID>; strcpy<m_strClass,Class>; } voidShowMe<>{ cout<<"學(xué)號(hào):"<<m_strID<<endl; Person::ShowMe<>; cout<<"班級(jí):"<<m_strClass<<"\n"; } voidsetID<char*ID>{ strcpy<m_strID,ID>; } voidsetClass<char*Class>{ strcpy<m_strClass,Class>; } char*getID<>{ returnm_strID; } char*getClass<>{ returnm_strClass; }};classEmployee:publicPerson{ intm_fSalary;public: Employee<char*name,intage,charsex,intsalary> :Person<name,age,sex>{ m_fSalary=salary; } voidsetSalary<intsalary>{ m_fSalary=salary; } intgetSalary<>{ returnm_fSalary; } voidShowMe<>{ Person::ShowMe<>; cout<<"工資:"<<m_fSalary<<"\n"; }};voidmain<>{ //定義三個(gè)不同類的對(duì)象 Teacherteacher1<"劉馨",38,'m',"計(jì)算機(jī)系",3800>; Studentstd1<"劉麗",20,'f',"03016003","計(jì)算機(jī)03">; EmployeeemPloyee1<"張?chǎng)?,25,'f',1500>; //顯示各類人員的屬性 teacher1.ShowMe<>; cout<<"--------------------"<<endl; std1.ShowMe<>; cout<<"--------------------"<<endl; emPloyee1.ShowMe<>; //修改各類人員的屬性 teacher1.setAge<40>; teacher1.setSalary<4500>; std1.setAge<21>; emPloyee1.setAge<26>; emPloyee1.setSalary<2000>; cout<<"--------------------"<<endl; cout<<"修改各類人員的屬性后:"<<endl; teacher1.ShowMe<>; cout<<"--------------------"<<endl; std1.ShowMe<>; cout<<"--------------------"<<endl; emPloyee1.ShowMe<>;}程序的執(zhí)行結(jié)果為:姓名:劉馨性別:男年齡:38工作單位:計(jì)算機(jī)系月薪:3800-------------------學(xué)號(hào):03016003姓名:劉麗性別:女年齡:20班級(jí):計(jì)算機(jī)03-------------------姓名:張?chǎng)涡詣e:女年齡:25工資:1500-------------------修改各類人員的屬性后:姓名:劉馨性別:男年齡:40工作單位:計(jì)算機(jī)系月薪:4500-------------------學(xué)號(hào):03016003姓名:劉麗性別:女年齡:21班級(jí):計(jì)算機(jī)03-------------------姓名:張?chǎng)涡詣e:女年齡:26工資:20009.假定車可分為貨車和客車,客車又可分為轎車、面包車和公共汽車。請(qǐng)?jiān)O(shè)計(jì)相應(yīng)的類層次結(jié)構(gòu)。說(shuō)明:可以把轎車、面包車和公共汽車定義為客車類的對(duì)象參考程序:#include<iostream>usingnamespacestd;classvehicle //定義基類vehicle{public: //公有函數(shù)成員vehicle<intin_wheels,floatin_weight>;//給數(shù)據(jù)成員初始化intget_wheels<>;//獲取車輪數(shù)floatget_weight<>;//獲取汽車重量voidsetWeels<intwls>;voidsetWeight<floatwt>;voiddisplay<>{ cout<<"車輪數(shù):"<<wheels <<"汽車重量:"<<weight<<endl;}private: //私有數(shù)據(jù)成員intwheels;//車輪數(shù)floatweight;//表示汽車承重};vehicle::vehicle<intin_wheels,floatin_weight>{ wheels=in_wheels; weight=in_weight;}floatvehicle::get_weight<>{ returnweight;}intvehicle::get_wheels<>{ returnwheels;}voidvehicle::setWeels<intwls>{ wheels=wls;}voidvehicle::setWeight<floatwt>{ weight=wt;}classtruck:publicvehicle //定義貨車類truck{private://新增私有數(shù)據(jù)成員floatweight_load;//承重public://新增公有成員函數(shù)truck<intwheel,floatwt,floatwl>:vehicle<wheel,wt>{ weight_load=wl;}floatgetLoads<>{ returnweight_load;}voiddisplay<>{ vehicle::display<>; cout<<"汽車承重"<<weight_load<<endl;}};//車和客車,客車又可分為轎車、面包車和公共汽車classcar:publicvehicle //定義客車類car{intpassenger_load; //新增私有數(shù)據(jù)成員,表示載客數(shù)public: //新增公有成員函數(shù) car<intin_wheels,floatin_weight,intpeople=4>:vehicle<in_wheels,in_weight> { passenger_load=people; } intgetPassengers<>{ returnpassenger_load; } voidsetPassengers<intpeople>{ passenger_load=people; } voiddisplay<>{ vehicle::display<>; cout<<"載客數(shù):"<<passenger_load<<endl; }};voidmain<>{ trucktruck1<8,400,100000>; //貨車 carcar1<4,20>; //客車 carsaloon_car<4,10,5>; //轎車 carmicrobus<6,10,18>; //面包車 carbus<6,20,30>; //公共汽車 //顯示相關(guān)信息 truck1.display<>; cout<<"---------------------"<<endl; car1.display<>; cout<<"---------------------"<<endl; saloon_car.display<>; cout<<"---------------------"<<endl; microbus.display<>; cout<<"---------------------"<<endl; bus.display<>;}程序的運(yùn)行結(jié)果:車輪數(shù):8汽車重量:400汽車承重100000---------------------車輪數(shù):4汽車重量:20載客數(shù):4---------------------車輪數(shù):4汽車重量:10載客數(shù):5---------------------車輪數(shù):6汽車重量:10載客數(shù):18---------------------車輪數(shù):6汽車重量:20載客數(shù):3010.設(shè)計(jì)一個(gè)能細(xì)分為矩形、三角形、圓形和橢圓形的"圖形"類。使用繼承將這些圖形分類,找出能作為基類部分的共同特征〔如寬、高、中心點(diǎn)等和方法〔如初始化、求面積等,并看看這些圖形是否能進(jìn)一步劃分為子類。參考程序:#include<iostream>usingnamespacestd;classFigure //定義基類圖形類{public: //公有函數(shù)成員Figure<intwid>{width=wid;}floatarea<>{}intgetWidth<>{returnwidth;}private: //私有數(shù)據(jù)成員intwidth; //寬度或半徑};classRectangle:publicFigure{//定義矩形類 intheight;public: Rectangle<intwid,inthei>:Figure<wid>{ height=hei; } floatarea<>{returngetWidth<>*height;}};classTriangle:publicFigure{ //定義三角形類 intheight;public: Triangle<intwid,inthei>:Figure<wid>{ height=hei; } floatarea<>{return1.0/2*getWidth<>*height;}};classCircle:publicFigure{//定義圓類public: Circle<intwid>:Figure<wid>{ } floatarea<>{return3.14*getWidth<>*getWidth<>;}};voidmain<>{ Rectanglerect<5,4>; Triangletri<5,4>; Circlecir<5>; cout<<"矩形的面積是:"<<rect.area<><<endl <<"三角形的面積是:"<<tri.area<><<endl <<"圓的面積是:"<<cir.area<><<endl;}程序的運(yùn)行結(jié)果為:矩形的面積是:20三角形的面積是:10圓的面積是:78.511.考慮大學(xué)的學(xué)生情況,試?yán)脝卫^承來(lái)實(shí)現(xiàn)學(xué)生和畢業(yè)生兩個(gè)類,設(shè)計(jì)相關(guān)的數(shù)據(jù)成員及函數(shù),編程對(duì)繼承情況進(jìn)行測(cè)試。參考程序:#include<iostream.h>#include<string.h>classStudent //定義基類vehicle{public: //公有函數(shù)成員 Student<intn,char*na,intg>:number<n>,grade<g>{ strcpy<name,na>; } intgetNumber<>{ returnnumber; } char*getName<>{ returnname; } intgetGrade<>{ returngrade; } voiddisplay<>{ cout<<"學(xué)號(hào):"<<number<<endl <<"姓名:"<<name<<endl <<"年級(jí):"<<grade<<endl; }private: //私有數(shù)據(jù)成員intnumber; //學(xué)號(hào)charname[20]; //姓名intgrade; //年級(jí)};classGraduate:publicStudent{//定義畢業(yè)生類 chardesignSubject[20];public: Graduate<intn,char*na,char*deSub,intg=4>:Student<n,na,g> {strcpy<designSubject,deSub>;} voiddisplay<>{ Student::display<>; cout<<"設(shè)計(jì)題目:"<<designSubject<<endl; }};voidmain<>{ //創(chuàng)建對(duì)象 Studentli<2,"LiMing",3>; Graduatezhang<3,"ZhangGang","學(xué)生成績(jī)管理系統(tǒng)">; //顯示對(duì)象的相關(guān)信息 li.display<>; cout<<endl<<"-----------------------------------"<<endl; zhang.display<>;}程序的運(yùn)行結(jié)果:學(xué)號(hào):2姓名:LiMing年級(jí):3-----------------------------------學(xué)號(hào):3姓名:ZhangGang年級(jí):4設(shè)計(jì)題目:學(xué)生成績(jī)管理系統(tǒng)12.定義一個(gè)哺乳動(dòng)物類,再由此派生出人類、狗類和貓類,這些類中均有speak<>函數(shù),觀察在調(diào)用過(guò)程中,到底使用了誰(shuí)的speak<>函數(shù)。參考程序:#include<iostream.h>#include<string.h>classAnimal{ floatweight;public: voidspeak<>{} voidsetWeight<floatwt>{weight=wt;} floatgetWeight<>{returnweight;}};classHuman:publicAnimal{public: voidspeak<>{ cout<<"說(shuō)話"<<endl; }};classCat:publicAnimal{public: voidspeak<>{ cout<<"喵喵"<<endl; }};classDog:publicAnimal{public: voidspeak<>{ cout<<"汪汪"<<endl; }};voidmain<>{ //定義三個(gè)對(duì)象 Humanhm; Catcat; Dogdog; //調(diào)用不同類的speak函數(shù) cout<<"人:"; hm.speak<>; cout<<"貓:"; cat.speak<>; cout<<"狗:"; dog.speak<>;}程序的運(yùn)行結(jié)果:人:說(shuō)話貓:喵喵狗:汪汪13.通過(guò)多重繼承定義研究生類,研究生既有學(xué)生的屬性,又有教師的屬性。參考程序:#include<iostream.h>#include<string.h>classPerson{protected: charm_strName[10]; intm_nSex; int m_nAge;public: Person<char*name,intage,charsex>{ strcpy<m_strName,name>; m_nSex=<sex=='m'?0:1>; m_nAge=age; } voidsetName<char*name>{ strcpy<m_strName,name>; } voidsetSex<intsex>{ m_nSex=<sex=='m'?0:1>; } voidsetAge<intage>{ m_nAge=age; } char*getName<>{ returnm_strName; } intgetAge<>{ returnm_nAge; } intgetSex<>{ returnm_nSex; } voidShowMe<>{ cout<<"姓名:"<<m_strName<<endl; cout<<"性別:"<<<m_nSex==0?"男":"女"><<endl; cout<<"年齡:"<<m_nAge<<endl; }};classTeacher:publicPerson{ charm_strDept[20]; intm_fSalary;public: Teacher<char*name,intage,charsex,char*dept,intsalary> :Person<name,age,sex>{ strcpy<m_strDept,dept>; m_fSalary=salary; } voidShowMe<>{ Person::ShowMe<>; cout<<"工作單位:"<<m_strDept<<endl; cout<<"月薪:"<<m_fSalary<<endl; } voidsetSalary<intsalary>{ m_fSalary=salary; } char*getDept<>{ returnm_strDept; } intgetSalary<>{ returnm_fSalary; }};classStudent:publicPerson{ charm_strID[12]; charm_strClass[12];public: Student<char*name,intage,charsex,char*ID,char*Class> :Person<name,age,sex>{ strcpy<m_strID,ID>; strcpy<m_strClass,Class>; } voidShowMe<>{ cout<<"學(xué)號(hào):"<<m_strID<<endl; Person::ShowMe<>; cout<<"班級(jí):"<<m_strClass<<"\n"; } voidsetID<char*ID>{ strcpy<m_strID,ID>; } voidsetClass<char*Class>{ strcpy<m_strClass,Class>; } char*getID<>{ returnm_strID; } char*getClass<>{ returnm_strClass; }};classMaster:publicStudent,publicTeacher{public: Master<char*name,intage,charsex,char*ID,char*Class,char*dept,intsalary> :Student<name,age,sex,ID,Class>,Teacher<name,age,sex,dept,salary>{ } voidShowMe<>{ Student::ShowMe<>; cout<<"工作單位:"<<getDept<><<endl; cout<<"月薪:"<<getSalary<><<endl; }};voidmain<>{ //定義三個(gè)不同類的對(duì)象 Teacherteacher1<"劉馨",38,'m',"計(jì)算機(jī)系",3800>; Studentstd1<"劉麗",20,'f',"03016003","計(jì)算機(jī)03">; Mastermaster<"張?chǎng)?,25,'f',"003","機(jī)械052","機(jī)械系",1000>; //顯示各類人員的屬性 teacher1.ShowMe<>; cout<<"--------------------"<<endl; std1.ShowMe<>; cout<<"--------------------"<<endl; master.ShowMe<>;}程序的運(yùn)行結(jié)果為:姓名:劉馨性別:男年齡:38工作單位:計(jì)算機(jī)系月薪:3800--------------------學(xué)號(hào):03016003姓名:劉麗性別:女年齡:20班級(jí):計(jì)算機(jī)03--------------------學(xué)號(hào):003姓名:張?chǎng)涡詣e:女年齡:25班級(jí):機(jī)械052工作單位:機(jī)械系月薪:1000第六章1.虛函數(shù)和重載設(shè)計(jì)方法上有何相同和不同之處?<1>重載函數(shù)要求函數(shù)有相同的返回值類型和函數(shù)名稱,并有不同的參數(shù)序列;而虛函數(shù)則要求這三項(xiàng)〔函數(shù)名、返回值類型和參數(shù)序列完全相同;<2>重載函數(shù)可以是成員函數(shù)或友員函數(shù),而虛函數(shù)只能是成員函數(shù);<3>重載函數(shù)的調(diào)用是以所傳遞參數(shù)序列的差別作為調(diào)用不同函數(shù)的依據(jù);虛函數(shù)是根據(jù)對(duì)象的不同去調(diào)用不同類的虛函數(shù);<4>虛函數(shù)在運(yùn)行時(shí)表現(xiàn)出多態(tài)功能,這是C++的精髓;而重載函數(shù)則在編譯時(shí)表現(xiàn)出多態(tài)性。2.什么是純虛函數(shù)?什么是抽象類?抽象類的特性是什么?如果基類只表達(dá)一些抽象的概念,而并不與具體的對(duì)象相聯(lián)系,但它又必須為它的派生類提供一個(gè)公共的界面,在這種情況下,可以將基類中的虛函數(shù)定義成純虛函數(shù)。純虛函數(shù)是一種沒(méi)有具體實(shí)現(xiàn)的特殊的虛函數(shù)。一個(gè)基類中有一個(gè)純虛函數(shù)時(shí),則在它的派生類中至少有一個(gè)虛函數(shù),否則純虛函數(shù)是無(wú)意義的。純虛函數(shù)的定義格式如下:virtual〈類型〉<函數(shù)名><<參數(shù)表>>=0;如果一個(gè)類至少有一個(gè)純虛函數(shù),那么就稱該類為抽象類。<1>抽象類只能作為基類來(lái)派生新類,不能建立抽象類的對(duì)象。<2>抽象類不能用作參數(shù)類型、函數(shù)返回值類型、或顯式轉(zhuǎn)換的類型。<3>可以聲明指向抽象類的指針和引用,此指針可以指向它的公有派生類,進(jìn)而實(shí)現(xiàn)多態(tài)性。<4>從一個(gè)抽象類派生的具體類提供純虛函數(shù)的實(shí)現(xiàn)代碼。<5>如果基類中含有純虛函數(shù),而其派生類卻并沒(méi)有重新定義這些純虛函數(shù)的覆蓋成員函數(shù),那么這個(gè)派生類也是抽象類,因此也不能用來(lái)定義對(duì)象。但此情況不會(huì)影響以后的派生類。<6>含有純虛函數(shù)的類中可以包含非純虛函數(shù),但這些虛函數(shù)只能通過(guò)其派生類的對(duì)象才能被引用。<7>如果派生類中給出了基類所有純虛函數(shù)的實(shí)現(xiàn),則該派生類不再是抽象類。<8>在成員函數(shù)內(nèi)可以調(diào)用純虛函數(shù),但在構(gòu)造函數(shù)或析構(gòu)函數(shù)內(nèi)調(diào)用一個(gè)純虛函數(shù)將導(dǎo)致程序運(yùn)行錯(cuò)誤,因?yàn)闆](méi)有為純虛函數(shù)定義代碼。3.給字符串類定義下列重載運(yùn)算符函數(shù):<1>賦值運(yùn)算符=<2>連接運(yùn)算符+<3>關(guān)系運(yùn)算符><>=<===!=#include<iostream.h>#include<string.h>classString{charname[256];public:String<char*str>{strcpy<name,str>;}String<>{}~String<>{}Stringoperator+<constString&>;Stringoperator=<constString&>;booloperator><constString&>;booloperator<<constString&>;booloperator>=<constString&>;booloperator<=<constString&>;booloperator==<constString&>;booloperator!=<constString&>;voiddisplay<>{cout<<"Thestringis:"<<name<<endl;}};staticchar*str;StringString::operator+<constString&a>{strcpy<str,name>;strcat<str,>;returnString<str>;}StringString::operator=<constString&a>{ strcpy<name,>; return*this;}boolString::operator><constString&a>{ if<strcmp<name,>>0> returntrue; else returnfalse;}boolString::operator<<constString&a>{ if<strcmp<name,><0> returntrue; else returnfalse;}boolString::operator>=<constString&a>{ if<strcmp<name,>>0||strcmp<name,>==0> returntrue; else returnfalse;}boolString::operator<=<constString&a>{ if<strcmp<name,><0||strcmp<name,>==0> returntrue; else returnfalse;}boolString::operator==<constString&a>{ if<strcmp<name,>==0> returntrue; else returnfalse;}boolString::operator!=<constString&a>{ if<strcmp<name,>!=0> returntrue; else returnfalse;}voidmain<>{str=newchar[256];Stringdemo1<"Visualc++">;Stringdemo2<"6.0">;demo1.display<>;demo2.display<>;Stringdemo3=demo1+demo2;demo3.display<>;Stringdemo4;demo4=demo3;demo4.display<>;if<demo1>demo2>cout<<"demo1>demo2"<<endl;elsecout<<"demo1<=demo2"<<endl;if<demo1!=demo2>cout<<"demo1!=demo2"<<endl;elsecout<<"demo1==demo2"<<endl;if<demo3!=demo4>cout<<"demo3!=demo4"<<endl;elsecout<<"demo3==demo4"<<endl;}程序的運(yùn)行結(jié)果為:Thestringis:Visualc++Thestringis:6.0Thestringis:Visualc++6.0Thestringis:Visualc++6.0demo1>demo2demo1!=demo2demo3==demo44.現(xiàn)有一個(gè)學(xué)校管理系統(tǒng),在其中包含的處理信息有三方面,即教師、學(xué)生和職工。利用一個(gè)菜單來(lái)實(shí)現(xiàn)對(duì)它們的操作。要求使用虛函數(shù)。#include<iostream.h>#include<string.h>#include<conio.h>classperson{ friendclasslist;protected: charname[20]; intage; charadd[40]; chartele[15]; staticperson*ptr; person*next;public: person<char*,int,char*,char*>; virtualvoidprint<>; virtualvoidinsert<>{};};classstudent:publicperson{ friendclasslist; intlevel; floatgrade_point_average;public: student<char*,int,char*,char*,int,float>; voidprint<>; voidinsert<>;};classteacher:publicperson{ friendclasslist; floatsalary;public: teacher<char*,int,char*,char*,float>; voidprint<>; voidinsert<>;};classstaff:publicperson{ friendclasslist; floathourly_wages;public: staff<char*,int,char*,char*,float>; voidprint<>; voidinsert<>;};classlist{ person*root;public: list<>{root=0;} voidinsert_person<person*node>; voidremove<char*name>; voidprint_list<>;};person::person<char*name,intage,char*add,char*tele>{ strcpy<person::name,name>; strcpy<person::add,add>; strcpy<person::tele,tele>; person::age=age; next=0;}voidperson::print<>{ cout<<"\nname:"<<name<<"\n"; cout<<"age:"<<add<<"\n"; cout<<"address:"<<add<<"\n"; cout<<"telephonenumber:"<<tele<<"\n";}student::student<char*name,intage,char*add,char*tele,intlevel,floatgrade_point_average>:person<name,age,add,tele>{ student::level=level; student::grade_point_average=grade_point_average;}voidstudent::print<>{ person::print<>; cout<<"gradepointaverage:"<<grade_point_average; cout<<"level";}voidstudent::insert<>{ ptr=newstudent<name,age,add,tele,level,grade_point_average>;}teacher::teacher<char*name,intage,char*add,char*tele,floatsalary>:person<name,age,add,tele>{teacher::salary=salary;}voidteacher::print<>{person::print<>;cout<<"salary:"<<salary<<"\n";}voidteacher::insert<>{ptr=newteacher<name,age,add,tele,salary>;}staff::staff<char*name,intage,char*add,char*tele,floathourly_wages>:person<name,age,add,tele>{staff::hourly_wages=hourly_wages;}voidstaff::print<>{person::print<>;cout<<"hourly_wages:"<<hourly_wages<<"\n";}voidstaff::insert<>{ptr=newstaff<name,age,add,tele,hourly_wages>;}voidlist::insert_person<person*node>{ charkey[20]; strcpy<key,node->name>; person*curr_node=root; person*previous=0; while<curr_node!=0&&strcmp<curr_node->name,key><0> { previous=curr_node; cu
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO/TR 41019:2024 EN Facility managements role in sustainability,resilience and adaptability
- 2025年度校園基礎(chǔ)設(shè)施裝修改造工程合同
- 2025年度房產(chǎn)居間合同:旅游地產(chǎn)項(xiàng)目開(kāi)發(fā)合作協(xié)議
- 2025年度標(biāo)前協(xié)議模板:XX基礎(chǔ)設(shè)施建設(shè)合作前期協(xié)議
- 2025年度酒店客房預(yù)訂客戶投訴處理合同
- 2025年度博物館安防監(jiān)控設(shè)備采購(gòu)與安裝合同
- 學(xué)期班級(jí)教學(xué)活動(dòng)工作任務(wù)計(jì)劃
- 學(xué)期閱讀推廣活動(dòng)計(jì)劃
- 社區(qū)文藝活動(dòng)計(jì)劃
- 生物教育在新時(shí)代的挑戰(zhàn)與機(jī)遇計(jì)劃
- EN50317-2002-鐵路應(yīng)用集電系統(tǒng)受電弓和接觸網(wǎng)的動(dòng)力交互
- 人教版美術(shù)八下課程綱要
- 項(xiàng)目部組織機(jī)構(gòu)框圖(共2頁(yè))
- 機(jī)動(dòng)車登記證書
- ASTM-D471橡膠性能的標(biāo)準(zhǔn)試驗(yàn)方法-液體影響(中文版)(共24頁(yè))
- 鉭鈮礦開(kāi)采項(xiàng)目可行性研究報(bào)告寫作范文
- 小升初數(shù)學(xué)銜接班優(yōu)秀課件
- 中國(guó)十大名茶(課堂PPT)
- 出口食品生產(chǎn)企業(yè)備案自我評(píng)估表
- 鋼結(jié)構(gòu)廠房招標(biāo)文件
- 肥城市死因漏報(bào)調(diào)查方案PPT課件
評(píng)論
0/150
提交評(píng)論