《面向對象技術》PPT課件

上傳人:san****019 文檔編號:21426879 上傳時間:2021-04-30 格式:PPT 頁數(shù):67 大小:1.13MB
收藏 版權申訴 舉報 下載
《面向對象技術》PPT課件_第1頁
第1頁 / 共67頁
《面向對象技術》PPT課件_第2頁
第2頁 / 共67頁
《面向對象技術》PPT課件_第3頁
第3頁 / 共67頁

下載文檔到電腦,查找使用更方便

14.9 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《《面向對象技術》PPT課件》由會員分享,可在線閱讀,更多相關《《面向對象技術》PPT課件(67頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、程序設計基礎系列課程程序設計技術 前期課程:高級語言程序設計后期課程:計算機軟件技術基礎 教學內(nèi)容n 多態(tài)性n 打破封裝-靜態(tài)成員、友元n 高級代碼重用-函數(shù)模板和類模板n STL模板 繼承實現(xiàn)派生類直接使用繼承類的成員變量和函數(shù)(屬性和方法)。是一種重用機制,即派生類具有繼承類的所有的特征。多態(tài)性是之相同的行為在派生類中具有不同的形態(tài)。例如幾何圖形中,定義基類Shape,其中三角(Triangle)、矩形(Rectangle)、圓(Circle)均是此Shape的派生類,所有的類均有Draw方法,但是Draw方法的具體實現(xiàn)不同。 多態(tài)性與繼承TriangleCircleRectangle現(xiàn)需

2、要編譯一個繪圖Painter用于繪制圖形,能夠繪制所有圖形。class Painter public: void draw(ShapePainter();virtual Painter();多態(tài)性實現(xiàn)了通過繼承類的對象的引用,調(diào)用派生類對象方法的機制 虛函數(shù)指在繼承類中聲明,但是沒有定義的函數(shù),需要在派生類中定義的函數(shù)。實質為函數(shù)指針 虛函數(shù)聲明語法:普通虛函數(shù):Virtual 函數(shù)類型 函數(shù)名稱(函數(shù)參數(shù));純虛函數(shù):Virtual 函數(shù)類型 函數(shù)名稱(函數(shù)參數(shù))=0;區(qū)別:普通虛函數(shù)允許在繼承類中有定義,而純虛函數(shù)沒有。 現(xiàn)需要編譯一個繪圖Painter用于繪制圖形,能夠繪制三角(Tria

3、ngle)、矩形(Rectangle)、圓(Circle)等圖形。虛函數(shù)-案例定義如下類:lPainter(繪圖板)lShape(圖形對象基類)lTriangle(三角,派生于Shape)lRectangle (矩形,派生于Shape)lCircle (圓派生于Shape) Painter用于繪制圖形,能夠繪制三角(Triangle)、矩形(Rectangle)、圓(Circle)等圖形。 Painter -案例class Painter public: void draw(ShapePainter();virtual Painter();Painter:Painter() Painter:P

4、ainter() void Painter:draw(Shape Shape是圖形的基類,派生了三角(Triangle)、矩形(Rectangle)、圓(Circle)等圖形類。 Shape -案例class Shape public: int id;public: Shape();Shape(int id);virtual Shape();public: /*純虛函數(shù)*/virtual void draw()=0;/*虛函數(shù) 打印對象基本信息*/ virtual void print(); Shape:Shape():id(0)Shape:Shape(int id) this-id=id;S

5、hape:Shape()void Shape:print()coutShape Objectthisendl;coutId:idid=id;Shape:Shape()void Shape:print()coutShape Objectthisendl;coutId:ida=a;this-b=b;this-c=c;Triangle:Triangle()void Triangle:draw()coutDraw Trianglethisendl;void Triangle:print() coutTriangle Objectthisendl;coutId:idendl;cout(a,b,c):,a

6、,b,ca=a;this-b=b;Rectangle:Rectangle()void Rectangle:draw() coutDraw Rectanglethisendl; void Rectangle:print() coutRectangle Objectthisendl;coutId:idendl;cout(a,b):,a,bendl; 主函數(shù)與運行結果#include Rectangle.h#include triangle.h#include Painter.hint main() Painter painter;Triangle triangle(1,3,4,5);Rectang

7、le rectangle(2,10,20);painter.draw(triangle);painter.draw(rectangle);triangle.print();rectangle.print(); return 0; n派生類重載的普通虛函數(shù)將自動調(diào)用繼承類中對應的函數(shù)n利用純虛函數(shù),基于繼承類對象的引用可以直接調(diào)用派生類對象的方法 虛析構函數(shù) 基于“派生類重載的普通虛函數(shù)將自動調(diào)用繼承類中對應的虛函數(shù)”特性,將派生類析構函數(shù)聲明為虛函數(shù),當派生類對象釋放時將自動調(diào)繼承類構造函數(shù) 虛析構函數(shù)class Shape public: int id;public: virtual Sha

8、pe(); class Triangle : public Shape public: float a,b,c; public: virtual Triangle(); Shape:Shape() coutShape()thisendl;Triangle:Triangle() coutTriangle()thisendl; 主函數(shù)與運行結果#include Rectangle.h#include triangle.h#include Painter.hint main() Painter painter;Triangle triangle(1,3,4,5);return 0; n首先調(diào)用派生類

9、析構函數(shù)n其次調(diào)用父類析構函數(shù) 抽象類具有純虛函數(shù)的類稱為抽象類。抽象類不能創(chuàng)建對象。class Shape public: int id;public: Shape();Shape(int id);virtual Shape();public: /*純虛函數(shù)*/ virtual void draw()=0;/*虛函數(shù) 打印對象基本信息*/virtual void print();本類即為抽象類 抽象類與Java中接口C+:struct ShapeInterface virtual void draw()=0;virtual void print()=0; Java:public interf

10、ace ShapeInterface void draw();void print();不包括成員變量的,僅僅由純虛函數(shù)構成的類稱為抽象類。其作用聲明所有對象應當具有的功能接口規(guī)。 打破封裝-靜態(tài)成員、友元 靜態(tài)成員指靜態(tài)成員變量、靜態(tài)成員函數(shù)靜態(tài)成員靜態(tài)成員變量聲明: class 類訪問性:static 類 對象名稱; class Book public: Book();virtual Book();char * getAutor()return author;public: char name64;char isbn64;public: static char author32; ; 靜態(tài)

11、成員指靜態(tài)成員變量、靜態(tài)成員函數(shù)靜態(tài)成員靜態(tài)成員變量初始化: class 類數(shù)據(jù)類型 類:對象名稱=初始化表達式;或者數(shù)據(jù)類型 類:對象名稱(初始化表達式);char Book:author32=張三;char Book:author32(張三); #include using namespace std;int main(int argc, char* argv) Book book1,book2;char *p1=book1.getAutor();char *p2=book2.getAutor();if(p1=p2) cout“所有Book對象的靜態(tài)成員變量 的地址相同endl;coutb

12、ook1.getAutor()endl;coutbook2.getAutor()endl;return 0; 對于整個類的所有對象來說靜態(tài)成員變量是同一變量。 靜態(tài)成員指靜態(tài)成員變量、靜態(tài)成員函數(shù)靜態(tài)成員靜態(tài)成員變量使用:l基于“.”運算符l基于:運算符l編制專門的成員函數(shù)char Book:author32=張三;char Book:author32(張三); #include using namespace std;int main(int argc, char* argv) Book book1,book2;char *p2=book2.getAutor();coutbook1.auth

13、orendl;coutBook:authorendl;return 0;n 存儲類所有對象共享的數(shù)值信息 n 靜態(tài)成員變量僅僅有一份,普通成員變量是每個對象均有一份。n 靜態(tài)成員變量相當與C語言的中全局變量。n 靜態(tài)成員函數(shù)的使用與對象無關。 靜態(tài)成員對象A對象B對象C對象C 類的所有對象共享的全局變量 靜態(tài)成員指靜態(tài)成員變量、靜態(tài)成員函數(shù)靜態(tài)成員靜態(tài)成員函數(shù)聲明: class 類訪問性:static 函數(shù)類型 函數(shù)名(函數(shù)參數(shù)); class StringUtil public: static void copyString(char * s1,const char *s2); ; 靜態(tài)成員

14、靜態(tài)成員函數(shù)定義與普通成員函數(shù)的定義相同。void StringUtil:copyString(char * s1,const char *s2) strcpy(s1,s2); int main(int argc, char* argv) char s1100=Hello;char s2=demo;StringUtil:copyString(s1,s2);return 0;n 靜態(tài)成員函數(shù)相當與C語言的中全局函數(shù)n 靜態(tài)成員函數(shù)的使用與對象無關。n 靜態(tài)成員函數(shù)是打破面向對象的封裝性的技術,其主要用于構建工具類。 類實現(xiàn)了數(shù)據(jù)和函數(shù)的封裝,不同類直接不能共享成員變量和成員函數(shù),彼此只能通過對象

15、之間交流傳遞信息。友元出現(xiàn)打破了這種封裝,允許兩個類之間相互訪問彼此的成員函數(shù)和成員變量。友元類class TA public: TA();TA(double v):vaule(v)virtual TA();private: double vaule;TB在編譯時會告知無權訪問vaule,原因是TA類的限制。class TB private: TA object;public: TB(double v):object(v)double getVaule()return object.vauleTB();virtual TB(); 友元類n 友元類TB可以直接訪問TA類的所有成員n 友元類為事先

16、指定,而非運行是指定n 友元類的聲明順序不重要n 派生類不會繼承其基類的友元設置n 派生類也可以是其基類的友元。 友元類class TA friend class TB ;public: TA()TA(char *sname,double v)strcpy(name,sname);value=v;virtual TA()private: double value;char name32; class TB private: TA object;public: TB(char * name,double v):object(name,v)double getVaule()return objec

17、t.value;void print();TB();virtual TB(); void TB:print() coutname:object.nameendl;coutvaule:object.vauleendl; int main(int argc, char* argv) TB tb(T,1000);tb.print();return 0; 友元函數(shù)-類和函數(shù)友元函數(shù)是類與全局性的公共函數(shù)之間的友元關系,即允許公共函數(shù)訪問類的成員。class TA friend class TB ;friend void print(TA public: TA();TA(char *sname,doub

18、le v);virtual TA(); private: double vaule;char name32; #include using namespace std;void print(TA coutvaule:a.vauleendl;int main(int argc, char* argv) TA a(T,100);print(a);return 0; 友元函數(shù)-類和成員函數(shù)友元函數(shù)是類與其他類的成員函數(shù)之間的友元關系,即允許公共函數(shù)訪問類的成員。class TA friend void print(TA friend void TB:print(TA public: TA();TA(

19、char *sname,double v);virtual TA(); private: double vaule;char name32; class TA;class TB public: void print(TATB();virtual TB();int main(int argc, char* argv) TA a(T,100);TB b;b.print(a);return 0; 運算符重載 重載運算符對系統(tǒng)的基本數(shù)據(jù)類型,如long,int,double,系統(tǒng)提供了豐富的運算符,如何令自定義類對象也支持多種運算?重載運算符解決此問題+ unary plus(一元正號)+ expr-

20、 unary minus(一元負號)- expr* multiplication(乘法)expr * expr/ division(除法)expr / expr% remainder(求余)expr % expr+ addition(加法)expr + expr - subtraction(減法)expr - expr 重載運算符string類#include #include using namespace std;int main(int argc, char* argv) string a(Hello),b(Li),c;c=a+b;coutcb) coutbendl; else cout

21、abendl;return 0; 重載運算符n 不允許用戶自己定義新的運算符,只能對已有的C+運算符進行重載。n 允許重載除“.”“ ”“?:”“ *”“ #”之外的所有運算符n 重載不能改變運算符的優(yōu)先級別n 重載運算符的函數(shù)不能有默認的參數(shù) n 重載的運算符必須和自定義類型的對象一起使用,其參數(shù)至少應有一個是類對象 .n 用于類對象的運算符一般必須重載,但有兩個例外,運算符“=”和“friend 類名稱 operator - (類名稱 a,類名稱 b);friend 類名稱 operator * (類名稱 a,類名稱 b);friend 類名稱 operator / (類名稱 a,類名稱

22、b); 重載算術運算符class LargeInteger public: LargeInteger();LargeInteger(const char * v)strcpy(value,v);LargeInteger(long v)sprintf(value,%ld,v);LargeInteger(int v)sprintf(value,%d,v);virtual LargeInteger();public: long getVaule()return atol(value);friend long operator +(LargeIntegerfriend long operator -(

23、LargeInteger friend long operator +(LargeIntegerfriend long operator +(int op1,LargeIntegerprivate: char value1024; LargeInteger:LargeInteger() value0=0;LargeInteger:LargeInteger()long operator +(LargeIntegerlong operator -(LargeIntegerlong operator +(LargeIntegerlong operator +(int op1,LargeInteger

24、 重載算術運算符#include #include LargeInteger.husing namespace std;int main(int argc, char* argv) LargeInteger a(123),b(456);long c;c=a+b;coutc=cendl;couta+b+6=a+b+6endl;couta+6=a+6endl;return 0; 重載為類成員語法:class 類名稱 public:數(shù)據(jù)類型 operator + (類名稱 a);數(shù)據(jù)類型 operator - (類名稱 a);數(shù)據(jù)類型 operator * (類名稱 a);數(shù)據(jù)類型 operator

25、 / (類名稱 a); 重載算術運算符class LargeInteger public: LargeInteger();LargeInteger(const char * v)strcpy(value,v);LargeInteger(long v)sprintf(value,%ld,v);LargeInteger(int v)sprintf(value,%d,v);virtual LargeInteger();public: long getVaule()return atol(value);long operator -(int op);long operator *(LargeInteg

26、erprivate: char value1024; LargeInteger:LargeInteger() value0=0;LargeInteger:LargeInteger()long LargeInteger:operator -(int op) return getVaule()-op;long LargeInteger:operator *(LargeInteger 重載算術運算符#include #include LargeInteger.husing namespace std;int main(int argc, char* argv) LargeInteger a(123)

27、,b(2);long c;c=a+b;coutc=cendl;couta+b+6=a+b+6endl;couta+6=a+6endl; couta-6a-6endl;couta*2a*bendl;return 0; 重載 “-”運算符成員函數(shù)形式:long LargeInteger:operator -() return -getVaule();友員函數(shù)形式:long operator -(LargeInteger op) return - op .getVaule(); 重載 類型轉換 運算符成員函數(shù)形式:LargeInteger:operator long() return getVaul

28、e();#include #include LargeInteger.husing namespace std; int main(int argc, char* argv) LargeInteger a(123),b(2);long c;c=long(c);return 0; 重載 運算符成員函數(shù)形式:char return valuei; char int main(int argc, char* argv) LargeInteger a(123),b(2);couta1endl;a1=5;couta;return 0; 重載函數(shù)調(diào)用 運算符成員函數(shù)形式:long LargeInteger

29、:operator()()return getVaule();long operator()(); int main(int argc, char* argv) LargeInteger a(123),b(2);couta1endl;a1=5;cout() return this;LargeInteger * operator -();int main(int argc, char* argv) LargeInteger a(123),b(2);couta1getVaule();return 0; 重載+/-運算long LargeInteger:operator +() long l=get

30、Vaule();+l;sprintf(value,%ld,l);return l;long operator +(); int main(int argc, char* argv) LargeInteger a(123),b(2);couta1endl;a1=5;couta+;return 0; 重載輸出流ostream return os;friend osteam int main(int argc, char* argv) LargeInteger a(123),b(2);couta1endl;a1=5;coutistream return is;friend istream int m

31、ain(int argc, char* argv) LargeInteger a(123),b(2);cina;couta;return 0; 重載運算符方法n 只能使用成員函數(shù)重載的運算符有:=、()、-、new、delete。 n 單目運算符最好重載為成員函數(shù)。 n 對于復合的賦值運算符如+=、-=、*=、/=、 n Any為類型的別名,亦可為其他有效標識符n 在類成員變量中或成員函數(shù)中應用到Any 函數(shù)模板使用 STL簡介STL(Standard Template Library,標準模板庫)是惠普實驗室1994開發(fā)的一系列軟件的統(tǒng)稱。它是由Alexander Stepanov、Meng

32、 Lee和David R Musser在惠普實驗室工作時所開發(fā)出來的,其基本思想為Generic Programming).STL的代碼從廣義上講分為三類:container(容器)iterator(迭代器)algorithm(算法)幾乎所有的代碼都采用了模板類和模版函數(shù)的方式。在C+標準中,STL被組織為下面的13個頭文件:、 、和。 容器量(vector) 連續(xù)存儲的元素 列表(list) 由節(jié)點組成的雙向鏈表,每個結點包含著一個元素 雙隊列(deque) 連續(xù)存儲的指向不同元素的指針所組成的數(shù)組 集合(set) 由節(jié)點組成的紅黑樹,每個節(jié)點都包含著一個元素,節(jié)點之間以某種作用于元素對的謂

33、詞排列,沒有兩個不同的元素能夠擁有相同的次序 多重集合(multiset) 允許存在兩個次序相等的元素的集合 棧(stack) 后進先出的值的排列 隊列(queue) 先進先出的執(zhí)的排列 優(yōu)先隊列(priority_queue) 元素的次序是由作用于所存儲的值對上的某種謂詞決定的的一種隊列 映射(map) 由鍵,值對組成的集合,以某種作用于鍵對上的謂詞排列 多重映射(multimap) 允許鍵對有相等的次序的映射 迭代器迭代器部分主要由頭文件,和組成。是一個很小的頭文件,它包括了貫穿使用在STL中的幾個模板的聲明 提供了迭代器使用的許多方法主要部分是模板類allocator,它負責產(chǎn)生所有容器

34、中的默認分配器。 迭代器#include #include #include #include using namespace std;bool compare(int a,int b) return ab;void print(int n)coutn;int main(int argc, char* argv) vector array(10);array0=1;array1=2; vector:iterator itr;itr = find(array.begin(),array.end(),2); cout*itr;return 0; 算法STL提供了大約100個實現(xiàn)算法的模版函數(shù),比如

35、算法for_each將為指定序列中的每一個元素調(diào)用指定的函數(shù),stable_sort以你所指定的規(guī)則對序列進行穩(wěn)定性排序等等。算法部分主要由頭文件,和組成。是所有STL頭文件中最大的一個(盡管它很好理解),它是由一大堆模版函數(shù)組成的,可以認為每個函數(shù)在很大程度上都是獨立的,其中常用到的功能范圍涉及到比較、交換、查找、遍歷操作、復制、修改、移除、反轉、排序、合并等等。體積很小,只包括幾個在序列上面進行簡單數(shù)學運算的模板函數(shù),包括加法和乘法在序列上的一些操作。 中則定義了一些模板類,用以聲明函數(shù)對象。 Vectorn 構造器n運算符n 遍歷 #include stdafx.h#include #i

36、nclude #include using namespace std;int main(int argc, char* argv) vector array(100);array0=1;array1=2;for(int i=0;i10;i+) coutarrayi; coutendl-endl;int *p=array.begin();for(i=0;i10;i+) cout*p+;return 0; Vectorn 遍歷 #include stdafx.h#include #include using namespace std;int main(int argc, char* argv)

37、 vector array(100);array0=1;array1=2;int *p=array.begin(); for(i=0;i10;i+) cout*p+;return 0;#include stdafx.h#include #include using namespace std;int main(int argc, char* argv) vector array(100);array0=1;array1=2;for(int i=0;i10;i+) coutarrayi; Vectorn 遍歷 #include stdafx.h#include #include using na

38、mespace std;int main(int argc, char* argv) vector array(100);vector array2(100);array0=1;array1=2; vector:iterator itr;for(itr=array.begin();itr!=array.end();itr+) cout*itr;return 0; Vectorn 遍歷 #include stdafx.h#include #include #include #include using namespace std;void print(int n) coutn;int main(

39、int argc, char* argv) vector array(10);array0=1;array1=2; vector:iterator itr; for_each(itr=array.begin(),array.end(),print);return 0; Vectorn 排序 #include #include #include #include using namespace std;bool compare(int a,int b) return ab;void print(int n)coutn;int main(int argc, char* argv) vector a

40、rray(10); array0=1;array1=2; vector:iterator itr;sort(array.begin(),array.end(),compare); for_each(itr=array.begin(),array.end(),print);return 0; Vectorn 刪除n 插入 #include stdafx.h#include #include #include using namespace std;int main(int argc, char* argv) vector array(100);vector array2(100);array0=1;array1=2;array.insert(array.begin()+1,3);array.erase(array.begin()+2); int *p=array.begin();for(int i=0;i10;i+) cout*p+;return 0;

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

相關資源

更多
正為您匹配相似的精品文檔
關于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!