c-與c的區(qū)別-課件_第1頁
c-與c的區(qū)別-課件_第2頁
c-與c的區(qū)別-課件_第3頁
c-與c的區(qū)別-課件_第4頁
c-與c的區(qū)別-課件_第5頁
已閱讀5頁,還剩155頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

從C語言到C++語言從C語言到C++語言C++的學(xué)習(xí)用書任何一本你能接觸到的C++編程書籍譚教授的書清華王燕《面向?qū)ο蟮睦碚撆cC++實(shí)踐》航空工業(yè)趙建周《C和C++程序設(shè)計(jì)教程》C++的學(xué)習(xí)用書任何一本你能接觸到的C++編程書籍C與C++的不同C++在代碼上對(duì)C的擴(kuò)充大不相同C:面向過程C++:面向?qū)ο驝與C++的不同C++在代碼上對(duì)C的擴(kuò)充面向過程程序設(shè)計(jì)—C語言選定數(shù)據(jù)結(jié)構(gòu)、設(shè)計(jì)算法過程或函數(shù)。程序執(zhí)行被看作各過程調(diào)用的序列。面向過程編程:程序=數(shù)據(jù)結(jié)構(gòu)+算法設(shè)計(jì)思路自頂向下、逐步求精。采用模塊分解與功能抽象,自頂向下、分而治之。炒菜吃種菜、洗菜、切菜、炒菜面向過程程序設(shè)計(jì)—C語言選定數(shù)據(jù)結(jié)構(gòu)、設(shè)計(jì)算法過程或函數(shù)。程面向過程的結(jié)構(gòu)化程序設(shè)計(jì)方法缺點(diǎn):可重用性差、數(shù)據(jù)安全性差、難以開發(fā)大型軟件和圖形界面的應(yīng)用軟件把數(shù)據(jù)和處理數(shù)據(jù)的過程分離為相互獨(dú)立的實(shí)體。當(dāng)數(shù)據(jù)結(jié)構(gòu)改變時(shí),所有相關(guān)的處理過程都要進(jìn)行相應(yīng)的修改。每一種相對(duì)于老問題的新方法都要帶來額外的開銷。圖形用戶界面的應(yīng)用程序,很難用過程來描述和實(shí)現(xiàn),開發(fā)和維護(hù)也都很困難。面向過程的結(jié)構(gòu)化程序設(shè)計(jì)方法缺點(diǎn):可重用性差、數(shù)據(jù)安全性差、面向?qū)ο蟪绦蛟O(shè)計(jì)—C++語言將數(shù)據(jù)及對(duì)數(shù)據(jù)的操作方法封裝在一起,作為一個(gè)相互依存、不可分離的整體——對(duì)象。對(duì)同類型對(duì)象抽象出其共性,形成類。主要特征是各對(duì)象之間的消息傳遞和各類之間的繼承。類通過一個(gè)簡單的外部接口,與外界發(fā)生關(guān)系。對(duì)象與對(duì)象之間通過消息進(jìn)行通信。面向?qū)ο蟪绦蛟O(shè)計(jì)—C++語言將數(shù)據(jù)及對(duì)數(shù)據(jù)的操作方法封裝在一面向?qū)ο蟪绦蛟O(shè)計(jì)一個(gè)類的集合和各類之間以繼承關(guān)系聯(lián)系起來的結(jié)構(gòu),再加上一個(gè)主程序,在主程序中定義各對(duì)象并規(guī)定它們之間傳遞消息的規(guī)律。面向?qū)ο缶幊蹋簩?duì)象=數(shù)據(jù)結(jié)構(gòu)+算法(封裝);程序=對(duì)象+對(duì)象+對(duì)象+……炒菜吃:買凈菜、按照烹調(diào)說明書炒菜面向?qū)ο蟪绦蛟O(shè)計(jì)一個(gè)類的集合和各類之間以繼承關(guān)系聯(lián)系起來的結(jié)面向?qū)ο蟪绦蛟O(shè)計(jì)優(yōu)點(diǎn):程序模塊間的關(guān)系更為簡單,程序模塊的獨(dú)立性、數(shù)據(jù)的安全性就有了良好的保障。通過繼承與多態(tài)性,可以大大提高程序的可重用性,使得軟件的開發(fā)和維護(hù)都更為方便。面向?qū)ο蟪绦蛟O(shè)計(jì)優(yōu)點(diǎn):C語言中的關(guān)鍵字AutobreakcasecharcontinuedefaultdodoubleelseentryenumexternforfloatgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedwhileC語言中的關(guān)鍵字AutobreakcasecharcC++語言中的關(guān)鍵字Asmautobreakcasecatch*cdeclcharclass*constcontinuedefaultdelete*dodoubleelseenumexternfarfloatforfriend*gotohugeifinline*intinterrupulongnearnew*

operator*pascalprivate*

protected*public*registerreturnshortsignedsizeofstaticstructswitchtemplate*this*throw*try*typedefunionunsignedvirtual*voidvolatilewhileC++語言中的關(guān)鍵字AsmautobreakcaseC++對(duì)C的保留C++具有對(duì)傳統(tǒng)C語言的向后兼容性,很多已有的C程序可以稍加改造就可以重用。雖然C++具備面向?qū)ο蟮奶幚砟芰?,但它還是保留了很多面向過程的東西。用C++完全可以不用面向?qū)ο蟮乃枷雭磉M(jìn)行程序設(shè)計(jì),當(dāng)然人們不會(huì)這樣去做——除了那些只是把C++看成是C擴(kuò)充的初學(xué)者。C++對(duì)C的保留C++具有對(duì)傳統(tǒng)C語言的向后兼容性,很多已C++對(duì)C在代碼上的擴(kuò)充cout<<,cin>>代替printf,scanfPrintf,scanf都必須配合%d、%f等格式控制符使用Cout<<,cin>>后面直接跟上操作數(shù)即可,不用格式控制符;new,delete代替malloc,freeNew自動(dòng)計(jì)算要分配的類型大小,省事,避免偶然錯(cuò)誤;它自動(dòng)返回正確的指針類型,不必進(jìn)行類型轉(zhuǎn)換;可以用new將分配的對(duì)象初始化;C++對(duì)C在代碼上的擴(kuò)充cout<<,cin>>代替一個(gè)簡單的C++程序例子#include<iostream>#include<string>voidmain(){ stringuser_name; cout<<"Pleaseenteryourfirstname:"; cin>>user_name; cout<<'\n' <<"Hello," <<user_name <<"...andgoodbye!\n";}一個(gè)簡單的C++程序例子#include<iostreamC++對(duì)C在代碼上的擴(kuò)充引用voidswap(int&a,int&b)作用:傳遞數(shù)據(jù)、不復(fù)制副本函數(shù)重載:一物多用 intmax(inta,intb,intc) longmax(longa,longb,longc) floatmax(floata,floatb,floatc)C++對(duì)C在代碼上的擴(kuò)充引用幾個(gè)C++的概念面對(duì)對(duì)象技術(shù):軟件系統(tǒng)對(duì)現(xiàn)實(shí)世界的直接模擬,盡量實(shí)現(xiàn)將現(xiàn)實(shí)世界中的事物直接影射到軟件系統(tǒng)的解空間?,F(xiàn)實(shí)空間問題面向?qū)ο蠼饪臻g物質(zhì):一輛白色的自行車意識(shí):自行車具體事物:一個(gè)對(duì)象----自行車的實(shí)例抽象概念:自行車類幾個(gè)C++的概念面對(duì)對(duì)象技術(shù):軟件系統(tǒng)對(duì)現(xiàn)實(shí)世界的直接模擬,幾個(gè)C++的概念對(duì)象:在系統(tǒng)中用來描述客觀事物的,其自身所具有的狀態(tài)特征及可以對(duì)這些狀態(tài)施加的操作結(jié)合在一起所構(gòu)成的獨(dú)立實(shí)體,它是用來構(gòu)成系統(tǒng)的基本單位。對(duì)象由一組屬性和一組行為構(gòu)成。屬性:用來描述對(duì)象靜態(tài)特征的數(shù)據(jù)項(xiàng)。行為:用來描述對(duì)象動(dòng)態(tài)特征的操作序列。幾個(gè)C++的概念對(duì)象:在系統(tǒng)中用來描述客觀事物的,其自身所具幾個(gè)C++的概念--對(duì)象對(duì)象名:王東對(duì)象的狀態(tài): 性別:男 身高:180cm 體重:68kg對(duì)象的功能(可做的操作):回答身高回答體重回答性別修理電器教計(jì)算機(jī)課均屬于自身所承受的操作均屬于施加于其他對(duì)象的操作行為:用來描述對(duì)象動(dòng)態(tài)特征的操作序列屬性:用來描述對(duì)象靜態(tài)特征的數(shù)據(jù)項(xiàng)。一個(gè)人,王東,男,身高180cm,體重68kg,會(huì)修電器、能教計(jì)算機(jī)課。幾個(gè)C++的概念--對(duì)象對(duì)象名:王東對(duì)象的功能(可做的操作)幾個(gè)C++的概念—類分類——人類通常的思維方法。生活中,我們總是會(huì)把各種物體進(jìn)行分類。分類所依據(jù)的原則——抽象忽略事物的非本質(zhì)特征,只注意那些與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特征,從而找出事物的共性,把具有共同性質(zhì)的事物劃分為一類,得出一個(gè)抽象的概念。例如,石頭、樹木、汽車、房屋等都是人們在長期的生產(chǎn)和生活實(shí)踐中抽象出的概念,它們分別代表了各種不同類的物體。幾個(gè)C++的概念—類分類——人類通常的思維方法。生活中,我們幾個(gè)C++的概念類:具有相同屬性和服務(wù)的一組對(duì)象的集合,是對(duì)一組客觀對(duì)象的抽象,它將該組對(duì)象所具有的共同特征(包括屬性特征和行為特征)集中起來,以說明該組對(duì)象的能力和性質(zhì)。如,“表”,屬性特征:時(shí)、分、秒;行為特征:設(shè)定時(shí)間,顯示時(shí)間。類是多個(gè)實(shí)例的綜合抽象,而實(shí)例又是類的個(gè)體實(shí)物。利用類可以實(shí)現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。幾個(gè)C++的概念類:具有相同屬性和服務(wù)的一組對(duì)象的集合,是對(duì)類與對(duì)象—類的聲明類是一種用戶自定義類型,聲明形式:class類名稱{public:公有成員(外部接口)private:私有成員protected:保護(hù)型成員}Class聲明類的名稱,用public、private和protected關(guān)鍵字來說明類的成員的訪問控制屬性,最后給出成員函數(shù)的實(shí)現(xiàn)。類與對(duì)象—類的聲明類是一種用戶自定義類型,聲明形式:類與對(duì)象—類公有類型成員:在關(guān)鍵字public后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。私有類型成員:在關(guān)鍵字private后面聲明,只允許本類中的函數(shù)訪問,而類外部的任何訪問都是非法的。保護(hù)類型成員:與private類似,其差別表現(xiàn)在繼承與派生時(shí)對(duì)派生類的影響不同。類與對(duì)象—類公有類型成員:在關(guān)鍵字public后面聲明,它們類的一個(gè)例子classClock{public:

voidSetTime(intNewH,intNewM,intNewS);

voidShowTime();private:intHour,Minute,Second;};成員數(shù)據(jù)(屬性)成員函數(shù)(行為)類的一個(gè)例子classClock成員數(shù)據(jù)(屬性)成員函數(shù)voidClock::SetTime(intNewH,intNewM,intNewS){Hour=NewH;Minute=NewM;Second=NewS;}voidClock::ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second;}成員函數(shù)的聲明:返回值類型類名::函數(shù)成員名(參數(shù)表){函數(shù)體}voidClock::SetTime(intNewH,幾個(gè)C++的概念分隔符“::”:在所定義的成員函數(shù)名之前應(yīng)該加上類名,中間用分隔符隔開;類名::類成員函數(shù)在對(duì)于類成員的訪問時(shí),使用“.”操作符:對(duì)象名.類成員函數(shù)或?qū)ο竺?類名::類成員函數(shù)定義指向此類對(duì)象的指針,在使用此類成員時(shí),使用“->”操作符指針->類成員函數(shù)幾個(gè)C++的概念分隔符“::”:在所定義的成員函數(shù)名之前應(yīng)該類的聲明成員數(shù)據(jù):與一般的變量聲明相同,但需要將它放在類的聲明體中。成員函數(shù):稱為“方法”,一個(gè)方法對(duì)應(yīng)一個(gè)操作??梢栽陬愔姓f明原型,在類外給出函數(shù)體實(shí)現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。一般而言,數(shù)據(jù)成員用private,成員函數(shù)用public只有被聲明為public的方法(成員函數(shù))才能被外界所激活簡單的成員函數(shù)的實(shí)現(xiàn)直接嵌入類的聲明中(inline),復(fù)雜的則可寫在外面。類的聲明成員數(shù)據(jù):與一般的變量聲明相同,但需要將它放在類的聲類與對(duì)象—對(duì)象類的對(duì)象是該類的某一特定實(shí)體,即類類型的變量。聲明形式:

類名對(duì)象名;例:

ClockmyClock;類與對(duì)象—對(duì)象類的對(duì)象是該類的某一特定實(shí)體,即類類型的變量。類中成員的訪問方式類中成員互訪直接使用成員名類外訪問:外界通過發(fā)“消息”來激活有關(guān)方法,所謂消息,其實(shí)就是一個(gè)命令,由程序語句來實(shí)現(xiàn)使用“對(duì)象名.成員名”方式訪問public屬性的成員,注:類外部不能訪問私有性成員,只有本類中的函數(shù)可以訪問。如:myClock.ShowTime()就是向?qū)ο髆yClock發(fā)出一個(gè)消息,通知它執(zhí)行display方法類中成員的訪問方式類中成員互訪一個(gè)例子intmain(){ClockmyClock;myClock.SetTime(8,30,30);myClock.ShowTime();}#include<iostream>classClock{......//類的聲明略}//......類的實(shí)現(xiàn)略一個(gè)例子intmain()#include<iostrea構(gòu)造函數(shù)構(gòu)造函數(shù)的作用是在對(duì)象被創(chuàng)建時(shí)使用特定的值構(gòu)造對(duì)象,或者說將對(duì)象初始化為一個(gè)特定的狀態(tài)。(在聲明對(duì)象時(shí)進(jìn)行的數(shù)據(jù)成員設(shè)置,稱為對(duì)象的初始化。)構(gòu)造函數(shù)也是成員函數(shù),被聲明為公有型,與類名同名,無返回值。構(gòu)造函數(shù)在對(duì)象創(chuàng)建時(shí)由系統(tǒng)自動(dòng)調(diào)用。構(gòu)造函數(shù)也可以被重載,在對(duì)象創(chuàng)建時(shí)由系統(tǒng)自動(dòng)調(diào)用。如果程序中未聲明,則系統(tǒng)自動(dòng)產(chǎn)生出一個(gè)默認(rèn)形式的構(gòu)造函數(shù),該函數(shù)沒有參數(shù),不進(jìn)行任何操作構(gòu)造函數(shù)構(gòu)造函數(shù)的作用是在對(duì)象被創(chuàng)建時(shí)使用特定的值構(gòu)造對(duì)象,構(gòu)造函數(shù)舉例classClock{public:

Clock(intNewH,intNewM,intNewS);//構(gòu)造函數(shù) voidSetTime(intNewH,intNewM,intNewS); voidShowTime();private: intHour,Minute,Second;};構(gòu)造函數(shù)舉例classClock構(gòu)造函數(shù)的實(shí)現(xiàn):Clock::Clock(intNewH,intNewM,intNewS){ Hour=NewH; Minute=NewM; Second=NewS;}建立對(duì)象時(shí)構(gòu)造函數(shù)的作用:intmain(){

Clockc(0,0,0);//隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。c.ShowTime();}構(gòu)造函數(shù)的實(shí)現(xiàn):析構(gòu)函數(shù)“清理善后”:在撤銷對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)(destructor),釋放此對(duì)象所屬的空間。析構(gòu)函數(shù)名:與類名相同,只是在函數(shù)名前面加一個(gè)“~”,以區(qū)別于構(gòu)造函數(shù)只能用一個(gè)析構(gòu)函數(shù),不能重載若用戶未編寫析構(gòu)函數(shù),編譯系統(tǒng)會(huì)自動(dòng)生成一個(gè)缺省的析構(gòu)函數(shù),它不進(jìn)行任何操作析構(gòu)函數(shù)“清理善后”:在撤銷對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)(d構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#include<iostream>classPoint{public:Point(intxx,intyy);~Point();//...其他函數(shù)原型private:intX,intY;};Point::Point(intxx=0,intyy=0){X=xx;Y=yy;}Point::~Point(){}//...其他函數(shù)的實(shí)現(xiàn)略PointPointA //點(diǎn)A(0,0)PointPointB(4,5) //B(4,5)構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#include<iostream>P類的應(yīng)用舉例1#include<iostream.h>classClock//時(shí)鐘類的聲明{public://外部接口,公有成員函數(shù)voidSetTime(intNewH=0,intNewM=0,intNewS=0);

voidShowTime();private://私有數(shù)據(jù)成員intHour,Minute,Second;};類的應(yīng)用舉例1#include<iostream.h>//時(shí)鐘類成員函數(shù)的具體實(shí)現(xiàn)voidClock::SetTime(intNewH,intNew,MintNewS){Hour=NewH;Minute=NewM;Second=NewS;}voidClock::ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second;}//時(shí)鐘類成員函數(shù)的具體實(shí)現(xiàn)//主程序Voidmain() {clockmyClook; //定義對(duì)象myClockcout<<“Firsttimesetandoutput:”<<endl;myClook.SetTime();//設(shè)置時(shí)間為默認(rèn)值myClook.ShowTime(); //顯示時(shí)間cout<<“Secondtimesetandoutput;”<<endl;myClook.SetTime(8,30,30); //設(shè)置時(shí)間為8:30:30myClook.ShowTime(); //顯示時(shí)間}//主程序程序運(yùn)行結(jié)果:Firsttimesetandoutput:0:0:0Secondtimesetandoutput:8:30:30程序由類Clock的定義、類成員函數(shù)的實(shí)現(xiàn)和主函數(shù)三個(gè)獨(dú)立部分組成,通過類對(duì)問題進(jìn)行了高度的抽象和封閉化的描述,在主程序中聲明類的實(shí)例—對(duì)象并完成消息的傳遞從而解決了問題。程序運(yùn)行結(jié)果:程序由類Clock的定義、類成員函數(shù)的實(shí)現(xiàn)和主面向?qū)ο蟮奶匦苑庋b性繼承性多態(tài)性面向?qū)ο蟮奶匦苑庋b性封裝性封裝:將一個(gè)數(shù)據(jù)和與這個(gè)數(shù)據(jù)有關(guān)的操作集合放在一起,形成一個(gè)能動(dòng)的實(shí)體----對(duì)象,用戶不必知道對(duì)象行為的實(shí)現(xiàn)細(xì)節(jié),只需根據(jù)對(duì)象提供的外部特性接口訪問對(duì)象即可。從用戶的角度來看,這些對(duì)象的行為就象包含在一個(gè)“黑匣子”里,是隱蔽的、看不見的。封裝性封裝:將一個(gè)數(shù)據(jù)和與這個(gè)數(shù)據(jù)有關(guān)的操作集合放在一起,形C++的封裝思想C++利用類(class)的形式來實(shí)現(xiàn)封裝的。具有相同結(jié)構(gòu)和特性的所有對(duì)象構(gòu)成一種“類型”——類(class)類是用來定義對(duì)象的一種抽象數(shù)據(jù)類型對(duì)象(object):數(shù)據(jù)(屬性)+操作(行為)類是對(duì)具有相同結(jié)構(gòu)和特性的對(duì)象的抽象,而對(duì)象是類的具體實(shí)例(instance)首都類:北京、巴黎、莫斯科、華盛頓…類相當(dāng)于是用戶自定義的數(shù)據(jù)類型,其性質(zhì)和其他數(shù)據(jù)類型(如整型、實(shí)型…)相同C++的封裝思想C++利用類(class)的形式來實(shí)現(xiàn)封裝的structstudent

{

intnumber;charname[10];charsex;

floatsocre;

};structstudentstudent1,student2;只包含數(shù)據(jù),不包含操作structstudent

{

intnumbC++如何封裝數(shù)據(jù)和操作?classstudent

{private:

intnumber;

charname[10];

floatsocre;

public:

voiddisplay()

{cout<<“number:”<<numer<<endl;……}

voidsetnum(inta)

{number=a;}

};studentstud1,stud2stud1.display()對(duì)象類名數(shù)據(jù)成員成員函數(shù)C++如何封裝數(shù)據(jù)和操作?classstudent

{一般而言,數(shù)據(jù)成員用private,外界無法隨意改動(dòng)數(shù)據(jù)成員函數(shù)用public,外界能夠方便的訪問操作數(shù)據(jù)簡單的成員函數(shù)的實(shí)現(xiàn)直接嵌入類的聲明中(inline),復(fù)雜的則可寫在外面。聲明為private的私有數(shù)據(jù),外部無法訪問;通過public的成員函數(shù)為類提供外部接口,外界只能通過這個(gè)接口來與該類發(fā)生聯(lián)系。外界通過發(fā)“消息”來激活有關(guān)方法,所謂消息,其實(shí)就是一個(gè)命令,由程序語句來實(shí)現(xiàn)C++的封裝一般而言,數(shù)據(jù)成員用private,外界無法隨意改動(dòng)數(shù)據(jù)C+Stud1.setnum()就是向?qū)ο髎tud1發(fā)出一個(gè)消息,通知它執(zhí)行setnum()方法(設(shè)定學(xué)號(hào))stud1.display()就是向?qū)ο髎tud1發(fā)出一個(gè)消息,通知它執(zhí)行display方法(顯示學(xué)號(hào))所以,我們不必了解或改動(dòng)這個(gè)“黑匣子”的具體結(jié)構(gòu)和算法,只需通過接口就能方便地完成數(shù)據(jù)的通信和執(zhí)行相關(guān)的操作。通過類的機(jī)制實(shí)現(xiàn)了對(duì)數(shù)據(jù)的有效隱蔽,使程序中不同部分之間的相互影響減少到最低程度,增強(qiáng)了程序的安全性。C++的封裝Stud1.setnum()就是向?qū)ο髎tud1發(fā)出一個(gè)消繼承與派生面向?qū)ο蠹夹g(shù)強(qiáng)調(diào)軟件的可重用性,在C++中可重用性是通過“繼承”這一機(jī)制來實(shí)現(xiàn)的例:我們想在前面的學(xué)生信息中增加“年齡”“地址”等信息是重新定義一個(gè)新的類student1?還是在已有類student的基礎(chǔ)上加上一些新的內(nèi)容?繼承與派生面向?qū)ο蠹夹g(shù)強(qiáng)調(diào)軟件的可重用性,在C++中可重用性“長方形”繼承了“形狀”的全部特征,“正方形”繼承了“長方形”的全部特征“長方形”是“形狀”派生出來的一個(gè)分支,“正方形”是“長方形”派生出來的一個(gè)分支形狀shape橢圓形ellipse長方形rectangle三角形triangle圓形circle正方形square直角三角形鈍角三角形銳角三角形形狀橢圓形長方形三角形圓形正方形直角鈍角銳角問題舉例問題舉例繼承與派生在C++中所謂“繼承”就是在一個(gè)已存在的類的基礎(chǔ)上新增自己的特性而建立一個(gè)新的類已存在的類稱為“基類”或“父類”,新建立的類稱為“派生類”或“子類”派生類繼承了基類的所有數(shù)據(jù)成員和成員函數(shù),并增加了新的成員繼承使我們得以將一群相關(guān)的類組織起來,并讓我們得以分享其間的共通數(shù)據(jù)和操作行為保持已有類的特性而構(gòu)造新類的過程稱為繼承。繼承與派生在C++中所謂“繼承”就是在一個(gè)已存在的類的基礎(chǔ)上派生類的聲明class派生類名:繼承方式基類名{成員聲明;}三種繼承方式:公有繼承、私有繼承、保護(hù)繼承不同繼承方式的影響主要體現(xiàn)在: 派生類成員對(duì)基類成員的訪問權(quán)限 通過派生類對(duì)象對(duì)基類成員的訪問權(quán)限派生類的聲明class派生類名:繼承方式基類名三種繼承classstudent1:publicstudent{

private:

intage;

stringaddress;

public:

voiddisplay_1(){cout<<“age:”<<age<<endl;cout<<“address:”<<address<<endl;}};表明student1為公用派生類private表明student1為私有派生類classstudent1:publicstudent公有繼承(public)基類的public和protected成員的訪問屬性在派生類中保持不變,但基類的private成員不可直接訪問。派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。通過派生類的對(duì)象只能訪問基類的public成員。公有繼承(public)基類的public和protecte私有繼承(private)基類的public和protected成員都以private身份出現(xiàn)在派生類中,但基類的private成員不可直接訪問。派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。通過派生類的對(duì)象不能直接訪問基類中的任何成員。私有繼承(private)基類的public和protect保護(hù)繼承(protected)基類的public和protected成員都以protected身份出現(xiàn)在派生類中,但基類的private成員不可直接訪問。派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。通過派生類的對(duì)象不能直接訪問基類中的任何成員保護(hù)繼承(protected)基類的public和prote派生類的繼承關(guān)系基類私有(private)成員公用(public)成員保護(hù)(protected)成員公用(public)派生類不可訪問的成員公用成員保護(hù)成員私有(private)派生類不可訪問的成員私有成員私有成員派生類的繼承關(guān)系基類私有(private)成員公用(publprotected成員的特點(diǎn)與作用對(duì)建立其所在類對(duì)象的模塊來說,它與private成員的性質(zhì)相同。對(duì)于其派生類來說,它與public成員的性質(zhì)相同。既實(shí)現(xiàn)了數(shù)據(jù)隱藏,又方便繼承,實(shí)現(xiàn)代碼重用。protected成員的特點(diǎn)與作用對(duì)建立其所在類對(duì)象的模塊例公有繼承舉例classPoint //基類Point類的聲明{public: //公有函數(shù)成員

voidInitP(floatxx=0,floatyy=0) //構(gòu)造函數(shù)初始化{X=xx;Y=yy;}

voidMove(floatxOff,floatyOff) //移動(dòng)該點(diǎn){X+=xOff;Y+=yOff;}

floatGetX(){returnX;} //返回X軸坐標(biāo)值 floatGetY(){returnY;} //返回Y軸坐標(biāo)值private: //私有數(shù)據(jù)成員 floatX,Y;};例公有繼承舉例classPoint //基類PoinclassRectangle:publicPoint//派生類聲明(長方形類){public: //新增公有函數(shù)成員

voidInitR(floatx,floaty,floatw,floath)//設(shè)置長方形 {InitP(x,y);W=w;H=h;} //調(diào)用基類公有成員函數(shù) floatGetH(){returnH;} //返回長方形的高 floatGetW(){returnW;} //返回長方形的寬private: //新增私有數(shù)據(jù)成員

floatW,H; //長、寬};classRectangle:publicPoint#include<iostream>#include<cmath> //數(shù)學(xué)公式的頭文件intmain(){Rectanglerect; rect.InitR(2,3,20,10); //設(shè)置長方形 rect.Move(3,2); //通過派生類對(duì)象訪問基類公有成員 cout<<rect.GetX()<<',‘ //2+3=5 <<rect.GetY()<<',‘ //3+2=5 <<rect.GetW()<<',‘ //20<<rect.GetH()<<endl; //10 return0;}#include<iostream>多態(tài)性同一個(gè)消息可以根據(jù)發(fā)送消息對(duì)象的不同采用不同的行為方式。重載(overloading)

:通過為函數(shù)和運(yùn)算符創(chuàng)建附加定義而使它們的名字可以重載。也就是說相同名字的函數(shù)和運(yùn)算符對(duì)不同類型的消息可以表現(xiàn)出不同的行為。虛函數(shù)(Virtual):使用戶在一個(gè)類等級(jí)中可以使用相同函數(shù)的多個(gè)版本。多態(tài)性同一個(gè)消息可以根據(jù)發(fā)送消息對(duì)象的不同采用不同的行為方式函數(shù)重載的一個(gè)例子—C中intmax1(inta,intb,intc){ if(b>a)a=b; if(c>a)a=c; returna;}double

max2(doublea,doubleb,doublec){……}類型不同的數(shù)據(jù)間比較需分別調(diào)用兩個(gè)不同名的函數(shù)來實(shí)現(xiàn)。a1、b1、c1為int型:max1(a1,b1,c1)a2、b2、c2為double型:max2(a2,b2,c2)函數(shù)重載的一個(gè)例子—C中intmax1(inta,in函數(shù)重載的一個(gè)例子——C++中intmax(inta,intb,intc){ if(b>a)a=b; if(c>a)a=c; returna;}doublemax(doublea,doubleb,doublec){

if(b>a)a=b; if(c>a)a=c;r eturna;}a1、b1、c1為int型:max(a1,b1,c1)a2、b2、c2為double型:max(a2,b2,c2)類型不同的數(shù)據(jù)間比較可以使用同名的函數(shù)來實(shí)現(xiàn),程序自動(dòng)判斷選擇合適的類型。函數(shù)重載的一個(gè)例子——C++中intmax(inta,運(yùn)算符重載例8-1將“+”、“-”運(yùn)算重載為復(fù)數(shù)類的成員函數(shù)。規(guī)則:實(shí)部和虛部分別相加減。操作數(shù):兩個(gè)操作數(shù)都是復(fù)數(shù)類的對(duì)象。運(yùn)算符重載例8-1將“+”、“-”運(yùn)算#include<iostream>classcomplex //復(fù)數(shù)類聲明{public: //外部接口 complex(doubler=0.0,doublei=0.0){real=r;imag=i;}

//構(gòu)造函數(shù) complexoperator+(complexc2);//+重載為成員函數(shù) complexoperator-(complexc2);//-重載為成員函數(shù) voiddisplay(){cout<<"("<<real<<","<<imag<<")"<<endl;}; //輸出復(fù)數(shù)private: //私有數(shù)據(jù)成員 doublereal; //復(fù)數(shù)實(shí)部 doubleimag; //復(fù)數(shù)虛部}; 63#include<iostream>63complexcomplex::

operator+(complexc2)//重載函數(shù)實(shí)現(xiàn){ complexc;

c.real=c2.real+real; c.imag=c2.imag+imag; returncomplex(c.real,c.imag);}64complexcomplex::

operator+(ccomplexcomplex::

operator-(complexc2)//重載函數(shù)實(shí)現(xiàn){ complexc;

c.real=real-c2.real; c.imag=imag-c2.imag; returncomplex(c.real,c.imag);}65complexcomplex::

operator-(cintmain()//主函數(shù){ complexc1(5,4),c2(2,10),c3;//聲明復(fù)數(shù)類的對(duì)象 cout<<"c1=";c1.display(); cout<<"c2=";c2.display();

c3=c1-c2; //使用重載運(yùn)算符完成復(fù)數(shù)減法 cout<<"c3=c1-c2="; c3.display();

c3=c1+c2; //使用重載運(yùn)算符完成復(fù)數(shù)加法 cout<<"c3=c1+c2="; c3.display();}66intmain()//主函數(shù)66程序輸出的結(jié)果為:c1=(5,4)c2=(2,10)c3=c1-c2=(3,-6)c3=c1+c2=(7,14)67程序輸出的結(jié)果為:67繼承中的一個(gè)問題長方形的面積:Area=W*H;正方形的面積:Area=L*L;正方形從長方形繼承而來,顯然就有了兩個(gè)同名但操作并不相同的求面積的成員函數(shù),當(dāng)計(jì)算正方形面積時(shí),怎么樣才能準(zhǔn)確調(diào)用正方形派生類中的函數(shù)呢?長方形rectangle正方形square繼承繼承中的一個(gè)問題長方形的面積:Area=W*H;長方形正方形#include<iostream> classPoint{public: Point(doublei,doublej){x=i;y=j;} doubleArea()const{return0.0;}private: doublex,y;};classRectangle:publicPoint{public: Rectangle(doublei,doublej,doublek,doublel); doubleArea()const{returnw*h;}private: doublew,h;};#include<iostream> Rectangle::Rectangle(doublei,doublej,doublek,doublel):Point(i,j){ w=k;h=l;}voidfun(Point&s) //&s用到了引用{ cout<<"Area="<<s.Area()<<endl;}intmain(){

Rectanglerec(3.0,5.2,15.0,25.0); fun(rec);}運(yùn)行結(jié)果:Area=0Rectangle::Rectangle(doublei,虛函數(shù)虛函數(shù)(Virtual):若某類中的一個(gè)成員函數(shù)被說明為虛函數(shù),就意味著成員函數(shù)在派生類中可能存在著不同的實(shí)現(xiàn)在類的聲明中,在函數(shù)原型之前寫virtualVirtual函數(shù)類型函數(shù)名(形參表){ 函數(shù)體}virtual只用來說明類聲明中的原型,不能用在函數(shù)實(shí)現(xiàn)時(shí)。虛函數(shù)虛函數(shù)(Virtual):若某類中的一個(gè)成員函數(shù)被說明虛函數(shù)具有繼承性,基類中聲明了虛函數(shù),派生類中無論是否說明,同原型函數(shù)都自動(dòng)為虛函數(shù)。本質(zhì):不是重載聲明而是覆蓋。調(diào)用方式:通過基類指針或引用,執(zhí)行時(shí)會(huì)

根據(jù)指針指向的對(duì)象的類,決定調(diào)用哪個(gè)函數(shù)虛函數(shù)#include<iostream>classPoint{public: Point(doublei,doublej){x=i;y=j;}

virtualdoubleArea()const{return0.0;} //virtual:虛函數(shù)private: doublex,y;};classRectangle:publicPoint{public: Rectangle(doublei,doublej,doublek,doublel);

virtualdoubleArea()const{returnw*h;} //virtual:虛函數(shù)private: doublew,h;};//其他函數(shù)同上例#include<iostream>voidfun(Point&s){ cout<<"Area="<<s.Area()<<endl;}intmain(){ Rectanglerec(3.0,5.2,15.0,25.0); fun(rec);}運(yùn)行結(jié)果:Area=375voidfun(Point&s)intmax(inta,intb,intc){if(b>a)a=b;

if(c>a)a=c;

returna;}模板(template)doublemax(floata,floatb,floatc){ if(b>a)a=b;

if(c>a)a=c;

returna;}這兩個(gè)重載的函數(shù),有很多相同的代碼,能不能充分利用這些相同的代碼?提高軟件的開發(fā)效率intmax(inta,intb,intc)模板函數(shù)模板函數(shù)模板可以用來創(chuàng)建一個(gè)通用功能的函數(shù),以支持多種不同的形參,簡化重載函數(shù)的函數(shù)體設(shè)計(jì)。函數(shù)模版定義形式為: template<typename標(biāo)識(shí)符> 函數(shù)定義函數(shù)模板函數(shù)模板可以用來創(chuàng)建一個(gè)通用功能的函數(shù),以支持多種不函數(shù)模板(template)template<typenameT>Tmax(Ta,Tb,Tc){if(b>a)a=b;

if(c>a)a=c;

returna;}max就是函數(shù)模板Voidmain(){inta1=10,a2=15,a3=20;doublea1=1.5,a2=5.5,a3=2.3;max(a1,b1,c1)max(a2,b2,c2)}編譯器從調(diào)用max()時(shí)實(shí)參的類型自動(dòng)推導(dǎo)出函數(shù)模板的類型參數(shù)。實(shí)際執(zhí)行:intmax(inta,intb,intc)doublemax(floata,floatb,floatc)函數(shù)模板(template)template<typenam類模板同樣,使用類模板使用戶為類聲明一種模式,使得類中某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)、某些成員函數(shù)的返回值能取任意類型,提高代碼使用率。類模板聲明如下: template<class標(biāo)識(shí)符> 類說明注意:模板類的成員函數(shù)必須是函數(shù)模板模板類建立對(duì)象時(shí),聲明形式如下: 類模板名<class標(biāo)識(shí)符>對(duì)象名1,對(duì)象名2……類模板同樣,使用類模板使用戶為類聲明一種模式,使得類中某些數(shù)類模板(template)178264131829PiglEeyoRooChriKanPootTigg二叉樹:由結(jié)點(diǎn)組成,每一個(gè)節(jié)點(diǎn)包括值及其深度,以及下一級(jí)左右節(jié)點(diǎn)的位置。類模板(template)178264131829PiglEclassstring_BTnode{public:……private:

stringval;intcnt;string_BTnode*lchild;string_BTnode*rchild;}classint_BTnode{public:……private:

intval;intcnt;int_BTnode*lchild;int_BTnode*rchild;}template

<class

valType>classBTnode{public:……private:valTypeval;intcnt;int_BTnode*lchild;int_BTnode*rchild;}valType可以被任意設(shè)定來建立對(duì)象,如BTnode<int>bti;或BTnode<string>bts;BTnode就是類模板classstring_BTnode{classint從C語言到C++語言從C語言到C++語言C++的學(xué)習(xí)用書任何一本你能接觸到的C++編程書籍譚教授的書清華王燕《面向?qū)ο蟮睦碚撆cC++實(shí)踐》航空工業(yè)趙建周《C和C++程序設(shè)計(jì)教程》C++的學(xué)習(xí)用書任何一本你能接觸到的C++編程書籍C與C++的不同C++在代碼上對(duì)C的擴(kuò)充大不相同C:面向過程C++:面向?qū)ο驝與C++的不同C++在代碼上對(duì)C的擴(kuò)充面向過程程序設(shè)計(jì)—C語言選定數(shù)據(jù)結(jié)構(gòu)、設(shè)計(jì)算法過程或函數(shù)。程序執(zhí)行被看作各過程調(diào)用的序列。面向過程編程:程序=數(shù)據(jù)結(jié)構(gòu)+算法設(shè)計(jì)思路自頂向下、逐步求精。采用模塊分解與功能抽象,自頂向下、分而治之。炒菜吃種菜、洗菜、切菜、炒菜面向過程程序設(shè)計(jì)—C語言選定數(shù)據(jù)結(jié)構(gòu)、設(shè)計(jì)算法過程或函數(shù)。程面向過程的結(jié)構(gòu)化程序設(shè)計(jì)方法缺點(diǎn):可重用性差、數(shù)據(jù)安全性差、難以開發(fā)大型軟件和圖形界面的應(yīng)用軟件把數(shù)據(jù)和處理數(shù)據(jù)的過程分離為相互獨(dú)立的實(shí)體。當(dāng)數(shù)據(jù)結(jié)構(gòu)改變時(shí),所有相關(guān)的處理過程都要進(jìn)行相應(yīng)的修改。每一種相對(duì)于老問題的新方法都要帶來額外的開銷。圖形用戶界面的應(yīng)用程序,很難用過程來描述和實(shí)現(xiàn),開發(fā)和維護(hù)也都很困難。面向過程的結(jié)構(gòu)化程序設(shè)計(jì)方法缺點(diǎn):可重用性差、數(shù)據(jù)安全性差、面向?qū)ο蟪绦蛟O(shè)計(jì)—C++語言將數(shù)據(jù)及對(duì)數(shù)據(jù)的操作方法封裝在一起,作為一個(gè)相互依存、不可分離的整體——對(duì)象。對(duì)同類型對(duì)象抽象出其共性,形成類。主要特征是各對(duì)象之間的消息傳遞和各類之間的繼承。類通過一個(gè)簡單的外部接口,與外界發(fā)生關(guān)系。對(duì)象與對(duì)象之間通過消息進(jìn)行通信。面向?qū)ο蟪绦蛟O(shè)計(jì)—C++語言將數(shù)據(jù)及對(duì)數(shù)據(jù)的操作方法封裝在一面向?qū)ο蟪绦蛟O(shè)計(jì)一個(gè)類的集合和各類之間以繼承關(guān)系聯(lián)系起來的結(jié)構(gòu),再加上一個(gè)主程序,在主程序中定義各對(duì)象并規(guī)定它們之間傳遞消息的規(guī)律。面向?qū)ο缶幊蹋簩?duì)象=數(shù)據(jù)結(jié)構(gòu)+算法(封裝);程序=對(duì)象+對(duì)象+對(duì)象+……炒菜吃:買凈菜、按照烹調(diào)說明書炒菜面向?qū)ο蟪绦蛟O(shè)計(jì)一個(gè)類的集合和各類之間以繼承關(guān)系聯(lián)系起來的結(jié)面向?qū)ο蟪绦蛟O(shè)計(jì)優(yōu)點(diǎn):程序模塊間的關(guān)系更為簡單,程序模塊的獨(dú)立性、數(shù)據(jù)的安全性就有了良好的保障。通過繼承與多態(tài)性,可以大大提高程序的可重用性,使得軟件的開發(fā)和維護(hù)都更為方便。面向?qū)ο蟪绦蛟O(shè)計(jì)優(yōu)點(diǎn):C語言中的關(guān)鍵字AutobreakcasecharcontinuedefaultdodoubleelseentryenumexternforfloatgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedwhileC語言中的關(guān)鍵字AutobreakcasecharcC++語言中的關(guān)鍵字Asmautobreakcasecatch*cdeclcharclass*constcontinuedefaultdelete*dodoubleelseenumexternfarfloatforfriend*gotohugeifinline*intinterrupulongnearnew*

operator*pascalprivate*

protected*public*registerreturnshortsignedsizeofstaticstructswitchtemplate*this*throw*try*typedefunionunsignedvirtual*voidvolatilewhileC++語言中的關(guān)鍵字AsmautobreakcaseC++對(duì)C的保留C++具有對(duì)傳統(tǒng)C語言的向后兼容性,很多已有的C程序可以稍加改造就可以重用。雖然C++具備面向?qū)ο蟮奶幚砟芰?,但它還是保留了很多面向過程的東西。用C++完全可以不用面向?qū)ο蟮乃枷雭磉M(jìn)行程序設(shè)計(jì),當(dāng)然人們不會(huì)這樣去做——除了那些只是把C++看成是C擴(kuò)充的初學(xué)者。C++對(duì)C的保留C++具有對(duì)傳統(tǒng)C語言的向后兼容性,很多已C++對(duì)C在代碼上的擴(kuò)充cout<<,cin>>代替printf,scanfPrintf,scanf都必須配合%d、%f等格式控制符使用Cout<<,cin>>后面直接跟上操作數(shù)即可,不用格式控制符;new,delete代替malloc,freeNew自動(dòng)計(jì)算要分配的類型大小,省事,避免偶然錯(cuò)誤;它自動(dòng)返回正確的指針類型,不必進(jìn)行類型轉(zhuǎn)換;可以用new將分配的對(duì)象初始化;C++對(duì)C在代碼上的擴(kuò)充cout<<,cin>>代替一個(gè)簡單的C++程序例子#include<iostream>#include<string>voidmain(){ stringuser_name; cout<<"Pleaseenteryourfirstname:"; cin>>user_name; cout<<'\n' <<"Hello," <<user_name <<"...andgoodbye!\n";}一個(gè)簡單的C++程序例子#include<iostreamC++對(duì)C在代碼上的擴(kuò)充引用voidswap(int&a,int&b)作用:傳遞數(shù)據(jù)、不復(fù)制副本函數(shù)重載:一物多用 intmax(inta,intb,intc) longmax(longa,longb,longc) floatmax(floata,floatb,floatc)C++對(duì)C在代碼上的擴(kuò)充引用幾個(gè)C++的概念面對(duì)對(duì)象技術(shù):軟件系統(tǒng)對(duì)現(xiàn)實(shí)世界的直接模擬,盡量實(shí)現(xiàn)將現(xiàn)實(shí)世界中的事物直接影射到軟件系統(tǒng)的解空間?,F(xiàn)實(shí)空間問題面向?qū)ο蠼饪臻g物質(zhì):一輛白色的自行車意識(shí):自行車具體事物:一個(gè)對(duì)象----自行車的實(shí)例抽象概念:自行車類幾個(gè)C++的概念面對(duì)對(duì)象技術(shù):軟件系統(tǒng)對(duì)現(xiàn)實(shí)世界的直接模擬,幾個(gè)C++的概念對(duì)象:在系統(tǒng)中用來描述客觀事物的,其自身所具有的狀態(tài)特征及可以對(duì)這些狀態(tài)施加的操作結(jié)合在一起所構(gòu)成的獨(dú)立實(shí)體,它是用來構(gòu)成系統(tǒng)的基本單位。對(duì)象由一組屬性和一組行為構(gòu)成。屬性:用來描述對(duì)象靜態(tài)特征的數(shù)據(jù)項(xiàng)。行為:用來描述對(duì)象動(dòng)態(tài)特征的操作序列。幾個(gè)C++的概念對(duì)象:在系統(tǒng)中用來描述客觀事物的,其自身所具幾個(gè)C++的概念--對(duì)象對(duì)象名:王東對(duì)象的狀態(tài): 性別:男 身高:180cm 體重:68kg對(duì)象的功能(可做的操作):回答身高回答體重回答性別修理電器教計(jì)算機(jī)課均屬于自身所承受的操作均屬于施加于其他對(duì)象的操作行為:用來描述對(duì)象動(dòng)態(tài)特征的操作序列屬性:用來描述對(duì)象靜態(tài)特征的數(shù)據(jù)項(xiàng)。一個(gè)人,王東,男,身高180cm,體重68kg,會(huì)修電器、能教計(jì)算機(jī)課。幾個(gè)C++的概念--對(duì)象對(duì)象名:王東對(duì)象的功能(可做的操作)幾個(gè)C++的概念—類分類——人類通常的思維方法。生活中,我們總是會(huì)把各種物體進(jìn)行分類。分類所依據(jù)的原則——抽象忽略事物的非本質(zhì)特征,只注意那些與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特征,從而找出事物的共性,把具有共同性質(zhì)的事物劃分為一類,得出一個(gè)抽象的概念。例如,石頭、樹木、汽車、房屋等都是人們在長期的生產(chǎn)和生活實(shí)踐中抽象出的概念,它們分別代表了各種不同類的物體。幾個(gè)C++的概念—類分類——人類通常的思維方法。生活中,我們幾個(gè)C++的概念類:具有相同屬性和服務(wù)的一組對(duì)象的集合,是對(duì)一組客觀對(duì)象的抽象,它將該組對(duì)象所具有的共同特征(包括屬性特征和行為特征)集中起來,以說明該組對(duì)象的能力和性質(zhì)。如,“表”,屬性特征:時(shí)、分、秒;行為特征:設(shè)定時(shí)間,顯示時(shí)間。類是多個(gè)實(shí)例的綜合抽象,而實(shí)例又是類的個(gè)體實(shí)物。利用類可以實(shí)現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。幾個(gè)C++的概念類:具有相同屬性和服務(wù)的一組對(duì)象的集合,是對(duì)類與對(duì)象—類的聲明類是一種用戶自定義類型,聲明形式:class類名稱{public:公有成員(外部接口)private:私有成員protected:保護(hù)型成員}Class聲明類的名稱,用public、private和protected關(guān)鍵字來說明類的成員的訪問控制屬性,最后給出成員函數(shù)的實(shí)現(xiàn)。類與對(duì)象—類的聲明類是一種用戶自定義類型,聲明形式:類與對(duì)象—類公有類型成員:在關(guān)鍵字public后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。私有類型成員:在關(guān)鍵字private后面聲明,只允許本類中的函數(shù)訪問,而類外部的任何訪問都是非法的。保護(hù)類型成員:與private類似,其差別表現(xiàn)在繼承與派生時(shí)對(duì)派生類的影響不同。類與對(duì)象—類公有類型成員:在關(guān)鍵字public后面聲明,它們類的一個(gè)例子classClock{public:

voidSetTime(intNewH,intNewM,intNewS);

voidShowTime();private:intHour,Minute,Second;};成員數(shù)據(jù)(屬性)成員函數(shù)(行為)類的一個(gè)例子classClock成員數(shù)據(jù)(屬性)成員函數(shù)voidClock::SetTime(intNewH,intNewM,intNewS){Hour=NewH;Minute=NewM;Second=NewS;}voidClock::ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second;}成員函數(shù)的聲明:返回值類型類名::函數(shù)成員名(參數(shù)表){函數(shù)體}voidClock::SetTime(intNewH,幾個(gè)C++的概念分隔符“::”:在所定義的成員函數(shù)名之前應(yīng)該加上類名,中間用分隔符隔開;類名::類成員函數(shù)在對(duì)于類成員的訪問時(shí),使用“.”操作符:對(duì)象名.類成員函數(shù)或?qū)ο竺?類名::類成員函數(shù)定義指向此類對(duì)象的指針,在使用此類成員時(shí),使用“->”操作符指針->類成員函數(shù)幾個(gè)C++的概念分隔符“::”:在所定義的成員函數(shù)名之前應(yīng)該類的聲明成員數(shù)據(jù):與一般的變量聲明相同,但需要將它放在類的聲明體中。成員函數(shù):稱為“方法”,一個(gè)方法對(duì)應(yīng)一個(gè)操作??梢栽陬愔姓f明原型,在類外給出函數(shù)體實(shí)現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。一般而言,數(shù)據(jù)成員用private,成員函數(shù)用public只有被聲明為public的方法(成員函數(shù))才能被外界所激活簡單的成員函數(shù)的實(shí)現(xiàn)直接嵌入類的聲明中(inline),復(fù)雜的則可寫在外面。類的聲明成員數(shù)據(jù):與一般的變量聲明相同,但需要將它放在類的聲類與對(duì)象—對(duì)象類的對(duì)象是該類的某一特定實(shí)體,即類類型的變量。聲明形式:

類名對(duì)象名;例:

ClockmyClock;類與對(duì)象—對(duì)象類的對(duì)象是該類的某一特定實(shí)體,即類類型的變量。類中成員的訪問方式類中成員互訪直接使用成員名類外訪問:外界通過發(fā)“消息”來激活有關(guān)方法,所謂消息,其實(shí)就是一個(gè)命令,由程序語句來實(shí)現(xiàn)使用“對(duì)象名.成員名”方式訪問public屬性的成員,注:類外部不能訪問私有性成員,只有本類中的函數(shù)可以訪問。如:myClock.ShowTime()就是向?qū)ο髆yClock發(fā)出一個(gè)消息,通知它執(zhí)行display方法類中成員的訪問方式類中成員互訪一個(gè)例子intmain(){ClockmyClock;myClock.SetTime(8,30,30);myClock.ShowTime();}#include<iostream>classClock{......//類的聲明略}//......類的實(shí)現(xiàn)略一個(gè)例子intmain()#include<iostrea構(gòu)造函數(shù)構(gòu)造函數(shù)的作用是在對(duì)象被創(chuàng)建時(shí)使用特定的值構(gòu)造對(duì)象,或者說將對(duì)象初始化為一個(gè)特定的狀態(tài)。(在聲明對(duì)象時(shí)進(jìn)行的數(shù)據(jù)成員設(shè)置,稱為對(duì)象的初始化。)構(gòu)造函數(shù)也是成員函數(shù),被聲明為公有型,與類名同名,無返回值。構(gòu)造函數(shù)在對(duì)象創(chuàng)建時(shí)由系統(tǒng)自動(dòng)調(diào)用。構(gòu)造函數(shù)也可以被重載,在對(duì)象創(chuàng)建時(shí)由系統(tǒng)自動(dòng)調(diào)用。如果程序中未聲明,則系統(tǒng)自動(dòng)產(chǎn)生出一個(gè)默認(rèn)形式的構(gòu)造函數(shù),該函數(shù)沒有參數(shù),不進(jìn)行任何操作構(gòu)造函數(shù)構(gòu)造函數(shù)的作用是在對(duì)象被創(chuàng)建時(shí)使用特定的值構(gòu)造對(duì)象,構(gòu)造函數(shù)舉例classClock{public:

Clock(intNewH,intNewM,intNewS);//構(gòu)造函數(shù) voidSetTime(intNewH,intNewM,intNewS); voidShowTime();private: intHour,Minute,Second;};構(gòu)造函數(shù)舉例classClock構(gòu)造函數(shù)的實(shí)現(xiàn):Clock::Clock(intNewH,intNewM,intNewS){ Hour=NewH; Minute=NewM; Second=NewS;}建立對(duì)象時(shí)構(gòu)造函數(shù)的作用:intmain(){

Clockc(0,0,0);//隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。c.ShowTime();}構(gòu)造函數(shù)的實(shí)現(xiàn):析構(gòu)函數(shù)“清理善后”:在撤銷對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)(destructor),釋放此對(duì)象所屬的空間。析構(gòu)函數(shù)名:與類名相同,只是在函數(shù)名前面加一個(gè)“~”,以區(qū)別于構(gòu)造函數(shù)只能用一個(gè)析構(gòu)函數(shù),不能重載若用戶未編寫析構(gòu)函數(shù),編譯系統(tǒng)會(huì)自動(dòng)生成一個(gè)缺省的析構(gòu)函數(shù),它不進(jìn)行任何操作析構(gòu)函數(shù)“清理善后”:在撤銷對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)(d構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#include<iostream>classPoint{public:Point(intxx,intyy);~Point();//...其他函數(shù)原型private:intX,intY;};Point::Point(intxx=0,intyy=0){X=xx;Y=yy;}Point::~Point(){}//...其他函數(shù)的實(shí)現(xiàn)略PointPointA //點(diǎn)A(0,0)PointPointB(4,5) //B(4,5)構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#include<iostream>P類的應(yīng)用舉例1#include<iostream.h>classClock//時(shí)鐘類的聲明{public://外部接口,公有成員函數(shù)voidSetTime(intNewH=0,intNewM=0,intNewS=0);

voidShowTime();private://私有數(shù)據(jù)成員intHour,Minute,Second;};類的應(yīng)用舉例1#include<iostream.h>//時(shí)鐘類成員函數(shù)的具體實(shí)現(xiàn)voidClock::SetTime(intNewH,intNew,MintNewS){Hour=NewH;Minute=NewM;Second=NewS;}voidClock::ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second;}//時(shí)鐘類成員函數(shù)的具體實(shí)現(xiàn)//主程序Voidmain() {clockmyClook; //定義對(duì)象myClockcout<<“Firsttimesetandoutput:”<<endl;myClook.SetTime();//設(shè)置時(shí)間為默認(rèn)值myClook.ShowTime(); //顯示時(shí)間cout<<“Secondtimesetandoutput;”<<endl;myClook.SetTime(8,30,30); //設(shè)置時(shí)間為8:30:30myClook.ShowTime(); //顯示時(shí)間}//主程序程序運(yùn)行結(jié)果:Firsttimesetandoutput:0:0:0Secondtimesetandoutput:8:30:30程序由類Clock的定義、類成員函數(shù)的實(shí)現(xiàn)和主函數(shù)三個(gè)獨(dú)立部分組成,通過類對(duì)問題進(jìn)行了高度的抽象和封閉化的描述,在主程序中聲明類的實(shí)例—對(duì)象并完成消息的傳遞從而解決了問題。程序運(yùn)行結(jié)果:程序由類Clock的定義、類成員函數(shù)的實(shí)現(xiàn)和主面向?qū)ο蟮奶匦苑庋b性繼承性多態(tài)性面向?qū)ο蟮奶匦苑庋b性封裝性封裝:將一個(gè)數(shù)據(jù)和與這個(gè)數(shù)據(jù)有關(guān)的操作集合放在一起,形成一個(gè)能動(dòng)的實(shí)體----對(duì)象,用戶不必知道對(duì)象行為的實(shí)現(xiàn)細(xì)節(jié),只需根據(jù)對(duì)象提供的外部特性接口訪問對(duì)象即可。從用戶的角度來看,這些對(duì)象的行為就象包含在一個(gè)“黑匣子”里,是隱蔽的、看不見的。封裝性封裝:將一個(gè)數(shù)據(jù)和與這個(gè)數(shù)據(jù)有關(guān)的操作集合放在一起,形C++的封裝思想C++利用類(class)的形式來實(shí)現(xiàn)封裝的。具有相同結(jié)構(gòu)和特性的所有對(duì)象構(gòu)成一種“類型”——類(class)類是用來定義對(duì)象的一種抽象數(shù)據(jù)類型對(duì)象(object):數(shù)據(jù)(屬性)+操作(行為)類是對(duì)具有相同結(jié)構(gòu)和特性的對(duì)象的抽象,而對(duì)象是類的具體實(shí)例(instance)首都類:北京、巴黎、莫斯科、華盛頓…類相當(dāng)于是用戶自定義的數(shù)據(jù)類型,其性質(zhì)和其他數(shù)據(jù)類型(如整型、實(shí)型…)相同C++的封裝思想C++利用類(class)的形式來實(shí)現(xiàn)封裝的structstudent

{

intnumber;charname[10];charsex;

floatsocre;

};structstudentstudent1,student2;只包含數(shù)據(jù),不包含操作structstudent

{

intnumbC++如何封裝數(shù)據(jù)和操作?classstudent

{private:

intnumber;

charname[10];

floatsocre;

public:

voiddisplay()

{cout<<“number:”<<numer<<endl;……}

voidsetnum(inta)

{number=a;}

};studentstud1,stud2stud1.display()對(duì)象類名數(shù)據(jù)成員成員函數(shù)C++如何封裝數(shù)據(jù)和操作?classstudent

{一般而言,數(shù)據(jù)成員用private,外界無法隨意改動(dòng)數(shù)據(jù)成員函數(shù)用public,外界能夠方便的訪問操作數(shù)據(jù)簡單的成員函數(shù)的實(shí)現(xiàn)直接嵌入類的聲明中(inline),復(fù)雜的則可寫在外面。聲明為private的私有數(shù)據(jù),外部無法訪問;通過public的成員函數(shù)為類提供外部接口,外界只能通過這個(gè)接口來與該類發(fā)生聯(lián)系。外界通過發(fā)“消息”來激活有關(guān)方法,所謂消息,其實(shí)就是一個(gè)命令,由程序語句來實(shí)現(xiàn)C++的封裝一般而言,數(shù)據(jù)成員用private,外界無法隨意改動(dòng)數(shù)據(jù)C+Stud1.setnum()就是向?qū)ο髎tud1發(fā)出一個(gè)消息,通知它執(zhí)行setnum()方法(設(shè)定學(xué)號(hào))stud1.display()就是向?qū)ο髎tud1發(fā)出一個(gè)消息,通知它執(zhí)行display方法(顯示學(xué)號(hào))所以,我們不必了解或改動(dòng)這個(gè)“黑匣子”的具體結(jié)構(gòu)和算法,只需通過接口就能方便地完成數(shù)據(jù)的通信和執(zhí)行相關(guān)的操作。通過類的機(jī)制實(shí)現(xiàn)了對(duì)數(shù)據(jù)的有效隱蔽,使程序中不同部分之間的相互影響減少到最低程度,增強(qiáng)了程序的安全性。C++的封裝Stud1.setnum()就是向?qū)ο髎tud1發(fā)出一個(gè)消繼承與派生面向?qū)ο蠹夹g(shù)強(qiáng)調(diào)軟件的可重用性,在C++中可重用性是通過“繼承”這一機(jī)制來實(shí)現(xiàn)的例:我們想在前面的學(xué)生信息中增加“年齡”“地址”等信息是重新定義一個(gè)新的類student1?還是在已有類student的基礎(chǔ)上加上一些新的內(nèi)容?繼承與派生面向?qū)ο蠹夹g(shù)強(qiáng)調(diào)軟件的可重用性,在C++中可重用性“長方形”繼承了“形狀”的全部特征,“正方形”繼承了“長方形”的全部特征“長方形”是“形狀”派生出來的一個(gè)分支,“正方形”是“長方形”派生出來的一個(gè)分支形狀shape橢圓形ellipse長方形rectangle三角形triangle圓形circle正方形square直角三角形鈍角三角形銳角三角形形狀橢圓形長方形三角形圓形正方形直角鈍角銳角問題舉例問題舉例繼承與派生在C++中所謂“繼承”就是在一個(gè)已存在的類的基礎(chǔ)上新增自己的特性而建立一個(gè)新的類已存在的類稱為“基類”或“父類”,新建立的類稱為“派生類”或“子類”派生類繼承了基類的所有數(shù)據(jù)成員和成員函數(shù),并增加了新的成員繼承使我們得以將一群相關(guān)的類組織起來,并讓我們得以分享其間的共通數(shù)據(jù)和操作行為保持已有類的特性而構(gòu)造新類的過程稱為繼承。繼承與派生在C++中所謂“繼承”就是在一個(gè)已存在的類的基礎(chǔ)上派生類的聲明class派生類名:繼承方式基類名{成員聲明;}三種繼承方式:公有繼承、私有繼承、保護(hù)繼承不同繼承方式的影響主要體現(xiàn)在: 派生類成員對(duì)基類成員的訪問權(quán)限 通過派生類對(duì)象對(duì)基類成員的訪問權(quán)限派生類的聲明class派生類名:繼承方式基類名三種繼承classstudent1:publ

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論