第二章面向?qū)ο蟮某绦蛟O(shè)計_第1頁
第二章面向?qū)ο蟮某绦蛟O(shè)計_第2頁
第二章面向?qū)ο蟮某绦蛟O(shè)計_第3頁
第二章面向?qū)ο蟮某绦蛟O(shè)計_第4頁
第二章面向?qū)ο蟮某绦蛟O(shè)計_第5頁
已閱讀5頁,還剩183頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第二章面向?qū)ο蟮某绦蛟O(shè)計主講:喬志會Page

2第二章面向?qū)ο蟮某绦蛟O(shè)計面向?qū)ο蟮某绦蛟O(shè)計面向?qū)ο蠹夹g(shù)C++多態(tài)與虛函數(shù)可視化程序設(shè)計概述C++類的繼承與派生C++類與對象Page

3一.面向?qū)ο蠹夹g(shù)概述面向?qū)ο蠹夹g(shù)概念

結(jié)構(gòu)化程序設(shè)計與面向?qū)ο蟪绦蛟O(shè)計的區(qū)別

面向?qū)ο蠹夹g(shù)的基本特征

123Page

4一.面向?qū)ο蠹夹g(shù)概述面向?qū)ο蠹夹g(shù)概念

1Page

51.1面向?qū)ο蠹夹g(shù)概念面向?qū)ο蠹夹g(shù)是一種新的軟件技術(shù),并且逐步成為目前軟件開發(fā)領(lǐng)域的主流技術(shù),通過面向?qū)ο蠹夹g(shù),可以將客觀世界直接映射到面向?qū)ο蠼饪臻g,從而為軟件設(shè)計和系統(tǒng)開發(fā)帶來革命性影響面向?qū)ο蠹夹g(shù)包括面向?qū)ο蠓治觯╫bject-orientedanalysis,簡稱OOA)、面向?qū)ο笤O(shè)計(object-orienteddesign,簡稱OOD)及面向?qū)ο蟪绦蛟O(shè)計(object-orientedprogramming,簡稱面向?qū)ο蟮某绦蛟O(shè)計)三部分內(nèi)容

Page

61.1面向?qū)ο蠹夹g(shù)概念面向?qū)ο蠹夹g(shù)面向?qū)ο蠓治鲋杠浖枨蠓治龅囊环N帶有約束性的方法,用于軟件開發(fā)過程中的問題定義階段。其主要內(nèi)容是對問題進行抽象建模(包括使用實例建模、類和對象建模、組件建模和分布建模等)

面向?qū)ο笤O(shè)計是將面向?qū)ο蠓治鏊鶆?chuàng)建的分析模型轉(zhuǎn)變?yōu)檐浖到y(tǒng)構(gòu)建的設(shè)計模型。面向?qū)ο笤O(shè)計的獨特性,在于其具有基于抽象、信息隱蔽、功能獨立性和模塊性建造系統(tǒng)等四個重要軟件設(shè)計概念的能力面向?qū)ο蟪绦蛟O(shè)計指使用類和對象以及面向?qū)ο筇赜械母拍钸M行程序設(shè)計

Page

71.2面向?qū)ο蟪绦蛟O(shè)計思想學生學生的數(shù)據(jù)抽象(學生類)學生1學生2學生3學生對象成績統(tǒng)計學生信息查詢學生數(shù)據(jù)的應用研究生類(學生類的派生)研究生1研究生2研究生3研究生對象成績統(tǒng)計學生信息查詢可利用學生已有的功能完成繼承面向?qū)ο蟪绦蛟O(shè)計思想圖例Page

81.2面向?qū)ο蟪绦蛟O(shè)計思想與面向過程的程序設(shè)計方法相比,面向?qū)ο蟮某绦蛟O(shè)計更符合客觀環(huán)境需求,更貼近客觀事物之間的關(guān)系,具有更豐富的信息面向?qū)ο蟪绦蛟O(shè)計的基本思想是使用對象、類、繼承、封裝和消息等基本概念來進行程序設(shè)計,模擬真實世界的對象,描述對象與對象之間的關(guān)系,不同類對象之間的關(guān)系,通過消息傳遞實現(xiàn)對象之間的訪問,通過對象的行為進行對象數(shù)據(jù)的訪問從而實現(xiàn)應有的功能,利用類的派生實現(xiàn)代碼的重用,提高了程序設(shè)計的效率面向?qū)ο蟪绦蛟O(shè)計使程序設(shè)計過程更自然和直觀。按照PeterCoad和EdwardYourdon的說法,“面向?qū)ο?對象+類+繼承+通信”。面向?qū)ο蟪绦虻幕境煞质菍ο?,程序的功能是通過對象的建立和對象之間的消息傳遞來執(zhí)行的Page

9一.面向?qū)ο蠹夹g(shù)概述結(jié)構(gòu)化程序設(shè)計與面向?qū)ο蟪绦蛟O(shè)計的區(qū)別

2Page

102.結(jié)構(gòu)化程序設(shè)計與面向?qū)ο蟪绦蛟O(shè)計的區(qū)別面向?qū)ο蟪绦蛟O(shè)計結(jié)構(gòu)化程序設(shè)計以步驟來劃分問題面向過程(結(jié)構(gòu)化)就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn),使用的時候一個一個依次調(diào)用就可以了以功能來劃分問題面向?qū)ο笫前褬?gòu)成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為區(qū)別Page

11一.面向?qū)ο蠹夹g(shù)概述面向?qū)ο蠹夹g(shù)的基本特征

3Page

123.面向?qū)ο蠹夹g(shù)的基本特征類與對象

類(Class)是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個主要部分,類是對象的模板對象(Object)由屬性(Attribute)和行為(Action)兩部分組成類對象類是對象的抽象,而對象是類的具體實例類與對象的關(guān)系類與對象Page

133.面向?qū)ο蠹夹g(shù)的基本特征抽象性

抽象的過程是將有關(guān)事物的共性歸納、集中的過程,抽象的作用是表示同一類事物的本質(zhì)學生類創(chuàng)建學生1學生2學生3學生4學生5┇屬性:功能:班級查詢各屬性學號修改各屬性姓名打印各屬性專業(yè)┇成績┇學生對象1學生對象2學生對象3學生對象4學生對象5┇抽象抽象過程示意圖Page

143.面向?qū)ο蠹夹g(shù)的基本特征封裝封裝(Encapsulation)就是把對象的屬性和行為結(jié)合成一個獨立的單位,并盡可能隱蔽對象的內(nèi)部細節(jié)含義一把對象的全部屬性和行為結(jié)合在一起,形成一個不可分割的獨立單位,對象的屬性值(除了公有的屬性值)只能由這個對象的行為來讀取和修改

含義二盡可能隱蔽對象的內(nèi)部細節(jié),對外形成一道屏障,與外部的聯(lián)系只能通過外部接口實現(xiàn)

Page

153.面向?qū)ο蠹夹g(shù)的基本特征繼承采用繼承的方法可以很方便地利用一個已有的類建立一個新的類。繼承機制實現(xiàn)了“軟件重用”的思想中學生農(nóng)民教師助教學生教授工人小學生研究生講師大學生人類的繼承結(jié)構(gòu)Page

163.面向?qū)ο蠹夹g(shù)的基本特征多態(tài)性

多態(tài)性是指由繼承而產(chǎn)生的相關(guān)的不同的類,其對象對同一消息會作出不同的響應。多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的一個重要特征,能增加程序的靈活性多態(tài)性示意圖類:Shape行為:Draw類:Ellipse行為:Draw類:Rectangle行為:Draw具體來說,多態(tài)性(Polymorphism)是指類中同一函數(shù)名對應多個具有相似功能的不同函數(shù),可以使用相同的調(diào)用方式來調(diào)用這些具有不同功能的同名函數(shù)。

Page

17二.C++類與對象類與對象12345共享數(shù)據(jù)的保護類的友元類的靜態(tài)成員構(gòu)造函數(shù)和析構(gòu)函數(shù)Page

18二.C++類與對象類與對象1Page

19比較以下源程序1.1流式輸入與輸出C程序#include<stdio.h>voidmain(){inta,b,sum;scanf("%d%d",&a,&b);sum=a+b;printf("sum=%d\n",sum);}C++程序#include<iostream.h>voidmain(){inta,b,sum;cin>>a>>b;sum=a+b;cout<<"sum="<<sum<<endl;}Page

20流輸入與輸出格式1.1流式輸入與輸出數(shù)據(jù)輸入cincin>>變量名1>>變量名2>>……>>變量名n;數(shù)據(jù)輸出coutcout<<數(shù)據(jù)1<<數(shù)據(jù)2<<……<<數(shù)據(jù)n;cout中還可以使用流控制符控制數(shù)據(jù)的輸出格式,但需添加頭文件“iomanip.h”(io代表輸入輸出,manip是manipulator[m?’n?pjule?t?(r)]

(操縱器)的縮寫)Page

21流控制符1.1流式輸入與輸出控制符功能dec置基數(shù)為10hex置基數(shù)為16oct置基數(shù)為8setfill(c)設(shè)填充字符為Csetprecision(n)設(shè)顯示小數(shù)精度為n位setw(n)設(shè)域?qū)挒閚個字符setiosflags(ios::scientific)指數(shù)表示setiosflags(ios::left)左對齊setiosflags(ios::right)右對齊setiosflags(ios::skipws)忽略前導空白setiosflags(ios::uppercase)16進制數(shù)大寫輸出setiosflags(ios::lowercase)16進制數(shù)小寫輸出dec置基數(shù)為10hex置基數(shù)為16#include<iostream>#include<iomanip>usingnamespacestd;intmain(){intb=123456;cout<<b<<endl;cout<<hex<<b<<endl;cout<<setiosflags(ios::uppercase)<<b<<endl;cout<<setw(10)<<b<<','<<b<<endl;return0;}1234561e2401E2401E240,1E240運行結(jié)果:Page

221.2類的定義結(jié)構(gòu)體定義structstudent{char*Name;char*Number;intAge;floatScore;doublePh_number;};studentzhang,wang;C++標準本身并不提供現(xiàn)成的類的名稱、結(jié)構(gòu)和內(nèi)容,在C++中聲明一個類類型和聲明一個結(jié)構(gòu)體類型是相似的Page

231.2類的定義類的定義格式兩種類型的成員:(1)數(shù)據(jù)成員,它們描述了該類對象的靜態(tài)特征。(2)成員函數(shù),它們描述了該類對象應具有的操作。成員訪問限定符:(1)public:成員可以在類外被訪問。(2)private:成員只能被該類的成員函數(shù)訪問。(3)protected:成員只能被該類的成員函數(shù)或派生類

class類名{pubilc:

數(shù)據(jù)成員成員函數(shù)

private:

數(shù)據(jù)成員成員函數(shù)

protected:

數(shù)據(jù)成員成員函數(shù)};Page

24類頭類體訪問說明符類內(nèi)定義的成員函數(shù)類的數(shù)據(jù)成員classstudent{public:char*Nam;char*Number;intAge;floatf_average(){inti;floatsum=0;for(i=0;i<7;i++)sum+=Score[i];returnsum/7;}private:doublePh_number;protected:floatScore[7];};類的定義舉例1.2類的定義學生類的定義描述Page

251.2類的定義類的封裝公有接口封裝類的定義輸入的數(shù)據(jù)及操作請求公有成員函數(shù)保護成員返回的操作及數(shù)據(jù)輸出

類的封裝Page

261.3類的成員函數(shù)成員函數(shù)的性質(zhì)類的成員函數(shù)是函數(shù)的一種,它的用法和作用與一般函數(shù)基本相同,它也有返回值和函數(shù)類型它可以被指定為private、public或protected。在使用類函數(shù)時,要注意調(diào)用它的權(quán)限(它能否被調(diào)用)以及它的作用域(函數(shù)能使用什么范圍中的數(shù)據(jù)和函數(shù))成員函數(shù)可以訪問本類中任何成員(包括私有的和公用的),可以引用在本作用域中有效的數(shù)據(jù)。一般將需要被外界調(diào)用的成員函數(shù)指定為public,它們是類的對外接口。如成員函數(shù)僅為本類中的成員函數(shù)所調(diào)用的,就指定為private。它的作用是支持其他函數(shù)的操作,是類中其他成員的工具函數(shù),類外用戶不能調(diào)用這些私有的工具函數(shù)。Page

271.3類的成員函數(shù)成員函數(shù)的定義在類內(nèi)定義在類外定義classStudent{public:voiddisplay();private:intnum;stringname;charsex;};voidStudent∷display(){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;}Studentstud1,stud2;classStudent{public:voiddisplay(){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;}private:intnum;stringname;charsex;};Studentstud1,stud2;Page

281.3類的成員函數(shù)內(nèi)聯(lián)(inline)函數(shù)在類內(nèi)定義structStudent{private:intnum;charname[20];charsex;public:

[inline]voiddisplay(){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;}};Studentstud1,stud2;在類外定義classStudent{public:inlinevoiddisplay();private:intnum;stringname;charsex;};inlinevoidStudent∷display(){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;}Studentstud1,stud2;如果成員函數(shù)在類體外定義,系統(tǒng)并不把它默認為內(nèi)聯(lián)函數(shù),調(diào)用這些成員函數(shù)的過程和調(diào)用一般函數(shù)的過程是相同的。如果想將這些成員函數(shù)指定為內(nèi)聯(lián)函數(shù),應當用inline作顯式聲明。Page

291.3類的成員函數(shù)內(nèi)聯(lián)函數(shù)說明在類體中定義的成員函數(shù)的規(guī)模一般都很小,而系統(tǒng)調(diào)用函數(shù)的過程所花費的時間開銷相對是比較大的。調(diào)用一個函數(shù)的時間開銷遠遠大于小規(guī)模函數(shù)體中全部語句的執(zhí)行時間。為了減少時間開銷,如果在類體中定義的成員函數(shù)中不包括循環(huán)等控制結(jié)構(gòu),C++系統(tǒng)會自動將它們作為內(nèi)聯(lián)函數(shù)來處理。在程序調(diào)用這些內(nèi)聯(lián)成員函數(shù)時,把函數(shù)代碼嵌入程序的調(diào)用點,這樣可以大大減少調(diào)用成員函數(shù)的時間開銷。只有在類外定義的成員函數(shù)規(guī)模很小而調(diào)用頻率較高時,才將此成員函數(shù)指定為內(nèi)聯(lián)函數(shù)。Page

301.4函數(shù)的重載函數(shù)重載舉例#include<iostream>usingnamespacestd;intmain(){intmax(inta,intb,intc);intmax(inta,intb);inta=8,b=-12,c=7;cout<<"max(a,b,c)="<<max(a,b,c)<<endl;cout<<"max(a,b)="<<max(a,b)<<endl;return0;}intmax(inta,intb,intc){if(b>a)a=b;if(c>a)a=c;returna;}intmax(inta,intb){if(a>b)returna;elsereturnb;}C++允許用同一函數(shù)名定義多個函數(shù),這些函數(shù)的參數(shù)個數(shù)和參數(shù)類型不同,這就是函數(shù)的重載使用重載函數(shù)時,同名函數(shù)功能應相同或相近,重載函數(shù)的函數(shù)體、函數(shù)返回值類型可相同,也可不同,其參數(shù)個數(shù)、類型或參數(shù)順序至少有一種不同intmain(){intmax(inta,intb,intc);doublemax(doublea,doubleb,doublec);longmax(longa,longb,longc);……}Page

311.5對象的定義對象的定義格式類名對象名;Studentstud1,stud2;對象的定義過程也叫實例化,定義對象的目的就是分配存儲空間,通過對存儲空間的操作實現(xiàn)對象的使用。對象也能夠作為函數(shù)參數(shù),以值或引用的方式傳遞,也可以作為函數(shù)的返回值,以及在賦值語句中被復制。Page

321.5對象的定義成員函數(shù)的存儲×Page

331.6對象成員的引用通過對象名和成員運算符訪問對象中的成員通過指向?qū)ο蟮闹羔樤L問對象中的成員通過對象的引用變量訪問對象中的成員Page

341.6對象成員的引用通過對象名和成員運算符訪問對象中的成員格式:對象名.成員名classstudent{public:voiddisplay(){cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;}private:intnum;charname[20];charsex;};studentstud1,stud2;stud1.display();stud1.num=10101;×Page

351.6對象成員的引用通過指向?qū)ο蟮闹羔樤L問對象中的成員格式:指向?qū)ο蟮闹羔?>成員名例一:classstudent{public:voiddisplay(){cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;}

floatscore;private:intnum;charname[20];charsex;};studentstud1,stud2;student*p;p=&stud1;cout>>stud1.score;cout>>(*p).score;cout>>p->score;student*p;p=&stud1;stud1.display();(*p).display();p->display();Page

361.6對象成員的引用classstudent{public:voiddisplay(){cout<<num<<endl;cout<<name<<endl;cout<<sex<<endl;}private:intnum;charname[20];charsex;};studentstud1,stud2;stud1.display();classstudent{public:voiddisplay(student*this){cout<<this->num<<endl;cout<<this->name<<endl;cout<<this->sex<<endl;}private:……};studentstud1,stud2;stud1.display(&stud1);this指針Page

371.6對象成員的引用通過指向?qū)ο蟮闹羔樤L問對象中的成員格式:指向?qū)ο蟮闹羔?>成員名例二:classTime{public:inthour;intminute;};Timet,*p;p=&t;cout<<t.hour;cout<<p->hour;cout<<(*p).hour;Page

381.6對象成員的引用通過對象的引用變量訪問對象中的成員引用的作用是為變量起一個別名;在聲明一個引用時,必須指定其代表的數(shù)據(jù)類型并對其初始化;不能定義引用數(shù)組和指向引用的指針inta;int&b=a;20變量a變量b#include<iostream.h>voidmain(){voidswap(int&,int&);inti=3,j=5;swap(i,j);cout<<"i="<<i<<""<<"j="<<j<<endl;}voidswap(int&a,int&b){inttemp;temp=a;a=b;b=temp;}變量的引用(預備知識)Page

391.6對象成員的引用通過對象的引用變量訪問對象中的成員classTime{public:inthour;intminute;};Timet1;Time&t2=t1;cout<<t2.hour;cout<<t1.hour;Page

401.7類與對象程序舉例例1#include<iostream.h>classTime{public:inthour;intminute;intsec;};voidmain(){Timet1;Time&t2=t1;cin>>t2.hour;cin>>t2.minute;cin>>t1.sec;cout<<t1.hour<<":"<<t1.minute<<":"<<t2.sec<<endl;}Page

411.7類與對象程序舉例例2.1#include<iostream.h>classTime{public:inthour;intminute;intsec;};voidmain(){Timet1;cin>>t1.hour;cin>>t1.minute;cin>>t1.sec;cout<<t1.hour<<":"<<t1.minute<<":"<<t1.sec<<endl;Timet2;cin>>t2.hour;cin>>t2.minute;cin>>t2.sec;cout<<t2.hour<<":"<<t2.minute<<":"<<t2.sec<<endl;}Page

421.7類與對象程序舉例例2.2#include<iostream.h>classTime{public:inthour;intminute;intsec;};voidmain(){voidset_time(Time&);voidshow_time(Time&);Timet1;set_time(t1);show_time(t1);Timet2;set_time(t2);show_time(t2);}voidset_time(Time&t){cin>>t.hour;cin>>t.minute;cin>>t.sec;}voidshow_time(Time&t){cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;}Page

431.7類與對象程序舉例例2.3#include<iostream.h>classTime{public:voidset_time();voidshow_time();private:inthour;intminute;intsec;};voidmain(){Timet1;t1.set_time();t1.show_time();Timet2;t2.set_time();t2.show_time();}voidTime::set_time(){cin>>hour;cin>>minute;cin>>sec;}voidTime::show_time(){cout<<hour<<":"<<minute<<":"<<sec<<endl;}Page

441.7類與對象程序舉例例3:找出一個整型數(shù)組中的元素的最大值#include<iostream.h>classArray_max{public:voidset_value();voidmax_value();voidshow_value();private:intarray[10];intmax;};voidArray_max::set_value(){inti;for(i=0;i<10;i++)cin>>array[i];}voidArray_max::max_value(){inti;max=array[0];for(i=1;i<10;i++)if(array[i]>max)max=array[i];}voidArray_max::show_value(){cout<<"max="<<max<<endl;}voidmain(){Array_maxarrmax;arrmax.set_value();arrmax.max_value();arrmax.show_value();}Page

45本次課程結(jié)束本次課程結(jié)束Page

46二.C++類與對象構(gòu)造函數(shù)和析構(gòu)函數(shù)2Page

472.1構(gòu)造函數(shù)問題的提出對象的初始化方法classTime{public:inthour;intminute;intsec;};Timet1={14,56,30};classTime{private:inthour;intminute;intsec;};Timet1={14,56,30};×classTime{public:inthour=14;×

intminute=56;×intsec=30;×};Page

482.1構(gòu)造函數(shù)什么是構(gòu)造函數(shù)構(gòu)造函數(shù)是一種特殊的成員函數(shù),與其他成員函數(shù)不同,不需要用戶來調(diào)用它,而是在建立對象時自動執(zhí)行。構(gòu)造函數(shù)的名字必須與類名同名,而不能由用戶任意命名,以便編譯系統(tǒng)能識別它并把它作為構(gòu)造函數(shù)處理。構(gòu)造函數(shù)不具有任何類型,不返回任何值。構(gòu)造函數(shù)的功能是由用戶定義的,用戶根據(jù)初始化的要求設(shè)計函數(shù)體和函數(shù)參數(shù)。如果用戶自己沒有定義構(gòu)造函數(shù),則C++系統(tǒng)會自動生成一個構(gòu)造函數(shù),只是這個構(gòu)造函數(shù)的函數(shù)體是空的,也沒有參數(shù),不執(zhí)行初始化操作。Page

492.1構(gòu)造函數(shù)構(gòu)造函數(shù)定義格式有參構(gòu)造函數(shù)類名(參數(shù)列表){

函數(shù)體}類名對象名(實參表列);無參構(gòu)造函數(shù)類名(){

函數(shù)體}類名對象名;Page

502.1構(gòu)造函數(shù)構(gòu)造函數(shù)舉例1在類內(nèi)定義classTime{public:Time(){hour=0;minute=0;sec=0;}voidset_time();voidshow_time();private:inthour;intminute;intsec;};在類外定義classTime{public:Time();voidset_time();voidshow_time();private:inthour;intminute;intsec;};Time::Time(){hour=0;minute=0;sec=0;}……intmain(){Timet1;t1.set_time();t1.show_time();Timet2;t2.show_time();return0;}

Page

512.1構(gòu)造函數(shù)構(gòu)造函數(shù)舉例2.1有兩個長方柱,其長、寬、高分別為:(1)12,20,25;(2)10,14,20。求它們的體積。#include<iostream.h>classBox{public:Box(int,int,int);intvolume();private:intheight;intwidth;intlength;};Box::Box(inth,intw,intlen){height=h;width=w;length=len;}intBox::volume(){return(height*width*length);}voidmain(){Boxbox1(12,25,30);cout<<box1.volume()<<endl;Boxbox2(15,30,21);cout<<box2.volume()<<endl;}Page

522.1構(gòu)造函數(shù)構(gòu)造函數(shù)舉例2.2利用參數(shù)初始化表的形式對數(shù)據(jù)成員初始化#include<iostream.h>classBox{public:Box(int,int,int);intvolume();private:intheight;intwidth;intlength;};Box::Box(inth,intw,intlen):height(h),width(w),length(len){}intBox::volume(){return(height*width*length);}這種方法不在函數(shù)體內(nèi)對數(shù)據(jù)成員初始化,而是在函數(shù)首部實現(xiàn)Page

53classBox{public:Box();Box(inth,intw,intlen):height(h),width(w),length(len){}intvolume();private:intheight;intwidth;intlength;};2.1構(gòu)造函數(shù)構(gòu)造函數(shù)舉例2.3構(gòu)造函數(shù)的重載Boxbox1;Boxbox2(15,30,25);Page

54classBox{public:

Box(intw=10,inth=11,intlen=12);

Box(Box&p);intvolume();private:intheight;intwidth;intlength;};2.1構(gòu)造函數(shù)構(gòu)造函數(shù)舉例2.4復制構(gòu)造函數(shù)Box::Box(Box&p){height=p.height;width=p.width;length=p.length;}Box::Box(intw,inth,intlen){height=h;width=w;length=len;}類名對象2(對象1)Boxbox1;Boxbox3(box1);參數(shù)帶默認值的構(gòu)造函數(shù)類名對象2=對象1Boxbox2(15);Boxbox4=box2;

對象的賦值:Boxbox2(15);box4=box2;復制構(gòu)造函數(shù)Page

552.1構(gòu)造函數(shù)以下情況需調(diào)用復制構(gòu)造函數(shù):程序中需要新建立一個對象,并用另一個同類的對象對它初始化當函數(shù)的參數(shù)為類的對象時。在調(diào)用函數(shù)時需要將實參對象完整地傳遞給形參,也就是需要建立一個實參的拷貝,這就是按實參復制一個形參,系統(tǒng)是通過調(diào)用復制構(gòu)造函數(shù)來實現(xiàn)的,這樣能保證形參具有和實參完全相同的值函數(shù)的返回值是類的對象。在函數(shù)調(diào)用完畢需要將返回值(對象)帶回函數(shù)調(diào)用處時。此時需要將函數(shù)中的對象復制一個臨時對象并傳給該函數(shù)的調(diào)用處Page

562.2析構(gòu)函數(shù)什么是析構(gòu)函數(shù)是一個特殊的成員函數(shù),它的作用與構(gòu)造函數(shù)相反,它的名字是類名的前面加一個“~”符號析構(gòu)函數(shù)的作用是在撤銷對象占用的內(nèi)存之前完成一些清理工作,使這部分內(nèi)存可以被程序分配給新對象使用;它還可以被用來完成類的設(shè)計者所指定的任何操作析構(gòu)函數(shù)不返回任何值,沒有函數(shù)類型,也沒有函數(shù)參數(shù)。因此它不能被重載。一個類可以有多個構(gòu)造函數(shù),但只能有一個析構(gòu)函數(shù)如果用戶沒有定義析構(gòu)函數(shù),C++編譯系統(tǒng)會自動生成一個析構(gòu)函數(shù),但它只是徒有析構(gòu)函數(shù)的名稱和形式,實際上什么操作都不進行Page

572.2析構(gòu)函數(shù)析構(gòu)函數(shù)定義格式析構(gòu)函數(shù)是在對象的生命期結(jié)束時程序自動執(zhí)行的:1、如果在一個函數(shù)中定義了一個對象(它是自動局部對象),當這個函數(shù)被調(diào)用結(jié)束時,對象應該釋放,在對象釋放前自動執(zhí)行析構(gòu)函數(shù)。

2、static局部對象在函數(shù)調(diào)用結(jié)束時對象并不釋放,因此也不調(diào)用析構(gòu)函數(shù),只在main函數(shù)結(jié)束或調(diào)用exit函數(shù)結(jié)束程序時,才調(diào)用static局部對象的析構(gòu)函數(shù)。3、如果定義了一個全局對象,則在程序的流程離開其作用域時(如main函數(shù)結(jié)束或調(diào)用exit函數(shù))時,調(diào)用該全局對象的析構(gòu)函數(shù)。4、如果用new運算符動態(tài)地建立了一個對象,當用delete運算符釋放該對象時,先調(diào)用該對象的析構(gòu)函數(shù)。析構(gòu)函數(shù)~類名(){

函數(shù)體}Page

582.2析構(gòu)函數(shù)析構(gòu)函數(shù)舉例有兩個長方柱,其長、寬、高分別為:(1)12,20,25;(2)10,14,20。求它們的體積。#include<iostream.h>classBox{public:Box(int,int,int);

~Box(){}intvolume();private:intheight;intwidth;intlength;};Box::Box(inth,intw,intlen){height=h;width=w;length=len;}intBox::volume(){return(height*width*length);}voidmain(){Boxbox1(12,25,30);cout<<box1.volume()<<endl;Boxbox2(15,30,21);cout<<box2.volume()<<endl;}Page

592.3構(gòu)造函數(shù)與析構(gòu)函數(shù)調(diào)用順序構(gòu)造函數(shù)與析構(gòu)函數(shù)調(diào)用順序?qū)τ谌侄x的對象(就是說定義在所有函數(shù)之外),每當程序第一次運行,主函數(shù)main接受控制之前,就要調(diào)用構(gòu)造函數(shù)。整個程序結(jié)束時調(diào)用析構(gòu)函數(shù)對于局部定義的對象(也就是在一個函數(shù)內(nèi)),每當程序控制流到達該對象定義處則調(diào)用構(gòu)造函數(shù);每當程序控制走出定義該對象的程序塊則調(diào)用析構(gòu)函數(shù)(也就是對象出了作用域)對于用new運算符動態(tài)創(chuàng)建的對象,每當創(chuàng)建該對象時,調(diào)用構(gòu)造函數(shù);每當用delete運算符顯式的撤消對象時,調(diào)用析構(gòu)函數(shù)(如程序員不顯式撤消該對象,是不會調(diào)用析構(gòu)函數(shù)的)Page

602.3構(gòu)造函數(shù)與析構(gòu)函數(shù)調(diào)用順序析構(gòu)函數(shù)舉例有兩個長方柱,其長、寬、高分別為:(1)12,20,25;(2)10,14,20。求它們的體積。#include<iostream.h>classBox{public:Box(int,int,int);

~Box(){cout<<height<<endl;}intvolume();private:intheight;intwidth;intlength;};Box::Box(inth,intw,intlen){height=h;width=w;length=len;}intBox::volume(){return(height*width*length);}voidmain(){Boxbox1(12,25,30);cout<<box1.volume()<<endl;Boxbox2(15,30,21);cout<<box2.volume()<<endl;}Page

61本次課程結(jié)束本次課程結(jié)束Page

62二.C++類與對象3類的靜態(tài)成員Page

633.類的靜態(tài)成員靜態(tài)數(shù)據(jù)成員靜態(tài)成員函數(shù)Page

643.1靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員如需在同類的各個對象間實現(xiàn)數(shù)據(jù)共享,可以用靜態(tài)的數(shù)據(jù)成員定義靜態(tài)數(shù)據(jù)成員的格式:static類型名成員名;初始化格式:類型類名::變量名=值;訪問格式:類名::靜態(tài)數(shù)據(jù)成員名對象名.靜態(tài)數(shù)據(jù)成員名Page

653.1靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員舉例#include<iostream.h>classBox{public:Box(int,int);intvolume();

staticintheight;intwidth;intlength;};Box::Box(intw,intlen){width=w;length=len;}intBox::volume(){return(height*width*length);}intBox::height=10;voidmain(){Boxa(15,20),b(20,30);cout<<a.height<<endl;cout<<b.height<<endl;cout<<Box::height<<endl;cout<<a.volume()<<endl;}Page

663.2靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)是類的一部分,而不是對象的一部分,靜態(tài)成員函數(shù)的作用不是為了對象之間的溝通,而是為了能處理靜態(tài)數(shù)據(jù)成員定義靜態(tài)成員函數(shù)的格式:static類型名函數(shù)名(形參){函數(shù)體}訪問格式:類名::靜態(tài)成員函數(shù)對象名.靜態(tài)成員函數(shù)Page

673.2靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)舉例#include<iostream.h>classStudent{public:Student(int,int,int);voidtotal();staticfloataverage();private:intnum;intage;floatscore;staticfloatsum;staticintcount;};Student::Student(intm,inta,ints){num=m;age=a;score=s;}voidStudent::total(){sum+=score;count++;}floatStudent::average(){return(sum/count);}floatStudent::sum=0;intStudent::count=0;不能引用非static數(shù)據(jù)無隱含的This指針Page

683.2靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)舉例(續(xù))voidmain(){Studentstud[3]={Student(1001,18,70),Student(1002,19,79),Student(1005,20,98)};intn;cout<<"Inputnumber:";cin>>n;for(inti=0;i<n;i++)stud[i].total();cout<<"averagescore:"<<Student::average()<<endl;}對象數(shù)組調(diào)用構(gòu)造函數(shù)Page

69二.C++類與對象4類的友元Page

704.類的友元友元可以訪問與其有友好關(guān)系的類中的私有成員友元函數(shù)友元類Page

714.1友元函數(shù)如果在本類以外的其他地方定義了一個函數(shù),在類體中用friend對其進行聲明,此函數(shù)就稱為本類的友元函數(shù)。友元函數(shù)可以訪問聲明它的類中的私有成員。友元函數(shù)的聲明格式:friend類型名函數(shù)名(形式參數(shù));普通函數(shù)和成員函數(shù)均可聲明為友元函數(shù)Page

724.1友元函數(shù)例1例2Page

734.2友元類友元類例聲明友元類的格式:

friend類名;說明:

1、友元的關(guān)系是單向的而不是雙向的

2、友元的關(guān)系不能傳遞Page

74二.C++類與對象5共享數(shù)據(jù)的保護Page

755.共享數(shù)據(jù)的保護共享數(shù)據(jù)保護C++雖然采取了不少有效的措施(如設(shè)private保護)以增加數(shù)據(jù)的安全性,但是有些數(shù)據(jù)卻往往是共享的,如:實參與形參、變量與其引用、數(shù)據(jù)及其指針等。人們可以在不同的場合通過不同的途徑訪問同一個數(shù)據(jù)對象,有時在無意之中的誤操作會改變有關(guān)數(shù)據(jù)的狀況,而這是人們所不希望出現(xiàn)的既要使數(shù)據(jù)能在一定范圍內(nèi)共享,又要保證它不被任意修改,這時可以使用const來定義數(shù)據(jù),主要有以下幾種使用方法:常變量常對象常對象成員指向?qū)ο蟮某V羔樦赶虺ο蟮闹羔樧兞繉ο蟮某R肞age

765.1常變量常變量在定義變量時,如加上關(guān)鍵字const,則變量的值在程序運行期間不能改變,這種變量稱為常變量。如:constinta=3;constinta=3+6;注:在定義常變量時必須同時初始化Page

775.2常對象常對象

凡希望保證數(shù)據(jù)成員不被改變的對象,可以聲明為常對象定義常對象的一般形式為:類名const對象名[(實參表列)];或

const類名對象名[(實參表列)];Page

785.2常對象常對象舉例

#include<iostream.h>classTime{public:Time();voidshow_time()const;private:inthour;intminute;intsec;};voidmain(){

constTimet1;t1.show_time();}Time::Time(){hour=0;minute=0;sec=0;}voidTime::show_time()const{cout<<hour<<":"<<minute<<":"<<sec<<endl;}如必須要修改常對象中成員的值可將其定義為可變數(shù)據(jù)成員,如:mutableinthour;此時可由const成員函數(shù)來修改它Page

795.3常對象成員常對象成員(1)常數(shù)據(jù)成員用關(guān)鍵字const來聲明常數(shù)據(jù)成員。常數(shù)據(jù)成員的值是不能改變的,只能通過構(gòu)造函數(shù)的參數(shù)初始化表對常數(shù)據(jù)成員進行初始化constinthour;(2)常成員函數(shù)如用關(guān)鍵字const將成員函數(shù)聲明為常成員函數(shù),則只能引用本類中的數(shù)據(jù)成員,而不能修改它們voidshow_time()const;Page

805.3常對象成員常對象成員舉例#include<iostream.h>classTime{public:Time();voidset_time();voidshow_time()const;

private:

constinthour;

intminute;intsec;};voidmain(){

constTimet1;

t1.show_time();

Timet2;t2.set_time();t2.show_time();}(Time::Time():hour(0){

minute=0;sec=0;}voidTime::set_time(){

cin>>minute;cin>>sec;}voidTime::show_time()const{cout<<hour<<":"<<minute<<":"<<sec<<endl;}Page

815.4指向?qū)ο蟮某V羔樦赶驅(qū)ο蟮某V羔槍⒅羔樧兞柯暶鳛閏onst型,這樣指針值始終保持為其初值,不能改變,即其指向始終不變定義指向?qū)ο蟮某V羔樀囊话阈问綖椋侯惷?const指針變量名=對象地址;往往用常指針作為函數(shù)的形參,目的是不允許在函數(shù)執(zhí)行過程中改變指針變量的值,使其始終指向原來的對象Page

825.4指向?qū)ο蟮某V羔樦赶驅(qū)ο蟮某V羔樑e例#include<iostream.h>classTime{public:Time();voidset_time();voidshow_time()const;

private:

constinthour;

intminute;intsec;};voidmain(){

constTimet1;t1.show_time();Timet2;Time*constpt=&t2;pt->set_time();pt->show_time();}(Time::Time():hour(0){

minute=0;sec=0;}voidTime::set_time(){

cin>>minute;cin>>sec;}voidTime::show_time()const{cout<<hour<<":"<<minute<<":"<<sec<<endl;}Page

835.5指向常對象的指針變量指向常對象的指針變量定義指向常對象的指針變量的一般形式為:

const類名*指針變量名;Page

845.5指向常對象的指針變量指向常對象的指針變量說明:(1)如果一個對象已被聲明為常對象,只能用指向常對象的指針變量指向它,而不能用一般的(指向非const型對象的)指針變量去指向它(2)如果定義了指向常對象的指針變量,并使它指向一個非const的對象,則其指向的對象是不能通過指針來改變的(3)指向常對象的指針最常用于函數(shù)的形參,目的是在保護形參指針所指向的對象,使它在函數(shù)執(zhí)行過程中不被修改。(4)如果定義了一個指向常對象的指針變量,是不能通過它改變所指向的對象的值的,但是指針變量本身的值是可以改變的。Page

855.5指向常對象的指針變量指向常對象的指針變量舉例Time::Time():hour(0){minute=0;sec=0;}voidfun(constTime*p){//p->hour=10;cout<<p->hour<<endl;}#include<iostream.h>classTime{public:Time();inthour;intminute;intsec;};voidmain(){voidfun(constTime*p);

constTimet1;

constTime*p=&t1;

cout<<p->hour<<endl;Timet2;fun(&t2);}Page

865.6對象的常引用對象的常引用對象的常引用用法同常對象例#include<iostream.h>classTime{public:Time(int,int,int);inthour;intminute;intsec;};Time::Time(inth,intm,ints){hour=h;minute=m;sec=s;}voidfun(constTime&t){//t.hour=18;cout<<t.hour<<endl;}intmain(){Timet1(10,13,56);fun(t1);cout<<t1.hour<<endl;return0;}Page

87本次課程結(jié)束本次課程結(jié)束Page

88三.C++類的繼承與派生繼承與派生基本知識派生類成員的訪問屬性派生類的構(gòu)造和析構(gòu)函數(shù)123多繼承4Page

89三.C++類的繼承與派生繼承與派生基本知識1Page

901.繼承與派生基本知識繼承與派生的概念派生類的定義派生類的構(gòu)成Page

911.1繼承與派生的概念繼承與派生的基本概念繼承:是在一個已存在的類的基礎(chǔ)上建立一個新的類,已存在的類稱為“基類”或“父類”。新建立的類稱為“派生類”或“子類”。一個新類從已有的類那里獲得其已有特性,這種現(xiàn)象稱為類的繼承。從已有的類(父類)產(chǎn)生一個新的子類,稱為類的派生。單繼承:一個派生類只從一個基類派生多繼承:一個派生類有兩個或多個基類派生類是基類的具體化,而基類則是派生類的抽象Page

921.1繼承與派生的概念單繼承示例圖單繼承示例圖Page

931.1繼承與派生的概念多繼承示例圖多繼承示例圖Page

941.1繼承與派生的概念基類與派生類的關(guān)系示例圖基類與派生類的關(guān)系示例圖Page

951.2派生類的定義派生類的定義(單繼承)聲明派生類的一般形式為:class派生類名:[繼承方式]基類名

{

派生類新增加的成員

};繼承方式包括:public(公用的),private(私有的)和protected(受保護的),此項是可選的,如果不寫此項,則默認為private(私有的)。Page

961.2派生類的定義派生類的定義舉例#include<iostream>#include<string>usingnamespacestd;classStudent{public:voidget_value(){cin>>num>>name>>sex;}voiddisplay(){cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;}private:intnum;stringname;charsex;};classStudent1:publicStudent{public:voidget_value_1(){cin>>age>>addr;}voiddisplay_1(){//cout<<"num:"<<num<<endl;//cout<<"name:"<<name<<endl;//cout<<"sex:"<<sex<<endl;cout<<"age:"<<age<<endl;cout<<"address:"<<addr<<endl;}private:intage;stringaddr;};Page

971.3派生類的構(gòu)成派生類的構(gòu)成派生類分為兩大部分:一部分是從基類繼承來的成員,另一部分是在聲明派生類時增加的部分。每一部分均分別包括數(shù)據(jù)成員和成員函數(shù)。構(gòu)造一個派生類包括以下3部分工作:(1)從基類接收成員。(2)調(diào)整從基類接收的成員(3)在聲明派生類時增加的成員Page

981.3派生類的構(gòu)成派生類的構(gòu)成Page

99三.C++類的繼承與派生派生類成員的訪問屬性2Page

1002.派生類成員的訪問屬性公用繼承(publicinheritance)基類的公用成員和保護成員在派生類中保持原有訪問屬性,其私有成員仍為基類私有。私有繼承(privateinheritance)基類的公用成員和保護成員在派生類中成了私有成員。其私有成員仍為基類私有。受保護的繼承(protectedinheritance)基類的公用成員和保護成員在派生類中成了保護成員,其私有成員仍為基類私有。Page

1012.1公用繼承概念公用基類在派生類中的訪問屬性在定義一個派生類時將基類的繼承方式指定為public的,稱為公用繼承,用公用繼承方式建立的派生類稱為公用派生類(publicderivedclass),其基類稱為公用基類(publicbaseclass)。公用基類的成員在公用派生類中的訪問屬性私有成員不可訪問公用成員公用保護成員保護Page

1022.1公用繼承公用繼承舉例#include<iostream>#include<string>usingnamespacestd;classStudent{public:voidget_value(){cin>>num>>name>>sex;}voiddisplay(){cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;}private:intnum;stringname;charsex;};classStudent1:publicStudent{public:voidget_value_1(){cin>>age>>addr;}voiddisplay_1(){//cout<<"num:"<<num<<endl;//cout<<"name:"<<name<<endl;//cout<<"sex:"<<sex<<endl;cout<<"age:"<<age<<endl;cout<<"address:"<<addr<<endl;}private:intage;stringaddr;};Page

1032.2私有繼承概念私有基類在派生類中的訪問屬性在聲明一個派生類時將基類的繼承方式指定為private的,稱為私有繼承,用私有繼承方式建立的派生類稱為私有派生類(privatederivedclass),其基類稱為私有基類(privatebaseclass)。私有基類的成員在私有派生類中的訪問屬性私有成員不可訪問公用成員私有保護成員私有Page

1042.2私有繼承私有繼承舉例#include<iostream.h>#include<string>usingnamespacestd;classStudent{public:voidget_value(){cin>>num>>name>>sex;}voiddisplay(){cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;}private:intnum;stringname;charsex;};classStudent1:privateStudent{public:voidget_value_1(){get_value();cin>>age>>addr;}voiddisplay_1(){display();cout<<"age:"<<age<<endl;cou

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論