清華大學(xué)C語言教學(xué)課件(共16個(gè)PPT)第15個(gè)培訓(xùn)資料_第1頁(yè)
清華大學(xué)C語言教學(xué)課件(共16個(gè)PPT)第15個(gè)培訓(xùn)資料_第2頁(yè)
清華大學(xué)C語言教學(xué)課件(共16個(gè)PPT)第15個(gè)培訓(xùn)資料_第3頁(yè)
清華大學(xué)C語言教學(xué)課件(共16個(gè)PPT)第15個(gè)培訓(xùn)資料_第4頁(yè)
清華大學(xué)C語言教學(xué)課件(共16個(gè)PPT)第15個(gè)培訓(xùn)資料_第5頁(yè)
已閱讀5頁(yè),還剩78頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

清華大學(xué)C語言教學(xué)課件(共16個(gè)PPT)第15個(gè)一、程序設(shè)計(jì)方法概述2程序設(shè)計(jì)方法早期的程序設(shè)計(jì)方法結(jié)構(gòu)化程序設(shè)計(jì)方法面向?qū)ο蟪绦蛟O(shè)計(jì)方法3 早期的程序設(shè)計(jì)方法追求程序的高效率,編程過份依賴技巧,而不注重所編寫程序的結(jié)構(gòu),也就是沒有固定程序設(shè)計(jì)方法的時(shí)期。程序的可讀性、可重用性都很差。其中一個(gè)典型問題是頻繁使用goto語句。 雖然這種方法存在很多問題,但對(duì)于單人完成較為簡(jiǎn)單的任務(wù),事實(shí)上還是經(jīng)常被采用的。早期的程序設(shè)計(jì)方法4 結(jié)構(gòu)化方法出現(xiàn)在70年代中期,我們可以這樣理解它: 結(jié)構(gòu)化程序設(shè)計(jì)方法是從程序要實(shí)現(xiàn)的功能的角度出發(fā)的。一般按照自頂向下、逐步求精的方式,將程序要完成的功能逐級(jí)劃分成許多小的功能模塊,象搭積木一樣搭起來。這些小的功能模塊最終都可以轉(zhuǎn)化成三種基本控制結(jié)構(gòu)的組合。 所謂的功能可以理解為對(duì)數(shù)據(jù)的操作。在程序?qū)崿F(xiàn)中,特定的功能或功能模塊一般用函數(shù)來實(shí)現(xiàn),它們要對(duì)特定的數(shù)據(jù)進(jìn)行操作。結(jié)構(gòu)化程序設(shè)計(jì)方法5結(jié)構(gòu)化設(shè)計(jì)方法的特點(diǎn)結(jié)構(gòu)化程序設(shè)計(jì)方法的主要技術(shù)是自頂向下、逐步求精,采用單入口、單出口的控制結(jié)構(gòu)自頂向下是一種分解問題的技術(shù),逐步求精指結(jié)構(gòu)化程序的連續(xù)分解,最終成為下面三種基本控制結(jié)構(gòu)的組合三種基本控制結(jié)構(gòu):順序、分支、循環(huán)6分支結(jié)構(gòu)語句1語句2語句3條件語句2語句1語句1語句2順序結(jié)構(gòu)循環(huán)結(jié)構(gòu)7例: 從鍵盤輸入一個(gè)學(xué)生的信息(包括姓名、年齡、性別、學(xué)號(hào)等)和一個(gè)老師的信息(包括姓名、年齡、性別、是否授課等),然后將信息輸出到屏幕。一個(gè)簡(jiǎn)單的例子8分析: 根據(jù)需求(題目要求),我們可以把問題劃分為兩個(gè)功能模塊,一個(gè)是輸入模塊,一個(gè)是輸出模塊,做完了輸入模塊,再做輸出模塊。再具體考慮每個(gè)模塊如何實(shí)現(xiàn)(逐步求精)。 我們用C語言來寫,參看下面的代碼:9//……voidmain() //主函數(shù)開始{ //聲明用于存儲(chǔ)學(xué)生信息的變量

charstrStudentName[20]; //學(xué)生姓名 intnStudentAge; //學(xué)生年齡 charcStudentSex; //學(xué)生性別 intnStudentNumber; //學(xué)生學(xué)號(hào) //聲明用于存儲(chǔ)老師信息的變量

charstrTeacherName[20]; //老師姓名 intnTeacherAge; //老師年齡 charcTeacherSex; //老師性別 intnIsTeaching; //是否授課

//輸入模塊

GetStudentInfo(…); //輸入學(xué)生信息 GetTeacherInfo(…); //輸入老師信息 //輸出模塊 PrintStudentInfo(…); //輸出學(xué)生信息 PrintStudentInfo(…); //輸出老師信息}描述學(xué)生的數(shù)據(jù)描述老師的數(shù)據(jù)函數(shù)函數(shù)10 上面的例子中,我們可以進(jìn)一步將屬于學(xué)生和老師的變量放入結(jié)構(gòu)中。這樣可以在一定程度上完成對(duì)數(shù)據(jù)的封裝。但在結(jié)構(gòu)化程序設(shè)計(jì)中,數(shù)據(jù)與對(duì)其進(jìn)行操作的函數(shù)仍是分離的。//聲明學(xué)生結(jié)構(gòu)StudentstructStudent{

charstrStudentName[20]; //學(xué)生姓名 intnStudentAge; //學(xué)生年齡 charcStudentSex; //學(xué)生性別 intnStudentNumber; //學(xué)生學(xué)號(hào)};//聲明老師結(jié)構(gòu)TeacherstructTeacher{

charstrTeacherName[20]; //老師姓名 intnTeacherAge; //老師年齡 charcTeacherSex; //老師性別 intnIsTeaching; //是否教書};1112問題: 函數(shù)用于完成一定的功能,它們都是針對(duì)特定的數(shù)據(jù)進(jìn)行操作的。那么我們能不能以特定的數(shù)據(jù)為中心,將數(shù)據(jù)與對(duì)其進(jìn)行操作的函數(shù)封裝起來呢?13面向?qū)ο蟪绦蛟O(shè)計(jì)方法面向?qū)ο蟪绦蛟O(shè)計(jì)出現(xiàn)在80年代中后期面向?qū)ο蟪绦蛟O(shè)計(jì)是建立在結(jié)構(gòu)化程序設(shè)計(jì)基礎(chǔ)上的,但它不再是從功能入手,而是從對(duì)象(人、地方、事情等)入手面向?qū)ο蟪绦蛟O(shè)計(jì)以類作為構(gòu)造程序的基本單位,它具有封裝、數(shù)據(jù)抽象、繼承、多態(tài)等特點(diǎn)14 簡(jiǎn)單地說,對(duì)象就是現(xiàn)實(shí)世界中的各種實(shí)體,包括人、地點(diǎn)和事物等。例如,桌子、椅子、教室、學(xué)生、老師、電話、汽車等等。一般都要從屬性和行為兩個(gè)方面來對(duì)它們加以描述。在這里,我們認(rèn)為對(duì)象和對(duì)象的實(shí)例是同一個(gè)概念。什么是對(duì)象?15

對(duì)象具有的一些特征稱為屬性,以一個(gè)人為例,他的姓名、年齡、身高、體重等可以作為他的屬性。這些屬性會(huì)有其對(duì)應(yīng)的值,一般至少會(huì)有一項(xiàng)區(qū)別于其它對(duì)象,它們?cè)诔绦蛟O(shè)計(jì)中對(duì)應(yīng)的是一定的數(shù)據(jù)。 為了達(dá)到目的,對(duì)象必須提供的功能(或必須提供的服務(wù))稱為對(duì)象的行為,在程序設(shè)計(jì)中對(duì)應(yīng)一定的方法(函數(shù))。屬性和行為16

類描述了一組具有相同屬性(數(shù)據(jù)元素)和相同行為(函數(shù))的對(duì)象。 類的數(shù)據(jù)成員是對(duì)對(duì)象屬性的抽象,類的函數(shù)成員是對(duì)對(duì)象行為的抽象,而類本身就是對(duì)對(duì)象的抽象。什么是類?17classStudent //Student類的聲明{public: //公有成員 Student(); //構(gòu)造函數(shù)

~Student(); //析構(gòu)函數(shù) char* GetName(); //查詢姓名 int GetAge(); //查詢年齡

char GetSex(); //查詢姓名

int GetNumber(); //查詢學(xué)號(hào) bool SetName(char*n); //設(shè)置姓名 bool SetAge(intage); //設(shè)置年齡

bool SetSex(char*s); //設(shè)置性別

bool SetNumber(intnum);//設(shè)置學(xué)號(hào)protected: //保護(hù)成員

char m_strName[20]; //姓名,字符串?dāng)?shù)組 int m_nAge; //年齡,整型 char m_cSex; //性別,字符型

int m_nNumber; //學(xué)號(hào),整型};例:C++中類的聲明——Student類成員函數(shù)成員函數(shù)成員變量18……StudentA; //聲明Student的對(duì)象AA.SetName(“張三”); //設(shè)置A的名字A.SetAge(20); //設(shè)置A的年齡……例:C++中類使用1920總的來說,結(jié)構(gòu)化程序設(shè)計(jì)方法是一種模塊化程序設(shè)計(jì)方法,它在解決問題時(shí)是以功能為中心的,一定的功能模塊雖然也作用于特定的數(shù)據(jù),但它們并沒有被封裝在一起。面向?qū)ο蟪绦蛟O(shè)計(jì)方法則是以對(duì)象為中心來解決問題的。屬于同種對(duì)象的屬性(數(shù)據(jù))和服務(wù)(功能)被抽象出來封裝到一起。21二、面向?qū)ο蟪绦蛟O(shè)計(jì)方法22數(shù)據(jù)抽象封裝繼承多態(tài)動(dòng)態(tài)綁定面向?qū)ο蠓椒ǖ闹饕攸c(diǎn)23數(shù)據(jù)抽象 類是一組相似對(duì)象的抽象描述,它抽取了這些對(duì)象的共性組成了一個(gè)共同的概念。抽象數(shù)據(jù)類型(AbstractDataType,ADT)是一組相似的類的抽象,而一個(gè)類又是ADT的具體實(shí)現(xiàn)。24 封裝是指軟件的組成部分(模塊、子程序、方法等)應(yīng)該互相獨(dú)立,或者隱藏設(shè)計(jì)的細(xì)節(jié)。在傳統(tǒng)的方法中,封裝通常局限于將功能和數(shù)據(jù)分開封裝;而在面向?qū)ο蠓椒ㄖ?,封裝將功能和數(shù)據(jù)同時(shí)裝入對(duì)象中。

參看Student類的例子封裝25classStudent //Student類的聲明{public: //公有成員 Student(); //構(gòu)造函數(shù)

~Student(); //析構(gòu)函數(shù) char* GetName(); //查詢姓名 int GetAge(); //查詢年齡

char GetSex(); //查詢姓名

int GetNumber(); //查詢學(xué)號(hào) bool SetName(char*n); //設(shè)置姓名 bool SetAge(intage); //設(shè)置年齡

bool SetSex(char*s); //設(shè)置性別

bool SetNumber(intnum);//設(shè)置學(xué)號(hào)protected: //保護(hù)成員

char m_strName[20]; //姓名,字符串?dāng)?shù)組 int m_nAge; //年齡,整型 char m_cSex; //性別,字符型

int m_nNumber; //學(xué)號(hào),整型};例:C++中類的聲明——Student類26 如果類與類之間有is-a(是一種)的關(guān)系,那么可以采用繼承機(jī)制來表示。子類可以自動(dòng)繼承父類中的一些屬性和行為,而不必再進(jìn)行定義,從而實(shí)現(xiàn)了代碼的復(fù)用。同時(shí),繼承也是產(chǎn)生新類的方法之一。繼承27 從上圖可以看出,學(xué)生和教師都是人的一種,所以,學(xué)生類和教師類可以從人類繼承而來,從而實(shí)現(xiàn)了代碼的共享。28classPeople //People類的聲明{public: //公有成員 People(); //構(gòu)造函數(shù)

~People(); //析構(gòu)函數(shù) char*GetName(); //查詢姓名 int GetAge(); //查詢年齡 …… bool SetName(char*n); //設(shè)置姓名 bool SetAge(intage); //設(shè)置年齡 ……private: //私有成員protected: //保護(hù)成員

char m_strName[20]; //姓名,字符串?dāng)?shù)組 int m_nAge; //年齡,整型 char m_cSex; //性別,字符型 …… };類的聲明舉例——People類29classTeacher:publicPeople //Teacher類的聲明{public: //公有成員 Teacher(); //構(gòu)造函數(shù)

~Teacher(); //析構(gòu)函數(shù)

boolIsTeaching(); //查詢是否授課 …… private: //私有成員 …… protected: //保護(hù)成員

bool m_bIsTeaching //是否授課 …… };類的聲明舉例——Teacher類30classStudent:publicPeople{public:

Student(); //構(gòu)造函數(shù)

~Student(); //析構(gòu)函數(shù)

intGetNumber(); //查詢學(xué)號(hào)

boolSetNumber(intn); //設(shè)置學(xué)號(hào) …… private:

…… protected:

int m_nNumber; //學(xué)號(hào) …… };類的聲明舉例——Student類31 在程序中同一符號(hào)或名字在不同情況下具有不同解釋的現(xiàn)象稱為多態(tài)性(Polymorphism)。在面向?qū)ο蟪绦蛟O(shè)計(jì)語言中,由程序員設(shè)計(jì)的多態(tài)性由兩種基本形式:編譯時(shí)多態(tài)性和運(yùn)行時(shí)多態(tài)性。許多程序設(shè)計(jì)語言都或多或少地支持多態(tài)性,但運(yùn)行時(shí)多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)語言的一大特點(diǎn)。多態(tài)32 編譯時(shí)多態(tài)性是指在程序編譯階段即可確定下來的多態(tài)性,主要通過使用重載(Overloading)機(jī)制獲得,重載機(jī)制包括函數(shù)重載和運(yùn)算符重載兩大類。 舉一個(gè)C++中的例子: intAbs(intx);

doubleAbs(doublex); cout<<Abs(-4)<<endl;//調(diào)用intAbs…

cout<<Abs(3.2)<<endl;//調(diào)用doubleAbs…33 運(yùn)行時(shí)多態(tài)性是指必須等到程序動(dòng)態(tài)運(yùn)行時(shí)才可確定的多態(tài)性,主要通過繼承結(jié)合動(dòng)態(tài)綁定獲得。

動(dòng)態(tài)綁定也稱晚綁定,它也是面向?qū)ο蟮闹匾攸c(diǎn)之一。動(dòng)態(tài)綁定的使用可以提高程序的可用性和可擴(kuò)展性。34 八十年代末以來,由Booch,Coad,Yourdon,OMT,Jacobson等人提出的多種面向?qū)ο蠓椒ㄔ谝呀?jīng)得到了廣泛的應(yīng)用。面向?qū)ο蠓椒ㄖ械娜N基本活動(dòng)就是:

(1)識(shí)別對(duì)象和類

(2)描述對(duì)象和類之間的關(guān)系

(3)通過描述類的功能定義對(duì)象的行為面向?qū)ο蠓椒?5科德將對(duì)象模型分為下面四個(gè)部件,也就是將對(duì)象分為了四組:(1)問題域PD(problemdomain)(2)人機(jī)交互HI(humaninteraction)(3)數(shù)據(jù)管理DM(datamanagement)(2)系統(tǒng)交互SI(systeminteraction)科德(Coad)方法36問題域問題(PD)通常最先考慮,因?yàn)橛脩敉铌P(guān)心為自己的商業(yè)問題建模。問題域部件包含與需要建模的問題直接有關(guān)的對(duì)象。問題域部件的對(duì)象技術(shù)上呈現(xiàn)中型,它們幾乎不了解或完全不了解人機(jī)交互、數(shù)據(jù)管理和系統(tǒng)交互部件的對(duì)象。人機(jī)交互部件(HI)包含為問題域?qū)ο蠛腿藗冎g提供界面的對(duì)象。在對(duì)象模型中,人機(jī)交互部件的對(duì)象通常對(duì)應(yīng)具體的窗口和報(bào)表。37數(shù)據(jù)管理部件(DM)包含為問題域?qū)ο蠛蛿?shù)據(jù)庫(kù)系統(tǒng)或文件管理系統(tǒng)之間提供界面的對(duì)象。在對(duì)象模型中,數(shù)據(jù)管理部件的對(duì)象通常對(duì)應(yīng)某些需要保存及搜索的問題域?qū)ο蟆O到y(tǒng)交互部件(SI)包含為問題域?qū)ο蠛推渌到y(tǒng)或設(shè)備提供界面的對(duì)象。系統(tǒng)交互對(duì)象封裝了通信協(xié)議,使得問題域?qū)ο蟛恍枰私獾讓拥膶?shí)現(xiàn)細(xì)節(jié)。38科德的面向?qū)ο蠓椒òㄒ幌滤膫€(gè)活動(dòng):(1)確定系統(tǒng)的目標(biāo)和特點(diǎn)(2)確定四種模型部件的對(duì)象和模式(3)建立對(duì)象責(zé)任(2)定義服務(wù)場(chǎng)景以完成特定服務(wù)責(zé)任39三、C++語言C與C++的比較C++中的數(shù)據(jù)類型C++程序框架類和對(duì)象類的聲明、實(shí)現(xiàn)、繼承、多態(tài)性舉例40C語言C語言的優(yōu)點(diǎn):與硬件無關(guān),可移植性強(qiáng)語言簡(jiǎn)潔,使用方便豐富的運(yùn)算符和數(shù)據(jù)類型可直接訪問內(nèi)存地址能進(jìn)行位操作目標(biāo)代碼質(zhì)量高,運(yùn)行效率高41C語言的弱點(diǎn):檢查機(jī)制弱,編譯時(shí)不能發(fā)現(xiàn)編程錯(cuò)誤面向過程的語言,沒有支持代碼復(fù)用的機(jī)制很難控制大規(guī)模程序的復(fù)雜性42C++語言是C的超集,保持了與C的兼容性繼承了C語言高效性、靈活性的特點(diǎn)擴(kuò)充了對(duì)面向?qū)ο蟪绦蛟O(shè)計(jì)和高層次問題抽象方法的支持,是面向?qū)ο蟪绦蛟O(shè)計(jì)語言之一完善了C語言的類型檢查、代碼重用、數(shù)據(jù)抽象機(jī)制,便于大規(guī)模軟件開發(fā)既反映了結(jié)構(gòu)化程序設(shè)計(jì)方法,又反映了面向?qū)ο蟪绦蛟O(shè)計(jì)方法43#include<iostream.h> //預(yù)編譯命令voidmain() //主函數(shù)開始{ cout<<“Hellotheworld!”<<endl;} //主函數(shù)結(jié)束一個(gè)簡(jiǎn)單的C++程序的例子 C++中提供的iostream庫(kù)可以完成對(duì)輸入輸出流的操作,“流”(stream)就是簡(jiǎn)單的字符序列。在C++中用cin,cout和cerr來定義鍵盤輸入類、屏幕輸出類和錯(cuò)誤信息輸出類。endl用于換行并清空流。如:cin>>a;cout<<“輸入的數(shù)據(jù)為”<<a<<endl;44基本數(shù)據(jù)類型構(gòu)造數(shù)據(jù)類型整型(int)實(shí)數(shù)型字符型(char)空類型(void)布爾型(bool)引申數(shù)據(jù)類型結(jié)構(gòu)化數(shù)據(jù)類型指針(*)引用(&)數(shù)組([])結(jié)構(gòu)(struct)聯(lián)合(union)枚舉(enum)類(class)浮點(diǎn)型(float)雙精度型(double)C++中的數(shù)據(jù)類型45引用&一般用于參數(shù)傳遞。&可以認(rèn)為是取地址。引用類型的變量并不真正創(chuàng)建新的對(duì)象,而是作為另一個(gè)對(duì)象的別名。例如voidswap(int&a,int&b) //用于交換a,b

{

inttemp;

temp=a;a=b;b=temp;

}對(duì)形參a,b的操作等價(jià)與對(duì)實(shí)參的操作。46C++程序結(jié)構(gòu) C++源代碼一般都由若干類或函數(shù)組成。為了便于管理,一般把不同的類放在不同的文件中,對(duì)于類的聲明和實(shí)現(xiàn)也分別放在對(duì)應(yīng)的.h(或.hpp)和.cpp文件中。 由于文件較多,所以為了便于管理,一般的集成開發(fā)工具都會(huì)提供工程(Project)管理功能來管理這些文件,對(duì)源文件進(jìn)行編譯和鏈接。4748 為防止重復(fù)包含(多次包含同一頭文件,造成重復(fù)定義)和嵌套包含(互相包含)造成的錯(cuò)誤,應(yīng)該在頭文件里加上如下預(yù)編譯命令。例如,對(duì)于test1.h #ifndef__INCLUDE_TEST1_H__

#define__INCLUDE_TEST1_H__

//…

//test1.h的內(nèi)容

……

#endif說明49class

類名{public:

公有數(shù)據(jù)和函數(shù)protected:

受保護(hù)數(shù)據(jù)和函數(shù)private:

私有數(shù)據(jù)和函數(shù)};類的聲明注意要有分號(hào)50classPeople //People類的聲明{public: //公有成員 People(); //構(gòu)造函數(shù)

People(char*name,intage,charsex);

~People(); //析構(gòu)函數(shù) char* GetName(); //查詢姓名 int GetAge(); //查詢年齡 char GetSex(); //查詢性別 bool SetName(char*n); //設(shè)置姓名 bool SetAge(intage); //設(shè)置年齡

bool SetSex(charsex); //設(shè)置性別private: //私有成員protected: //保護(hù)成員

char m_strName[20]; //姓名,字符串?dāng)?shù)組 int m_nAge; //年齡,整型 char m_cSex; //性別,字符型};類的聲明舉例——People類51類名是有效的標(biāo)識(shí)符,不能是關(guān)鍵字(保留字)數(shù)據(jù)成員在聲明時(shí)不能進(jìn)行初始化數(shù)據(jù)成員不能是正在聲明的類,但可以用指針

訪問控制public,private,protected可以以任意次序出現(xiàn),并可重復(fù)多次有關(guān)類的聲明52類的成員函數(shù)中有兩個(gè)函數(shù)是特殊的,就是構(gòu)造函數(shù)和析構(gòu)函數(shù),它們沒有返回值,且一般不直接調(diào)用這些函數(shù),而是在對(duì)象建立和撤銷時(shí)分別被隱式調(diào)用的。構(gòu)造函數(shù)的函數(shù)名要與類名相同,在創(chuàng)建對(duì)象時(shí)被調(diào)用??梢圆欢x構(gòu)造函數(shù),編譯程序會(huì)自動(dòng)生成一個(gè)缺省的構(gòu)造函數(shù)。析構(gòu)函數(shù)的函數(shù)名是在類名前加上一個(gè)“~”。同上,也可以不定義析構(gòu)函數(shù),編譯程序會(huì)自動(dòng)生成一個(gè)缺省的析構(gòu)函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)53在類的構(gòu)造函數(shù)中,一般要完成一些初始化的任務(wù)。例如將一些指針賦值為NULL,給一些變量賦初值,或者為一些指針分配空間等。還可以利用函數(shù)的重載,聲明并實(shí)現(xiàn)多種構(gòu)造函數(shù),以完成不同的初始化任務(wù)。(參見People類)在類的析構(gòu)函數(shù)中,一般要進(jìn)行一些收尾工作,如空間的釋放。如對(duì)于為指針分配的空間,要加以釋放,等。構(gòu)造函數(shù)和析構(gòu)函數(shù)54public:

公有成員,可以被任何函數(shù)訪問(即可以從類的外部進(jìn)行訪問)。private:

私有成員,只有類成員函數(shù)和友員類可以訪問。protected:

保護(hù)成員,只有類成員函數(shù)、派生類、友員類可以訪問。缺省方式為private

類成員訪問控制55People::People() //構(gòu)造函數(shù){ //函數(shù)體開始 //初始化名字為空串 memset(m_strName,0,sizeof(m_strName)); //初始化年齡為0 m_nAge=0; //初始化性別為’0’ m_cSex='0';} //函數(shù)體結(jié)束People::~People(){} //析構(gòu)函數(shù)類的實(shí)現(xiàn)——People類56People::People(char*name,intage=0,charsex=‘0’)//構(gòu)造函數(shù){ //函數(shù)體開始 if(name!=NULL) //初始化m_strname strcpy(m_strName,name); else //如果name為空,則初始化m_strname為空 memset(m_strName,0,sizeof(m_strName)); if((age>=0)&&(age<=200)) //初始化年齡m_nAge { m_nAge=age; } else m_nAge=0; //age不合法,則將m_nAge初始化為0 switch(sex) //初始化性別m_cSex { case‘M’:m_cSex=‘M’;break; //‘M’表示男 case‘F’:m_cSex=‘F’;break; //‘F’表示女 default:m_cSex=‘0’; //‘0’表示未賦值 }}57//查詢姓名的成員函數(shù)char*People::GetName(){ returnm_strName; //返回姓名}//查詢年齡的成員函數(shù)intPeople::GetAge(){ returnm_nAge; //返回年齡}//查詢性別的成員函數(shù)charPeople::GetSex(){ returnm_cSex; //返回性別}//用于設(shè)置的成員函數(shù)的實(shí)現(xiàn)不在此列出//……58voidmain() //主函數(shù){ PeopleA;

//聲明類People的對(duì)象A PeopleB("LiSi");//聲明類People的對(duì)象B,參數(shù)"LiSi"

//聲明類People指針,并構(gòu)造實(shí)例 People*C=newPeople("ZhangSan",20,'M'); A.SetName(“WangWu”);//對(duì)對(duì)象A設(shè)置名字 cout<<“A‘sname:”<<A.GetName()<<endl;//輸出A的信息 cout<<"A'sage:"<<A.GetAge()<<endl; cout<<"A'ssex:"<<A.GetSex()<<endl<<endl; cout<<“B‘sname:”<<B.GetName()<<endl;//輸出B的信息 cout<<"B'sage:"<<B.GetAge()<<endl; cout<<“B‘ssex:”<<B.GetSex()<<endl<<endl; cout<<“C‘sname:”<<C->GetName()<<endl;//輸出C的信息 cout<<"C'sage:"<<C->GetAge()<<endl; cout<<"C'ssex:"<<C->GetSex()<<endl<<endl; deleteC; //釋放指針C所指的空間}59A'sname:WangWuA'sage:0A'ssex:0B'sname:LiSiB'sage:0B'ssex:0C'sname:ZhangSanC'sage:20C'ssex:M程序運(yùn)行結(jié)果60//聲明類People的對(duì)象A,調(diào)用沒有參數(shù)的構(gòu)造函數(shù)PeopleA;//聲明類People的對(duì)象B,參數(shù)"LiSi"PeopleB("LiSi");//聲明類People指針,并動(dòng)態(tài)構(gòu)造實(shí)例People*C=newPeople("ZhangSan",20,'M');或: People*C;

C=newPeople("ZhangSan",20,'M');類對(duì)象的聲明61PeopleA(“ZhangSan”),B; //聲明People的對(duì)象A和BB=A; //用A初始化對(duì)象B對(duì)象的復(fù)制說明: 這種對(duì)象復(fù)制可以將A的所有數(shù)據(jù)成員的值賦給B,如果對(duì)象的數(shù)據(jù)成員中不存在指針,則沒有問題,但如果其中含有指針,則這種方式只是簡(jiǎn)單地把指針?biāo)赶虻膬?nèi)容的地址復(fù)制過來,并沒有復(fù)制其所指的內(nèi)容。這可能并不是用戶所期望的。這要通過自定義的復(fù)制策略來實(shí)現(xiàn):拷貝構(gòu)造函數(shù)和重載運(yùn)算符“=”。62繼承 繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特點(diǎn)之一。它描述了類之間的is-a的關(guān)系。如果類B繼承類A,則稱類A是類B的基類(或父類),類B是類A的派生類(或子類)。63classStudent:publicPeople{public:

Student(); //構(gòu)造函數(shù)

~Student(); //析構(gòu)函數(shù)

intGetNumber(); //查詢學(xué)號(hào)

boolSetNumber(intn); //設(shè)置學(xué)號(hào)private:

protected:

int m_nNumber; //學(xué)號(hào)};舉例——Student類 類聲明第一行后面的“:publicPeople”指明了Student類繼承自People類。public是繼承訪問控制,用于指明繼承成員在子類中的訪問控制。這樣,類People中的一些成員就會(huì)被Student類自動(dòng)繼承了。64繼承成員的訪問控制父類訪問控制繼承訪問控制子類訪問控制public

protected

privatepublicpublic

protected

不可訪問public

protected

privateprotectedprotected

protected

不可訪問public

protected

privateprivateprivate

private

不可訪問65繼承成員的訪問控制父類中的私有成員不能繼承

繼承訪問控制為public時(shí),繼承父類的訪問控制繼承訪問控制不是public時(shí),子類中繼承成員的訪問控制與繼承訪問控制相同66類型兼容性 C++語言中,允許且僅允許公有派生類兼容基類。這就是說,子類的對(duì)象可以賦值給父類的對(duì)象,指向父類的指針可以指向子類。反之則不正確。例:classChild:publicFather

Father*father; //聲明Father對(duì)象指針

Child*child; //聲明Child對(duì)象指針

//動(dòng)態(tài)創(chuàng)建對(duì)象

//…

father=child; //正確

child=father; //錯(cuò)誤67多態(tài)性 如前所述,在程序中同一符號(hào)或名字在不同情況下具有不同解釋的現(xiàn)象稱為多態(tài)性。在面向?qū)ο蟪绦蛟O(shè)計(jì)語言中,由程序員設(shè)計(jì)的多態(tài)性由兩種基本形式:編譯時(shí)多態(tài)性和運(yùn)行時(shí)多態(tài)性。運(yùn)行時(shí)多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)語言的一大特點(diǎn)。68編譯時(shí)多態(tài)性 編譯時(shí)多態(tài)性是指在程序編譯階段即可確定下來的多態(tài)性,主要通過使用重載機(jī)制獲得,重載機(jī)制包括函數(shù)重載和運(yùn)算符重載兩大類。 在聲明函數(shù)原型時(shí)只要形式參數(shù)的個(gè)數(shù)或類型不同,就可以使用相同的函數(shù)名。只有返回值的不同同名函數(shù),并不認(rèn)為是不同的函數(shù)。運(yùn)算符重載允許程序員重新定義C++語言已有的運(yùn)算符。69函數(shù)重載intAdd(inta,intb); //整數(shù)加法floatAdd(floata,floatb); //單精度加法doubleAdd(doublea,doubleb);//雙精度加法intAbs(inta); //整數(shù)的絕對(duì)值floatAbs(floata); //單精度數(shù)的絕對(duì)值doubleAbs(doublea); //雙精度數(shù)的絕對(duì)值 對(duì)于普通函數(shù)和類成員函數(shù)都可以進(jìn)行函數(shù)的重載,構(gòu)造函數(shù)也可以重載。70運(yùn)算符重載 運(yùn)算符可以理解為函數(shù),一元、二元運(yùn)算符分別認(rèn)為是具有一個(gè)、兩個(gè)參數(shù)的函數(shù)。那么,對(duì)一個(gè)n維矢量類,我們可以重載“+”,“-”運(yùn)算符,以實(shí)現(xiàn)矢量的加減運(yùn)算。例classVector:Vectoroperator+(constVector&Vec);//加法Vectoroperator-(constVector&Vec);//減法Vectoroperator-(); //求反Vectoroperator=(constVector&Vec);//賦值71 運(yùn)行時(shí)多態(tài)性是指必須等到程序動(dòng)態(tài)運(yùn)行時(shí)才可確定的多態(tài)性,主要通過繼承結(jié)合動(dòng)態(tài)綁定獲得。這與類的繼承密切相關(guān)。因?yàn)榇嬖陬愋偷募嫒菪裕杂行┖瘮?shù)只有在運(yùn)行時(shí)才能確定是調(diào)用父類的還是子類的函數(shù)。在C++中,使用虛函數(shù)(VirtualFunctions)來實(shí)現(xiàn)。運(yùn)行時(shí)多態(tài)性72 虛成員函數(shù)主要用于要在子類(派生類)中重新定義此函數(shù)。virtual只需要在父類中定義,子類中對(duì)應(yīng)的函數(shù)會(huì)默認(rèn)為虛函數(shù)。子類中重新定義的函數(shù)必須與父類中的函數(shù)參數(shù)和返回值相同。不過,只有返回值不同,不會(huì)被認(rèn)為與原函數(shù)不同。虛成員函數(shù)virtual73classA //聲明類A{public: //公有成員

virtualShowData(); //虛函數(shù),顯示數(shù)據(jù)protected: //保護(hù)成員 intm_nData; //數(shù)據(jù)成員};classB:publicA //聲明類B,繼承A{public: //公有成員

virtualShowData(); //虛函數(shù),顯示數(shù)據(jù)};74voidmain(){ A*a=newA(),*c;//聲明A類指針a,c,并創(chuàng)建a對(duì)象 B*b=newB(); //聲明B類指針b,并創(chuàng)建對(duì)象 c=a;

c->ShowData(); //調(diào)用A類的函數(shù)

c=b; c->ShowData(); //調(diào)用B類的函數(shù)} 如果ShowData()不是虛函數(shù),則不管c指向父類還是子類的對(duì)象,所調(diào)用的都是父類的函數(shù)。751虛函數(shù)僅適用于有繼承關(guān)系的類對(duì)象,所以只有類的成員函數(shù)才能說明為虛函數(shù)。2靜態(tài)成員函數(shù)不能是虛函數(shù)3內(nèi)聯(lián)(inline)函數(shù)不能是虛函數(shù)4構(gòu)造函數(shù)不能是虛函數(shù)5析構(gòu)函數(shù)可以是虛函數(shù)虛函數(shù)的限制76【1】《面向?qū)ο笙到y(tǒng)分析與設(shè)計(jì)》RonaldJ.Norman著,周之英等譯,2000【2】《面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)》,李師賢,李文軍,周曉聰編著,高等教育出版社,1998【3】

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論