![面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)課件_第1頁(yè)](http://file4.renrendoc.com/view/6b4eb3a1f0261389a1d5874bd45262c2/6b4eb3a1f0261389a1d5874bd45262c21.gif)
![面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)課件_第2頁(yè)](http://file4.renrendoc.com/view/6b4eb3a1f0261389a1d5874bd45262c2/6b4eb3a1f0261389a1d5874bd45262c22.gif)
![面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)課件_第3頁(yè)](http://file4.renrendoc.com/view/6b4eb3a1f0261389a1d5874bd45262c2/6b4eb3a1f0261389a1d5874bd45262c23.gif)
![面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)課件_第4頁(yè)](http://file4.renrendoc.com/view/6b4eb3a1f0261389a1d5874bd45262c2/6b4eb3a1f0261389a1d5874bd45262c24.gif)
![面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)課件_第5頁(yè)](http://file4.renrendoc.com/view/6b4eb3a1f0261389a1d5874bd45262c2/6b4eb3a1f0261389a1d5874bd45262c25.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ì)基礎(chǔ)課件面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)課件6.1 面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)概述基本概念 Object Oriented Programming 對(duì)象:現(xiàn)實(shí)世界的實(shí)體,每個(gè)對(duì)象都有所屬的類 類: 對(duì)一組對(duì)象共同具有的屬性和行為的抽象, 具有封裝和隱藏性、還具有繼承性。 消息:向某對(duì)象請(qǐng)求服務(wù)的一種表達(dá)方式,是對(duì) 象與外界、對(duì)象與其它對(duì)象之間聯(lián)系的工具 方法:對(duì)某對(duì)象接受消息后所采取的操作的描述。6.1 面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)概述基本概念 Object特點(diǎn)封裝性繼承性多態(tài)性C+中,通過(guò)類和對(duì)象實(shí)現(xiàn)對(duì)數(shù)據(jù)的封裝,使得程序的修改維護(hù)更方便。是OOP的基礎(chǔ)。連接類與類的層次模型,利用現(xiàn)有類派
2、生出新類的過(guò)程稱為類繼承,支持代碼重用、提供了無(wú)限重復(fù)利用程序資源的途徑、節(jié)省程序開發(fā)的時(shí)間和資源,是OOP的關(guān)鍵。發(fā)出同樣的消息被不同類型的對(duì)象接收時(shí)導(dǎo)致完全不同的行為,是OOP的重要補(bǔ)充特點(diǎn)C+中,通過(guò)類和對(duì)象實(shí)現(xiàn)對(duì)數(shù)據(jù)的封裝,使得程序的修改說(shuō)明結(jié)構(gòu)類型的關(guān)鍵字 6.2 結(jié)構(gòu)C+中的類從C語(yǔ)言中的結(jié)構(gòu)概念演變而來(lái) 結(jié)構(gòu)類型說(shuō)明形式struct 結(jié)構(gòu)類型標(biāo)識(shí)符結(jié)構(gòu)成員1; 結(jié)構(gòu)成員2;結(jié)構(gòu)成員n;類型可任意(不能為該結(jié)構(gòu)自身)說(shuō)明結(jié)6.2 結(jié)構(gòu)C+中的類從C語(yǔ)言中的結(jié)構(gòu)概念演變而來(lái) struct date int month; int day; int year; struct man ch
3、ar name15; char sex; int age; date birthday;如,說(shuō)明一個(gè)結(jié)構(gòu)類型date,含三個(gè)整型數(shù)據(jù)成員在此基礎(chǔ)上,又可說(shuō)明另一個(gè)結(jié)構(gòu)類型manbirthdayNamesexagemonthdayyear struct man結(jié)構(gòu)類型struct date struct man如,說(shuō)明一個(gè)結(jié)構(gòu)變量定義先說(shuō)明結(jié)構(gòu)類型再定義結(jié)構(gòu)變量在說(shuō)明結(jié)構(gòu)數(shù)據(jù)類型的同時(shí)定義結(jié)構(gòu)變量省略結(jié)構(gòu)標(biāo)識(shí)符直接定義結(jié)構(gòu)類型變量struct man man1, man2;struct man char name15;char sex;int age; struct date birthday;
4、 man1, man2;struct char name15;char sex;int age; struct date birthday; man1, man2;無(wú)類型名變量結(jié)構(gòu)變量定義先說(shuō)明結(jié)構(gòu)類型再定義結(jié)構(gòu)變量struct man結(jié)構(gòu)變量的引用形式: 結(jié)構(gòu)變量名.成員名(*指向結(jié)構(gòu)的指針).成員名 指向結(jié)構(gòu)的指針-成員名或或通過(guò)指向結(jié)構(gòu)的指針引用結(jié)構(gòu)變量成員成員訪問(wèn)運(yùn)算符優(yōu)先級(jí)最高的四個(gè)運(yùn)算符之一 括號(hào)不能少如,假設(shè)有定義man m,*p=&m; strcpy (, Fang Min);p-birthday.month = 8; 則可如下引用結(jié)構(gòu)成員結(jié)構(gòu)變量的引用形式: 結(jié)構(gòu)
5、變量名.成員名或或通過(guò)指6.3 類和對(duì)象引例定義一有關(guān)職工工資信息的結(jié)構(gòu)類型,對(duì)某職工的該類信息進(jìn)行處理。職工信息包括姓名、基本工資、崗位工資和職務(wù)工資;對(duì)該類信息的處理包括輸入、輸出和求總收入情況。 #include iostream.hstruct stuffchar name10; double jw,gw,zw;s ; void print( ):s.jws.gws.zw;double salary( )double sum=0; sum=sum+s.jw+s.gw+s.zw; return sum;void main()in
6、put( ); print( ); coutsalary( );結(jié)構(gòu)化的方法6.3 類和對(duì)象引例定義一有關(guān)職工工資信息的結(jié)構(gòu)類型,對(duì)結(jié)構(gòu)化程序的框架結(jié)構(gòu)化程序結(jié)構(gòu)化程序的框架結(jié)構(gòu)化程序#include iostream.hclass stuffprivate: char name10; double jw,gw,zw;public:void print( )coutname:jwtgwtzwnamejwgwzw; double salary( )double sum=0; sum=sum+jw+gw+zw; return sum;void main()stuff s; s.input( );
7、s.print( ); couts.salary( );以面向?qū)ο蟮姆绞綄?shí)現(xiàn)#include iostream.hdouble sa面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)課件6.3.1 類的定義類是一種復(fù)雜的數(shù)據(jù)類型,它是將不同類型的數(shù)據(jù)和與這些數(shù)據(jù)相關(guān)的運(yùn)算封裝在一起的集合體,定義格式:class 類名public: ; private: ; protected: ;; 6.3.1 類的定義類是一種復(fù)雜的數(shù)據(jù)類型,它是將不同類型說(shuō)明:定義包括說(shuō)明部分和實(shí)現(xiàn)部分。若成員函數(shù)在說(shuō)明部分已定義,則實(shí)現(xiàn)部分可省略;若成員函數(shù)在類體外實(shí)現(xiàn),需用類名和作用域運(yùn)算符(:)標(biāo)識(shí)所屬類。訪問(wèn)權(quán)限修飾符:public(公有)、p
8、rivate(私有 )和 protected(保護(hù)) 缺省時(shí)為private。公有成員通常為成員函數(shù),可在程序中引用,私有成員通常是數(shù)據(jù)成員,只有成員函數(shù)或友元函數(shù)才可引用。類體中不允許對(duì)數(shù)據(jù)成員初始化。class Bprivate: int year=2002, month=10, day=12;錯(cuò)說(shuō)明:class B錯(cuò) 例6-1:定義一個(gè)Circle類(圓類),包括如下的一些數(shù)據(jù)成員 和成員函數(shù).數(shù)據(jù)成員成員函數(shù)名稱含義名稱功能x圓心坐標(biāo)x值set設(shè)置數(shù)據(jù)成員值y圓心坐標(biāo)y值print輸出數(shù)據(jù)成員值r圓半徑area求圓的面積lenth求圓的周長(zhǎng) 例6-1:定義一個(gè)Circle類(圓類),包
9、括如下的一class Circleprivate: double x,y,r; public: void print( ); void set(double x1,double y1,double r1); double area( ) return (3.14*r*r); double lenth() return(2*3.14*r);void Circle:print()cout圓心:(x,y)endl; cout半徑:r成員名類成員的訪問(wèn)方式類內(nèi): (成員函數(shù)訪問(wèn)數(shù)據(jù)成員)直接訪問(wèn)類成員類外: (外部程序訪問(wèn)類的成員函數(shù))訪問(wèn)方式同結(jié)構(gòu)成員,具體如下:對(duì)象名成員名類成員的訪問(wèn)方式例6-2
10、編制主函數(shù),通過(guò)例6-1中定義的Circle類,對(duì)圓心在原點(diǎn),半徑為2的圓和圓心在點(diǎn)(1,1)上,半徑為4的圓進(jìn)行測(cè)試。 void main()Cirlce p1,*p2; p1.set(0,0,1); p1.print( ); coutp1.areatp1.lenthset(1,1,4); p2-print( ); coutareatlenthendl;例6-2編制主函數(shù),通過(guò)例6-1中定義的Circle類,6.3.3 對(duì)象的初始化1.構(gòu)造函數(shù)和析構(gòu)函數(shù)例6-3 看例6-2的另一種實(shí)現(xiàn)class Circleprivate: double x,y,r; public: void print(
11、 ); Circle(double x1,double y1,double r1); double area( ) return (3.14*r*r); double lenth() return(2*3.14*r);Circle:Circle(double x1,double y1,double r1) x=x1; y=y1; r=r1;/其它函數(shù)實(shí)現(xiàn)略void main() Circle p (0,0,2); p.print(); 1.定義的同時(shí)初始化對(duì)象2.省略對(duì)賦初值成員函數(shù)的額外調(diào)用6.3.3 對(duì)象的初始化class Circlevoi構(gòu)造函數(shù)特點(diǎn)析構(gòu)函數(shù)特點(diǎn):若一個(gè)對(duì)象被定義在函數(shù)
12、體內(nèi),則當(dāng)該函數(shù)結(jié)束時(shí), 該對(duì)象的析構(gòu)函數(shù)被自動(dòng)調(diào)用。當(dāng)一個(gè)對(duì)象是使用new運(yùn)算符被動(dòng)態(tài)創(chuàng)建的,在使用delete釋放時(shí),析構(gòu)函數(shù)將會(huì)被自動(dòng)調(diào)用是成員函數(shù),可寫在類體內(nèi),亦可寫在類體外。函數(shù)名同類名,不能指定函數(shù)類型,可以帶參數(shù)??芍剌d,即可定義多個(gè)參數(shù)個(gè)數(shù)不同的函數(shù)。在創(chuàng)建對(duì)象時(shí)由系統(tǒng)自動(dòng)調(diào)用,程序中不能直接調(diào)用。是成員函數(shù),可寫在類體內(nèi),亦可寫在類體外。函數(shù)名同類名,前面多個(gè)字符“” ,不指定類型,無(wú)參。不可重載,即一個(gè)類只能定義一個(gè)析構(gòu)函數(shù)??杀徽{(diào)用,也可由系統(tǒng)調(diào)用。系統(tǒng)自動(dòng)調(diào)用情況如下:構(gòu)造函數(shù)特點(diǎn)若一個(gè)對(duì)象被定義在函數(shù)體內(nèi),則當(dāng)該函數(shù)結(jié)束時(shí), 2.缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù)形式:說(shuō)明
13、:若沒(méi)有定義任何構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)生成上述無(wú)參的缺省構(gòu)造函數(shù)及析構(gòu)函數(shù)若定義一個(gè)靜態(tài)對(duì)象而沒(méi)有指明初始化時(shí),編譯器會(huì)按缺省構(gòu)造函數(shù)對(duì)對(duì)象的所有數(shù)據(jù)成員都初始化為或空。 :() :( ) 2.缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù):缺省析構(gòu)函數(shù)名例6.3 定義一個(gè)Circle1類,具有求一個(gè)圓的面積、求兩個(gè)圓的面積之和,以及輸出面積等功能 。#include iostream.hclass Circle1private: double x,y,r,s; public: void print()cout圓心:(x,y)endl; cout半徑:rendl; Circle1() Circle1(double
14、x1,double y1,double r1) x=x1; y=y1; r=r1; void addarea(Circle1 p1,Circle1 p2) s=3.14*(p1.r*p1.r)+3.14*(p2.r*p2.r); void disp() cout面積:sendl;void main() Circle1 p1(0,0,2),p2(1,1,4),p3; p1.print(); p2.print(); p3.addarea(p1,p2); p3.disp();可缺省嗎?驗(yàn)證一下初始化了嗎例6.3 定義一個(gè)Circle1類,具有求一個(gè)圓的面積#include #include clas
15、s countint num; public: count(); count(); void process(); ; count:count() num=0;count:count() cout字符個(gè)數(shù):numendl; void count:process() while(cin.get()!=n) num+; coutendl; void main()count c; cout輸入一個(gè)句子: ; cess();例6.4 析構(gòu)函數(shù)示例析構(gòu)函數(shù)中輸出處理結(jié)果(未設(shè)專門輸出函數(shù))析構(gòu)函數(shù)在程序結(jié)束前由系統(tǒng)自動(dòng)調(diào)用#include count:c3.拷貝初始化構(gòu)造函數(shù) 例6.5#inc
16、lude iostream.hclass Circle1private: double x,y,r,s; public: void print() cout圓心:(x,y)endl; cout半徑:rendl; Circle1(double x1,double y1,double r1) x=x1; y=y1; r=r1;Circle1( Circle1 &p)x=p.x; y=p.y, r=p.r;void main()Circle1 p1(0,0,2),p2(p1); p1.print(); p2.print();用于用已知對(duì)象初始化被創(chuàng)建的同類對(duì)象只有一個(gè)參數(shù),且是對(duì)某個(gè)對(duì)象的引用常用于
17、做函數(shù)的形參及返回值拷貝初始化構(gòu)造函數(shù)(引用做參數(shù))已知對(duì)象做初值3.拷貝初始化構(gòu)造函數(shù)#include iostream.6.3.4常對(duì)象和常成員 1.常成員函數(shù)形式:類型說(shuō)明符 函數(shù)名(參數(shù)表) const不修改對(duì)象數(shù)據(jù)成員的成員函數(shù)才能聲明為const函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)不能聲明為const只有常成員函數(shù)可以操作常對(duì)象說(shuō)明:例6.6常成員函數(shù)示例6.3.4常對(duì)象和常成員 1.常成員函數(shù)類型說(shuō)明符 函數(shù)名#include iostream.hclass Timeprivate: int hour,minute,second; public: Time:Time() Time:Time(i
18、nt h,int m,int s) hour=h; minute=m; second=s; void settime(int h,int m,int s) hour=h; minute=m; second=s; void print()const couthour:minute:secondendl;void main()Time t1; const Time t2(10,23,34);/定義t2為常對(duì)象 t1.settime(11,15,20); t1.print(); /t2.settime(4,12,15); t2.print();前面的解釋符可去掉嗎不修改數(shù)據(jù)成員,定義為常函數(shù)sett
19、ime函數(shù)可聲明為const嗎#include iostream.h前面的解釋符可去掉2.常數(shù)據(jù)成員 對(duì)不應(yīng)該被修改的數(shù)據(jù)成員聲明為const,可使其受到強(qiáng)制保護(hù),初始化方式與一般數(shù)據(jù)成員不同。class Decrement private: int num; const int dec; /將dec聲明為常數(shù)據(jù)成員 public: Decrement(int n,int d):dec(d) num=n; void fdec() num=num-dec; void print()const coutnum=num,dec=decendl; ;初始化列表的方式初始化2.常數(shù)據(jù)成員 對(duì)不應(yīng)該被修改
20、的數(shù)據(jù)成員聲明為cons6.3.5靜態(tài)成員 靜態(tài)成員的提出是為了解決數(shù)據(jù)共享的問(wèn)題,它比全局變量在實(shí)現(xiàn)數(shù)據(jù)共享時(shí)更為安全,是實(shí)現(xiàn)同類多個(gè)對(duì)象數(shù)據(jù)共享的好方法。在類中,分為靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)。1。靜態(tài)數(shù)據(jù)成員初始化格式:數(shù)據(jù)類型 類名:靜態(tài)數(shù)據(jù)成員=值是類的成員,被所有對(duì)象所共享,在內(nèi)存中只存貯一次定義或說(shuō)明時(shí)前面加關(guān)鍵字static初始化在類外進(jìn)行,不加static和訪問(wèn)權(quán)限修飾符6.3.5靜態(tài)成員數(shù)據(jù)類型 類名:靜態(tài)數(shù)據(jù)成員=值是類例6.7 靜態(tài)數(shù)據(jù)成員示例程序 通過(guò)以下程序了解靜態(tài)數(shù)據(jù)成員的聲明、初始化的位置和限定及具有類對(duì)象共享的屬性。#include class Tcprivate
21、: int i; static int k; public: Tc( ) i=0; i+; k+; void display() couti,1創(chuàng)建B時(shí)k值1-2。1,21,2例6.7 靜態(tài)數(shù)據(jù)成員示例程序#include io2.靜態(tài)成員函數(shù)調(diào)用形式: 靜態(tài)成員函數(shù)中數(shù)據(jù)成員的引用也有區(qū)別: 例6.8靜態(tài)成員函數(shù)應(yīng)用程序示例靜態(tài)成員函數(shù)是類的成員函數(shù),而非對(duì)象的成員。類名:靜態(tài)成員函數(shù)名(參數(shù)表)對(duì)靜態(tài)數(shù)據(jù)成員,直接引用對(duì)非靜態(tài)數(shù)據(jù)成員,通過(guò)對(duì)象引用2.靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)是類的成員函數(shù),而非對(duì)象的成員。#include class Tcprivate: int A; static in
22、t B; public: Tc(int a) A=a; B+=a; static void display(Tc C) coutC.AB; ;int Tc:B=2;void main() Tc A(2),B(4); Tc:display(A); Tc:display(B); 靜態(tài)成員函數(shù)的調(diào)用非靜態(tài)數(shù)據(jù)成員的引用靜態(tài)數(shù)據(jù)成員的引用 通過(guò)該程序了解程序中靜態(tài)成員函數(shù)的調(diào)用方式以及靜態(tài)成員函數(shù)中靜態(tài)數(shù)據(jù)成員和非靜態(tài)數(shù)據(jù)成員的引用方式#include void main6.3.6 友元函數(shù) 例6.9友元函數(shù)示例程序#include #include class Cpointprivate: int
23、X,Y; public: Cpoint(int x, int y) X=x; Y=y; void print(); friend double dist(Cpoint &a,Cpoint &b); ;void Cpoint:print() coutXY ;double dist(Cpoint &a,Cpoint &b) int dx=a.X-b.X; int dy=a.Y-b.Y; return sqrt(dx*dx+dy*dy);void main()Cpoint p1(3,4),p2(6,8); p1.print(); p2.print(); double d=dist(p1,p2); /
24、*友元不是成員函數(shù)不需對(duì)象表示,直接調(diào)用*/ coutDistance is dendl; 友元函數(shù)說(shuō)明前不能加 friend為非成員函數(shù)可訪問(wèn)類中私有成員說(shuō)明時(shí)前面加關(guān)鍵字friend標(biāo)識(shí)6.3.6 友元函數(shù)#include iostream.h計(jì)算機(jī)系人員學(xué)生研究生本科生系主任行政管理人員教務(wù)教師教職工6.4 繼承和派生基類(父類)派生類(子類)多繼承單繼承計(jì)算機(jī)系人員學(xué)生研究生本科生系主任行政管理人員教務(wù)教師教職工class Cylinder1:public Circleprivate: double h; public: void print() Circle:print(); cou
25、t圓柱高:hendl; void set(double x1,double y1, double r1,double h1) Circle:set(x1,y1,r1); h=h1; ;class Cylinderprivate: double x,y,r,h; public: void print() cout圓心:(x, y)endl; cout半徑:r ,圓柱高:hendl; void set(double x1,double y1, double r1,double h1) x=x1; y=y1; r=r1; h=h1;對(duì)比如下兩個(gè)圓柱體類的定義全部數(shù)據(jù)成員重新定義只定義一個(gè)新成員(Ci
26、rcle中沒(méi)有)通過(guò)調(diào)用Circle類成員函數(shù)輸出Circle類成員從Circle類中派生而來(lái)class Cylinder1:public Circle6.4.2單繼承 1.派生類的定義格式原有類(父類)class 派生類名: 繼承方式 基類名 派生類新定義成員;public(公有基類)private(私有基類)protected(保護(hù)基類) 若要在派生類Cylinder1中再增加一個(gè)成員函數(shù)volume,用以求圓柱體的體積,則該成員函數(shù)能否如下實(shí)現(xiàn):double Cylinder1:volume()return(3.14*r*r*h);錯(cuò)!r是Circle類的私有成員,不能被派生類訪問(wèn)6.4
27、.2單繼承 原有類(父類)class 派生類名: 繼承2.繼承方式public,private和protected 是三種常用的繼承方式,繼承方式的不同決定了派生類對(duì)基類成員的訪問(wèn)權(quán)限不同?;愃接谐蓡T(private) 公有成員(public)保護(hù)成員(protected)私有派生類(private)不可訪問(wèn)的成員私有成員私有成員公有派生類(public)不可訪問(wèn)的成員公有成員保護(hù)成員保護(hù)派生類(protected)不可訪問(wèn)的成員保護(hù)成員保護(hù)成員派生類的繼承關(guān)系2.繼承方式基類私有成員公有成員保護(hù)成員私有派生類不可訪問(wèn)的例6.10分析下列程序中的訪問(wèn)權(quán)限,并回答所提的問(wèn)題。#include
28、class Apublic: void f1(); A( ) i1=10;j1=11; protected: int j1; private: int i1; ;class B:public Apublic: void f2( ); B( ) i2=20;j2=21; protected: int j2; private: int i2; ;class C:public Bpublic: void f3(); C( ) i3=30;j3=31; protected: int j3; private: int i3; ;void main()A a; B b; C c; (1) f2()能否訪問(wèn)
29、f1(),i1,j1?能訪問(wèn)f1()、j1,不能訪問(wèn)i1(2) 能否訪問(wèn)f(),i1,j1?能訪問(wèn)f1(),不能訪問(wèn)i1和j1(3) f3()能否訪問(wèn)f2()、i2和j2,以及f1(),j1和i1?f3能訪問(wèn)f2()和j2,以及f1()和j1,但不能訪問(wèn)i1和i2(4)c能否訪問(wèn)f2(),i2和j2?以及f1(),j1和i1?能訪問(wèn)f2()和f1(),其它的都不能訪問(wèn)例6.10分析下列程序中的訪問(wèn)權(quán)限,并回答所提的問(wèn)題。#include iostream.hclass Circleprivate: double x,y,r; public: void print() cout圓心:(x,y);
30、 coutendl半徑:rendl; void set(double x1,double y1,double r1) x=x1; y=y1; r=r1; double getr() return r;class Cylinder1:public Circleprivate: double h; public: void print() Circle:print(); cout圓柱高:hendl; void set(double x1,double y1, double r1,double h1) Circle:set(x1,y1,r1); h=h1; double volume() doubl
31、e R=getr(); return(3.14*R*R*h); ;void main()Cylinder1 p; p.set(0,0,2,3); p.print(); coutvolume=p.volume(); 該函數(shù)返回值為圓半徑,為派生類能使用半徑提供一個(gè)接口 派生類可訪問(wèn)基類公有成員例6.11派生類示例程序#include iostream.hclass Cyl3.構(gòu)造函數(shù)和析構(gòu)函數(shù) 派生類的構(gòu)造函數(shù)除了對(duì)自己的數(shù)據(jù)成員初始化外,還負(fù)責(zé)調(diào)用基類構(gòu)造函數(shù)使基類的數(shù)據(jù)成員得以初始化,當(dāng)對(duì)象被刪除時(shí),派生類的析構(gòu)函數(shù)被執(zhí)行,同時(shí)基類的析構(gòu)函數(shù)也將被調(diào)用。格式:派生類名(派生類構(gòu)造函數(shù)總參數(shù)表
32、):基類構(gòu)造函數(shù)(參數(shù)表1) ; 基類中有缺省的構(gòu)造函數(shù)或沒(méi)定義構(gòu)造函數(shù),則派生類構(gòu)造函數(shù)的定義中可省略對(duì)基類構(gòu)造函數(shù)的調(diào)用,而隱式調(diào)用缺省構(gòu)造函數(shù)。基類構(gòu)造函數(shù)中,只有有參的構(gòu)造函數(shù),則派生類構(gòu)造函數(shù)中必須 調(diào)用基類構(gòu)造函數(shù),提供將參數(shù)傳遞給基類構(gòu)造函數(shù)的途徑派生類構(gòu)造函數(shù)的調(diào)用順序?yàn)橄然?,后派生類。派生類析?gòu)函數(shù)的執(zhí)行順序?yàn)橄扰缮?,后基類?說(shuō)明:3.構(gòu)造函數(shù)和析構(gòu)函數(shù)派生類名(派生類構(gòu)造函數(shù)總參數(shù)表):基#includeiostream.h#include string.hclass Staffprivate: char name30; char sex; float wage; p
33、ublic:void display()coutname:sex, ageendl; Staff(char *n,char s,float w) strcpy(name,n); sex=s; wage=w; ;class Staff1:public Staffprivate: int wt;public:Staff1(char *n,char s,float w,int t):Staff(n,s,w)wt=t;double addwage()return(wt/10*80);void display() Staff:display(); coutwt, addwage()endl;void m
34、ain()Staff1s(WangQiang,m,1526,21); s.display();例6.12派生類構(gòu)造函數(shù)示例程序派生類構(gòu)造函數(shù)中調(diào)用基類構(gòu)造函數(shù) #includeiostream.hclass Staf6.5多態(tài)性 發(fā)出同樣的消息被不同類型的對(duì)象接收時(shí)導(dǎo)致完全不同的行為。函數(shù)重載(已介紹過(guò))運(yùn)算符重載基于虛函數(shù)的多態(tài)性6.5.1 運(yùn)算符重載 賦予已有的運(yùn)算符多重含義,通過(guò)重新定義運(yùn)算符使它能夠用于特定類的對(duì)象以完成特定的功能。 例6.13重載“+”運(yùn)算 ,用以實(shí)現(xiàn)兩個(gè)字符串的連接 6.5多態(tài)性 函數(shù)重載(已介紹過(guò))6.5.1 運(yùn)算符重載 #include iostream.h#i
35、nclude string.h#include stdio.hclass Strprivate: char *s; int len; public: Str() Str(char *s1) len=strlen(s1); s=new charlen; strcpy(s,s1); void print() coutsendl; Str operator+(Str s1) return(strcat(s,s1.s); ;void main() char str1100,str2100; gets(str1); gets(str2); Str s1(str1),s2(str2),s3; s3=s1+
36、s2; s3.print();對(duì)加法運(yùn)算符進(jìn)行重載 s3=s1.operator+(s2) #include iostream.hvoid main重載形式:重載為類的成員函數(shù):類名 operator 運(yùn)算符(參數(shù)表)程序中表達(dá)形式:c1 運(yùn)算符 c2編譯程序解釋形式:c1 operator 運(yùn)算符(c2)重載為類的友元函數(shù):friend類名operator運(yùn)算符(參數(shù)表)程序中表達(dá)形式:c1 運(yùn)算符 c2編譯程序解釋形式:operator 運(yùn)算符(c1,c2)將例6.13中的加法運(yùn)算符重載為友元函數(shù)的形式如下:friend Str operator+(Str s1,Str s2)return
37、(strcat(s1.s,s2.s);隱含了指向c1的this指針重載形式:重載為類的成員函數(shù):重載為類的友元函數(shù):將例6.1this 指針 無(wú)需定義而隱含于每個(gè)類的成員函數(shù)中指向正在被某個(gè)成員函數(shù)操作的對(duì)象可以用*this來(lái)標(biāo)識(shí)調(diào)用該成員函數(shù)的對(duì)象通常情況下,程序中并不顯式地使用this指針 例6.14自增運(yùn)算符重載(this 指針使用示例)this 指針 例6.14自增運(yùn)算符重載(this 指針#include iostream.hclass Aprivate: int x; public: A(int x1) x=x1; void print() coutxendl; A operato
38、r+() x+; return(*this); ;void main()A a(5); (+a).print();返回調(diào)用成員函數(shù)的對(duì)象自身 自增重載運(yùn)算作用于A類對(duì)象a等價(jià)于如下兩條語(yǔ)句:+a;a.print();#include iostream.h返回調(diào)用成員函數(shù)的6.5.3虛函數(shù)虛函數(shù)說(shuō)明方式 虛函數(shù)是動(dòng)態(tài)聯(lián)編的基礎(chǔ),它是一種非static的成員函數(shù)實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編的條件virtual 類型說(shuō)明符 函數(shù)名 (參數(shù)表)基類中有說(shuō)明的虛函數(shù)調(diào)用虛函數(shù)操作的只能是對(duì)象指針或?qū)ο笠?,否則仍為靜態(tài)聯(lián)編例6.15虛函數(shù)示例程序 6.5.3虛函數(shù)虛函數(shù)說(shuō)明方式virtual 類型說(shuō)明符 #includ
39、e iostream.hclass Animalpublic: void character() cout動(dòng)物特征:不同.n; virtual food() cout動(dòng)物食物:不同.n;class Giraffe:public Animalpublic: void character() cout長(zhǎng)頸鹿特征:長(zhǎng)頸.n; virtual food() cout長(zhǎng)頸鹿食物:樹葉.n;class Elephant:public Animalpublic: void character()cout大象特征:長(zhǎng)鼻子.n; virtual food() coutcharacter(); p-food();
40、void main()Giraffe g; f(&g);/實(shí)參為派生類對(duì)象的地址 Elephant e; f(&e);/實(shí)參為派生類對(duì)象的地址觀察運(yùn)行結(jié)果#include iostream.hclass Elevoid f(Animal &p)/形參為基類對(duì)象的引用p.character(); p.food();void main()Giraffe g; f(g);/實(shí)參為派生類對(duì)象 Elephant e; f(e);/實(shí)參為派生類對(duì)象void f(Animal p)/形參為基類對(duì)象p.character(); p.food();void main()Giraffe g; f(g);/實(shí)參為派
41、生類對(duì)象 Elephant e; f(e);/實(shí)參為派生類對(duì)象若將程序的相應(yīng)部分修改為如下兩種形式,再觀察運(yùn)行結(jié)果void f(Animal &p)/形參為基類對(duì)象的從上述程序中可見(jiàn): 只有當(dāng)虛函數(shù)操作的是指向?qū)ο蟮闹羔樆蚴菍?duì)象的引用時(shí),對(duì)該虛函數(shù)調(diào)用采取的才是動(dòng)態(tài)聯(lián)編。虛函數(shù)使用說(shuō)明:派生類中的虛函數(shù)應(yīng)與基類中的虛函數(shù)具有相同的名稱、參數(shù)個(gè)數(shù)及參數(shù)類型。 可以只將基類中的成員函數(shù)顯式地說(shuō)明為虛函數(shù),而派生類中的同名函數(shù)也隱含為虛函數(shù)。從上述程序中可見(jiàn):派生類中的虛函數(shù)應(yīng)與基類中的虛函數(shù)具有相同1.純虛函數(shù) 是一種沒(méi)有函數(shù)體特殊的虛函數(shù),當(dāng)在基類中不能對(duì)虛函數(shù)給出有意義的實(shí)現(xiàn),而將其說(shuō)明為純虛
42、函數(shù),它的實(shí)現(xiàn)留給派生類去做。格式:6.5.4 抽象類 virtual 類型 函數(shù)名 (參數(shù)表)=0;2. 抽象類 是帶有純虛函數(shù)的特殊類,主要作用是將有關(guān)的子類組織在一個(gè)繼承層次結(jié)構(gòu)中,由它來(lái)為它們提供一個(gè)公共的根。1.純虛函數(shù)6.5.4 抽象類 virtual 類型 函只能用作其它類的基類,不能建立抽象類對(duì)象可說(shuō)明抽象類指針和引用,指向其派生類,進(jìn)而實(shí)現(xiàn)多態(tài)性。不能用作參數(shù)類型、函數(shù)返回類型或強(qiáng)制轉(zhuǎn)換的類型。例6.16抽象類示例程序只能用作其它類的基類,不能建立抽象類對(duì)象例6.16抽象類#include #include class baseprotected: int x,y;publi
43、c: virtual void setx(int i,int j=0) x=i; y=j; virtual void disp()=0; ;class square: public basepublic: void disp() coutx*xendl; ;class cube: public basepublic: void disp() coutx*x*xendl; ;class chpow: public basepublic: void disp() coutsetx(5); ptr-disp(); ptr=&C; ptr-setx(6); ptr-disp(); ptr=&D; ptr-setx(3,4); ptr-disp(); 抽象類指針派生類抽象類指針指向不同的派生類對(duì)象B、C、D,實(shí)現(xiàn)多態(tài)性#include class cub6.6 程序舉例類名數(shù)據(jù)成員成員函數(shù)vehicle名稱含義名稱功能wheels車輪個(gè)數(shù)vehicle初始化數(shù)據(jù)成員weight車重getwheels、getweight分別獲得
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年五年級(jí)數(shù)學(xué)下冊(cè) 7 折線統(tǒng)計(jì)圖第1課時(shí) 單式折線統(tǒng)計(jì)圖配套說(shuō)課稿 新人教版001
- 2025城鎮(zhèn)土地開發(fā)和商品房借款合同協(xié)議書范本范文
- 9 生活離不開規(guī)則 (說(shuō)課稿)2023-2024學(xué)年統(tǒng)編版道德與法治三年級(jí)下冊(cè)001
- 2025工地集控室裝飾裝修工程分包合同
- 2025原料玉原料玉米電FEGN子交易合同文本
- 2025二手房交易合同(合同版本)
- 2024年五年級(jí)數(shù)學(xué)上冊(cè) 3 小數(shù)除法練習(xí)課說(shuō)課稿 新人教版
- 2024年高中歷史 第三單元 從人文精神之源到科學(xué)理性時(shí)代 第13課 挑戰(zhàn)教皇的權(quán)威說(shuō)課稿 岳麓版必修3
- Unit 6 Growing Up(說(shuō)課稿)2023-2024學(xué)年人教新起點(diǎn)版英語(yǔ)五年級(jí)下冊(cè)001
- 2024秋七年級(jí)英語(yǔ)下冊(cè) Module 8 Story time Unit 3 Language in use說(shuō)課稿 (新版)外研版
- 【重慶長(zhǎng)安汽車公司績(jī)效管理現(xiàn)狀、問(wèn)題及優(yōu)化對(duì)策(7600字論文)】
- 計(jì)算機(jī)網(wǎng)絡(luò)畢業(yè)論文3000字
- 2023年大學(xué)物理化學(xué)實(shí)驗(yàn)報(bào)告化學(xué)電池溫度系數(shù)的測(cè)定
- 農(nóng)村公共基礎(chǔ)知識(shí)
- 腦出血的護(hù)理課件腦出血護(hù)理查房PPT
- 煤礦機(jī)電運(yùn)輸安全培訓(xùn)課件
- 扣繳個(gè)人所得稅報(bào)告表-(Excel版)
- Unit+4+History+and+Traditions單元整體教學(xué)設(shè)計(jì)課件 高中英語(yǔ)人教版(2019)必修第二冊(cè)單元整體教學(xué)設(shè)計(jì)
- 提高預(yù)埋螺栓安裝一次驗(yàn)收合格率五項(xiàng)qc2012地腳
- 2023年全國(guó)自學(xué)考試00054管理學(xué)原理試題答案
- 六年級(jí)譯林版小學(xué)英語(yǔ)閱讀理解訓(xùn)練經(jīng)典題目(附答案)
評(píng)論
0/150
提交評(píng)論