面向?qū)ο蠹夹g(shù)_第1頁
面向?qū)ο蠹夹g(shù)_第2頁
面向?qū)ο蠹夹g(shù)_第3頁
面向?qū)ο蠹夹g(shù)_第4頁
面向?qū)ο蠹夹g(shù)_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

面向?qū)ο蠹夹g(shù)第一頁,共三十二頁,2022年,8月28日面向?qū)ο蠹夹g(shù)類和對象成員函數(shù)的重載構(gòu)造函數(shù)析構(gòu)函數(shù)繼承MFC——簡單了解第二頁,共三十二頁,2022年,8月28日1.類和對象類是一組性質(zhì)相同的對象的程序描述,它由概括了一組對象共同性質(zhì)的數(shù)據(jù)和函數(shù)組成。對象指的是一個實體的實例,在這個實體中包括了特定的數(shù)據(jù)和對這些數(shù)據(jù)進行操作的函數(shù)。對象的核心概念就是通常所說的

“封裝性”(encapsulation)、

“繼承性”(inheritance)、

“多態(tài)性”(polymorphism)。第三頁,共三十二頁,2022年,8月28日1.類和對象以下描述更易理解類與對象的關(guān)系:類——數(shù)據(jù)類型對象——類的變量第四頁,共三十二頁,2022年,8月28日類例1:classworker{charname[20];//成員數(shù)據(jù)intid;floatsalary;floatsumsal;public:voidsal_year()//成員函數(shù){sumsal=salary*12;}voidprint(){cout<<“工號為”<<id<<“的員工”<<name<<“的年度總工資為:”<<sumsal;}};第五頁,共三十二頁,2022年,8月28日類class<類名>{

private://默認權(quán)限

<私有數(shù)據(jù)成員和成員函數(shù)>;

protected:

<保護數(shù)據(jù)成員和成員函數(shù)>;

public:

<公有數(shù)據(jù)成員和成員函數(shù)>;};第六頁,共三十二頁,2022年,8月28日類類的成員函數(shù)的定義位置1.類中的成員函數(shù)在類定義中直接描述,如例1。2.類的成員函數(shù)也可以另外定義,而在類定義時給出函數(shù)頭。classworker{charname[20];//成員數(shù)據(jù)intid;floatsalary;floatsumsal;public:voidsal_year();//成員函數(shù)voidprint();};voidworker::sal_year()//成員函數(shù){sumsal=salary*12;}voidworker::print(){cout<<“工號為”<<id<<“的員工”<<name<<“的年度總工資為:”<<sumsal;}第七頁,共三十二頁,2022年,8月28日類

結(jié)構(gòu)和類的唯一區(qū)別是:在未指定訪問權(quán)限時,結(jié)構(gòu)中的成員被默認為公有的而類中的成員被默認為私有的。在所有其他方面,類和結(jié)構(gòu)等價。例如:structS{

intX;//公有的

...}classC{

intX;//私有的

...}

盡管類和結(jié)構(gòu)是等價的,但一般在描述數(shù)據(jù)時使用結(jié)構(gòu),在描述數(shù)據(jù)及對數(shù)據(jù)的操作時用類。第八頁,共三十二頁,2022年,8月28日對象在定義類時,系統(tǒng)是不會給類分配存儲空間的,只有定義類對象時才會給對象分配相應(yīng)的內(nèi)存空間。為對象分配存儲空間的大小取決于在定義類時所定義的成員的類型和成員的多少。第九頁,共三十二頁,2022年,8月28日對象對象的說明說明對象的方法與說明結(jié)構(gòu)體變量的方法一樣,也有三種:第一種,先定義類的類型,再說明對象;第二種,在定義類的同時說明對象;第三種,直接說明對象,而不定義類的類名。第十頁,共三十二頁,2022年,8月28日例,用三種方法定義對象

classA{public:intr,t;};Ax,y;classB{inti,j;public:voidSetdata(inta,intb){i=a;j=b;}voidPrint(void){cout<<i<<‘\t’<<j<<endl;}}b1,b2;

class{public:intc,d;}t1,t2;第十一頁,共三十二頁,2022年,8月28日對象對象的使用對象的使用,我們通過一個例子來說明。例:描述一個矩形對象,設(shè)置矩形的坐標,并輸出其相應(yīng)的坐標值。分析:一個矩形可用左上角和右下角的兩個坐標點來描述,左上角坐標用(left,top)來表示,右下角的坐標用(right,bottom)來描述。假定這四個數(shù)的取值均是大于0的正整數(shù)。第十二頁,共三十二頁,2022年,8月28日#include<iostream.h>#include<math.h>classCrect{private:intleft,top;public:intright,bottom;voidsetcoord(int,int,int,int);//設(shè)置坐標值函數(shù)voidgetcoord(int*L,int*R,int*T,int*B)//取坐標值的函數(shù){*L=left;*R=right;*T=top;*B=bottom;}voidPrint(void){cout<<“面積=”<<fabs(right-left)*fabs(bottom-top)<<endl;}};第十三頁,共三十二頁,2022年,8月28日voidCrect::setcoord(intL,intR,intT,intB){left=L;right=R;top=T;bottom=B;}voidmain(){Crectr,rr;inta,b,c,d;r.setcoord(100,300,50,200);

cout<<“right=”<<r.right<<endl;cout<<“bottom=”<<r.bottom<<endl;r.getcoord(&a,&b,&c,&d);cout<<“l(fā)eft=”<<a<<endl;cout<<“top=”<<b<<endl;r.Print();rr=r;rr.Print();}第十四頁,共三十二頁,2022年,8月28日執(zhí)行后輸出:right=300bottom=200left=100top=50

面積=30000

面積=30000第十五頁,共三十二頁,2022年,8月28日結(jié)合上例,有關(guān)對象的使用說明以下幾點:1.要用成員選擇運算符“.”來訪問對象的成員。如r.right和r.getcoord()。當訪問一個成員函數(shù)時,也稱為向?qū)ο蟀l(fā)送一個消息。用成員選擇運算符“.”,只能訪問對象的公有成員,而不能訪問對象的私有成員或保護成員。如:a=r.

left;b=r.top;

都是不允許的,因成員left和top都是私有的成員。若要訪問對象的私有的數(shù)據(jù)成員,只能通過對象的公有成員函數(shù)來獲取。如用r.getcoord(&a,&b,&c,&d)來獲取對象r的坐標值。2.同類型的對象之間可以整體賦值。如rr=r;3.對象用作函數(shù)的參數(shù)時,屬于賦值調(diào)用;函數(shù)可以返回一個對象。第十六頁,共三十二頁,2022年,8月28日4.與結(jié)構(gòu)體的變量一樣,可以定義類類型的指針、類類型的引用、對象數(shù)組、指向類類型的指針數(shù)組和指向一維或多維數(shù)組的指針變量。例如:CRecta[10],*p,b,&pb=b,*pp[5],(*pa)[4];

定義a為對象數(shù)組,p為指向?qū)ο蟮闹羔樧兞?,pb為對象b的引用,pp為指向?qū)ο蟮闹羔様?shù)組,pa為指向一維數(shù)組的指針變量。5.一個類的對象可作為另一個類的成員,如:classA{…};classB{Aa1,a2;…};第十七頁,共三十二頁,2022年,8月28日2.成員函數(shù)的重載函數(shù)重載函數(shù)重載指同一個函數(shù)名可以對應(yīng)多個函數(shù)的實現(xiàn)它允許一個程序內(nèi)聲明多個名稱相同的函數(shù),這些函數(shù)可以完成不同的功能,并可以帶有不同的類型、不同數(shù)目的參數(shù)及返回值函數(shù)重載能減輕用戶的記憶負擔,并使程序的結(jié)構(gòu)簡單、易懂函數(shù)重載時要求編譯器能惟一地確定采用哪個函數(shù)實現(xiàn)函數(shù)重載時,要求函數(shù)的參數(shù)個數(shù)或參數(shù)類型不同第十八頁,共三十二頁,2022年,8月28日例,下面的程序?qū)崿F(xiàn)兩個不同參數(shù)類型的重載。#include<iostream.h>#include<math.h>#include<stdlib.h>classMy_class{

public:intplus(int,int);doubleplus(double,double);};intMy_class::plus(intx,inty){returnx+y;}doubleMy_class::plus(doublex,doubley){returnx-y;}voidmain(){My_classData;cout<<“Theresultforplus(int,int)is:”<<Data.plus(5,10)<<endl;cout<<“Theresultforplus(double,double)is:”<<Data.plus(5.0,10.0)<<endl;}第十九頁,共三十二頁,2022年,8月28日3.構(gòu)造函數(shù)構(gòu)造函數(shù)構(gòu)造函數(shù)是一種用于創(chuàng)建對象特殊的成員函數(shù),當創(chuàng)建對象時,系統(tǒng)自動調(diào)用構(gòu)造函數(shù),不能在程序中直接調(diào)用。構(gòu)造函數(shù)名與類名相同,一個類可以擁有多個構(gòu)造函數(shù)(重載),構(gòu)造函數(shù)可以有任意類型的參數(shù),但不能具有返回類型。 構(gòu)造函數(shù)的作用是:為對象分配空間;對數(shù)據(jù)成員賦初值;請求其他資源。

第二十頁,共三十二頁,2022年,8月28日例3-1:include<iostream.h> classSample {intx,y; public: Sample(){x=y=0;} Sample(inta,intb){x=a;y=b;} Voiddisp() {cout<<”x=”<<x<<”,y=”<<y<<endl; }};voidmain(){Samples1;Samples2(1,2);s1.disp();s2.disp();}此程序的運行結(jié)果為:x=0,y=0x=1,y=2第二十一頁,共三十二頁,2022年,8月28日例3-2:使用構(gòu)造函數(shù)對新產(chǎn)生的對象初始化#include<iostream.h>classC{inti;public:char*name;protected:floatnum[2];public:C(inta,char*s,floatx,floaty){i=a;name=s;num[0]=x;num[1]=y;}voidPrint(){cout<<i<<‘\t’<<name<<‘\t’;cout<<num[0]<<‘\t’<<num[1]<<‘\n’;}};voidmain(){Cc1(25,”張三”,77.8,99.56);c1.Print();}執(zhí)行程序后,輸出:25張三77.899.56第二十二頁,共三十二頁,2022年,8月28日注意:1.構(gòu)造函數(shù)的函數(shù)名必須與類名相同。2.因構(gòu)造函數(shù)是由系統(tǒng)自動調(diào)用的,構(gòu)造函數(shù)與其他成員函數(shù)不一樣,在定義構(gòu)造函數(shù)時,不能指定函數(shù)返回值的類型,也不能指定為void類型。3.構(gòu)造函數(shù)可以帶參數(shù)也可以不帶參數(shù)。4.若定義的類要說明該類的對象時,構(gòu)造函數(shù)必須是公有的成員函數(shù)。第二十三頁,共三十二頁,2022年,8月28日4.析構(gòu)函數(shù) 當一個對象消失,或用new創(chuàng)建的對象用delete刪除時,由系統(tǒng)自動調(diào)用類的析構(gòu)函數(shù)。析構(gòu)函數(shù)名字為符號“~”加類名,析構(gòu)函數(shù)沒有參數(shù)和返回值。一個類中只可能定義一個析構(gòu)函數(shù),所以析構(gòu)函數(shù)不能重載。 析構(gòu)函數(shù)是用于取消對象成員函數(shù),當一個對象作用域結(jié)束時,系統(tǒng)自動調(diào)用析構(gòu)函數(shù)。 析構(gòu)函數(shù)的作用是進行清除對象,釋放內(nèi)存等。 當對象超出其定義范圍時(即釋放該對象時),編譯器自動調(diào)用析構(gòu)函數(shù)。在以下情況下,析構(gòu)函數(shù)也會被自動調(diào)用。

分析例chapter9-2.cpp。第二十四頁,共三十二頁,2022年,8月28日5.繼承繼承是面向?qū)ο蟪绦蛟O(shè)計的基本特征之一,是從已有的類基礎(chǔ)上建立新類。通過C++語言中的繼承機制,一個新類既可以共享另一個類的操作和數(shù)據(jù),也可以在新類中定義已有類中沒有的成員,這樣就能大大的節(jié)省程序開發(fā)的時間和資源。第二十五頁,共三十二頁,2022年,8月28日B1,B2的派生類(多繼承)AB1B2C1C2C3A的派生類(單繼承)C3的基類B1,B2的基類A的派生類C1,C2,C3的基類B1的派生類圖

類之間的繼承與派生關(guān)系第二十六頁,共三十二頁,2022年,8月28日派生類的定義格式 單繼承的定義格式如下:class<派生類名>:<繼承方式><基類名>{public://派生類新定義成員members;<private:>members;<protected:>members;};第二十七頁,共三十二頁,2022年,8月28日

其中,<派生類名>是新定義的一個類的名字,它是從<基類名>中派生的,并且按指定的<繼承方式>派生的。<繼承方式>常作用如下三種關(guān)鍵字給予表示:

public:表示公有繼承;

private:表示私有繼承,可默認聲明;

protected:表示保護繼承。第二十八頁,共三十二頁,2022年,8月28日

多繼承的定義格式如下:class<派生類名>:<繼承方式1><基類名1>,<繼承方式2><基類名2>,…{public://派生類新定義成員members;<private:>members;<protected:>members;

};第二十九頁,共三十二頁,2022年,8月28

溫馨提示

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

最新文檔

評論

0/150

提交評論