版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第二章從結(jié)構(gòu)到類的演變主講:馮傳勝Email:fcs@2.1結(jié)構(gòu)的演化2.2從結(jié)構(gòu)演變一個(gè)簡單的類2.3面向過程與面向?qū)ο?.4C++面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)2.5使用類和對(duì)象2.6string對(duì)象數(shù)組與泛型算法2.1結(jié)構(gòu)的演化2.1.1結(jié)構(gòu)發(fā)生質(zhì)的演變1、函數(shù)與數(shù)據(jù)共存C++允許結(jié)構(gòu)中可以定義函數(shù),稱為成員函數(shù)。struct結(jié)構(gòu)名{數(shù)據(jù)成員成員函數(shù)};可以用C語言中使用結(jié)構(gòu)成員的方法使用成員函數(shù)結(jié)構(gòu)對(duì)象.成員函數(shù)例2.1:/*源程序*/#include<iostream>usingnamespacestd;structPoint {voidSetxy(doublea,doubleb) {x=a;y=b;} voidDisplay() {cout<<"("<<x<<","<<y<<")"<<endl;} doublex,y; };voidmain() {Pointa; a.Setxy(10.6,18.5); a.Display(); cout<<"("<<a.x<<","<<a.y<<")"<<endl; };/*運(yùn)行結(jié)果*/(10.6,18.5)(10.6,18.5)結(jié)構(gòu)定義:struct結(jié)構(gòu)名 {數(shù)據(jù)成員 成員函數(shù)};成員函數(shù)使用:結(jié)構(gòu)對(duì)象.成員函數(shù)struct結(jié)構(gòu)中的成員是公有的(public)2、封裝性如果在定義結(jié)構(gòu)時(shí),將數(shù)據(jù)成員使用private關(guān)鍵字,則產(chǎn)生封裝性。例2.2:/*源程序*/#include<iostream>usingnamespacestd;structPoint {public: voidSetxy(doublea,doubleb) {x=a;y=b;} voidDisplay() {cout<<"("<<x<<","<<y<<")"<<endl;} private: doublex,y; };voidmain() {Pointa; a.Setxy(10.6,18.5); a.Display(); cout<<"("<<a.x<<","<<a.y<<")"<<endl; };正確!錯(cuò)誤!對(duì)于私有數(shù)據(jù)成員,必須通過公有的成員函數(shù)訪問,這就稱為數(shù)據(jù)的封裝性。private的使用使結(jié)構(gòu)具有“類”的特性。結(jié)構(gòu)中默認(rèn)成員為public,而類中默認(rèn)成員為private。2.1.2使用構(gòu)造函數(shù)初始化結(jié)構(gòu)的對(duì)象結(jié)構(gòu)中private的使用使其具有封裝性,所以不能像C語言中那樣使用初始化列表對(duì)結(jié)構(gòu)對(duì)象進(jìn)行初始化。為此我們可以設(shè)計(jì)兩個(gè)特殊的成員函數(shù)來進(jìn)行初始化。兩個(gè)函數(shù)的名字與結(jié)構(gòu)同名,其原型為Point()Point(double,double)兩函數(shù)為重載函數(shù)。專門用于對(duì)象的初始化,稱為構(gòu)造函數(shù)。例2.3:構(gòu)造函數(shù)。/*源程序*/#include<iostream>usingnamespacestd;structPoint {public: Point(){}; Point(doublea,doubleb) {x=a;y=b;} voidSetxy(doublea,doubleb) {x=a;y=b;} voidDisplay() {cout<<"("<<x<<","<<y<<")"<<endl;}
private:
doublex,y; };voidmain() {Pointa; Pointb(1.0,2.0); a.Setxy(10.6,18.5); a.Display(); b.Display(); };使用構(gòu)造函數(shù)!構(gòu)造函數(shù)的使用方法:構(gòu)造函數(shù)名對(duì)象名(初始化參數(shù));2.2從結(jié)構(gòu)演變一個(gè)簡單的類利用關(guān)鍵字class(類)代替struct(結(jié)構(gòu))就是一個(gè)標(biāo)準(zhǔn)的類。例2.4/*源程序*/#include<iostream>usingnamespacestd;classPoint {public: Point(){}; Point(doublea,doubleb) {x=a;y=b;} voidSetxy(doublea,doubleb) {x=a;y=b;} voidDisplay() {cout<<"("<<x<<","<<y<<")"<<endl;}
private:
doublex,y; };Point類Point類示意圖voidmain(){Pointa;Pointb(1.0,2.0);a.Setxy(10.6,18.5);a.Display();b.Display(); };類的使用與結(jié)構(gòu)相同。如,voidmain() {Pointa; Pointb(1.0,2.0); a.Setxy(10.6,18.5); a.Display(); b.Display(); };類名Point具有屬性x和y提供的操作:構(gòu)造函數(shù)PointSetxy用來給對(duì)象賦值Display用來輸出x和yPoint類示意圖2.3面向過程與面向?qū)ο竺嫦蜻^程不必要了解計(jì)算機(jī)的內(nèi)部邏輯,而把精力主要集中在對(duì)如何求解問題的方法邏輯和過程上,通過編寫程序把解決問題的步驟告訴計(jì)算機(jī)。例2.5:輸入三角形3個(gè)頂點(diǎn)的坐標(biāo),計(jì)算3邊長的過程算法描述。輸入三個(gè)頂點(diǎn)的坐標(biāo)數(shù)據(jù)(6個(gè)數(shù)據(jù))計(jì)算兩個(gè)頂點(diǎn)間的距離得到連長輸出三個(gè)邊長C語言中的函數(shù)是功能的抽象。有利于結(jié)構(gòu)化程序設(shè)計(jì)和模塊化設(shè)計(jì),適合于大型程序的開發(fā)。解決了大系統(tǒng)多文件的組織與管理。C++是混合型語言,可用于面向過程軟件的開發(fā)。當(dāng)軟件太復(fù)雜,結(jié)構(gòu)化程序設(shè)計(jì)不能滿足要求。人們分析問題思考方式的不一致全局變量的大量存在面向過程存在的問題。要求開發(fā)人員按計(jì)算機(jī)的結(jié)構(gòu)去思考,而不是按要解決的問題的結(jié)構(gòu)去思考。開發(fā)人員必須在機(jī)器模型(解空間)和實(shí)際問題模型(問題空間)之間進(jìn)行對(duì)應(yīng)。面向過程的方法充滿“變數(shù)”。面向?qū)ο笙鄬?duì)于過程,對(duì)象是穩(wěn)定的。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,可以將一組密切相關(guān)的函數(shù)統(tǒng)一封裝在一個(gè)對(duì)象中,從而可以合理、有效地避免全局變量的使用。對(duì)象是功能抽象和數(shù)據(jù)抽象的統(tǒng)一。面向?qū)ο蟮某绦蛟O(shè)計(jì)方法不是以函數(shù)過程和數(shù)據(jù)結(jié)構(gòu)為中心,而是用對(duì)象代表求解問題的中心環(huán)節(jié)。例2.6:輸入三角形的3個(gè)頂點(diǎn)坐標(biāo),計(jì)算3條邊的長度的面向?qū)ο蟮乃惴枋?。問題以“點(diǎn)”對(duì)象為中心環(huán)節(jié)。邊長可以看作兩點(diǎn)對(duì)象之間了距離。設(shè)計(jì)Point類:算法設(shè)計(jì):設(shè)計(jì)Point類創(chuàng)建3個(gè)點(diǎn)對(duì)象PointA(x1,y1);PointB(x2,y2);PointC(x3,y3);計(jì)算邊長:AB:A.Getlength(B);BC:B.Getlength(C);AC:A.Getlength(C);輸出三邊長:AB,BC,AC類名Point具有屬性x和y提供的操作:構(gòu)造函數(shù)PointGetlength求兩點(diǎn)對(duì)象之間的距離Getx得到點(diǎn)的x坐標(biāo)Gety得到點(diǎn)的y坐標(biāo)軟件開發(fā)是對(duì)給定問題求解的過程,包含兩部:認(rèn)識(shí)和描述。問題域:軟件開發(fā)者將被開發(fā)的整個(gè)業(yè)務(wù)范圍稱作“問題域”。認(rèn)識(shí):就是通過人的思維,對(duì)該問題域客觀存在的事物以及對(duì)所要解決的問題產(chǎn)生正確的認(rèn)識(shí)和理解,包括弄清事物的屬性、行為及其彼此之間的關(guān)系并找出解決問題的方法。描述:是指人們用一種語言把對(duì)問題域中事物的認(rèn)識(shí)、對(duì)問題及其解決方法的認(rèn)識(shí)描述出來。最終描述成一種能被計(jì)算機(jī)讀得懂的語言,即編程語言??陀^事物(問題域)縫隙自然語言面向?qū)ο笳Z言面向過程語言匯編語言機(jī)器語言計(jì)算機(jī)人們對(duì)問題認(rèn)識(shí)的差距產(chǎn)生“縫隙”。語言發(fā)展趨勢原來的鴻溝語言的發(fā)展使鴻溝逐漸變窄2.4C++面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)與傳統(tǒng)的程序設(shè)計(jì)方法相比,面向?qū)ο蟪绦蛟O(shè)計(jì)具有抽象、封裝、繼承和多態(tài)性等關(guān)鍵要素。2.4.1對(duì)象描述對(duì)象的三要素:對(duì)象名、屬性、操作。對(duì)象名:用來標(biāo)識(shí)一個(gè)具體對(duì)象。屬性:用數(shù)據(jù)來表示對(duì)象的屬性,一個(gè)屬性就是描述對(duì)象靜態(tài)特征的一個(gè)數(shù)據(jù)項(xiàng)。操作:是描述對(duì)象動(dòng)態(tài)特征(行為)的一個(gè)函數(shù)序列(用函數(shù)實(shí)現(xiàn)操作),也稱為方法或服務(wù)。數(shù)據(jù)稱為“數(shù)據(jù)成員”,函數(shù)稱為“成員函數(shù)”。C++中的對(duì)象是系統(tǒng)中用來描述客觀事物的一個(gè)實(shí)體,要構(gòu)成系統(tǒng)的一個(gè)基本單位。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的成員函數(shù)構(gòu)成。對(duì)象名屬性1屬性2…屬性n操作1操作2…操作n例2.7:用簡單對(duì)象表示平面上的兩個(gè)坐標(biāo)點(diǎn):A(3.5,6.4),B(8.5,8.9)。AX(3.5)Y(6.4)Display();Setxy();Move();BX(8.5)Y(8.9)Display();Setxy();Move();2.4.2抽象和類抽象是一種從一般的觀點(diǎn)看待事物的方法,即集中于事物的本質(zhì)特征,而不是具體細(xì)節(jié)或具體實(shí)現(xiàn)??梢詮囊唤M對(duì)象的共同特征進(jìn)一步抽象出來從而形成“類”的概念。類由類名、一組屬性、一組操作組成。類的屬性只是性質(zhì)的說明,對(duì)象的屬性才是具體數(shù)據(jù)。如,從上例中A,B兩點(diǎn)抽象出來的點(diǎn)類,如右上圖。Pointfloatx;floaty;Display();Setxy();Move();類名屬性1屬性2…屬性n操作1操作2…操作n在抽象的過程中用到“歸納法”和“演繹法”:歸納法:從特殊到一般,即“歸類”。演繹法:從一般到特殊,即“分類”。類與對(duì)象:對(duì)象由一些屬性和操作組成,而這些屬性和操作描述了對(duì)象的內(nèi)部細(xì)節(jié)。類是具有相同屬性和操作的一組對(duì)象集合,它為屬于該類的全部對(duì)象提供了統(tǒng)一的抽象描述。類給出了屬于該類的全部對(duì)象的抽象定義,而對(duì)象則是符合這種定義的實(shí)體。2.4.3封裝對(duì)象由屬性與操作組成。屬性只能通過操作存取操作分內(nèi)部操作和外部操作外部操作提供消息接口對(duì)象內(nèi)部數(shù)據(jù)結(jié)構(gòu)的不可訪問性稱為信息(數(shù)據(jù))隱藏。數(shù)據(jù)封裝減少了出錯(cuò)的可能性。類中封裝是通過存取權(quán)限實(shí)現(xiàn)的。類的屬性和操作分為私有的(private)和公有的(public)兩種類型。屬性1屬性2…屬性n內(nèi)部操作1內(nèi)部操作2…內(nèi)部操作n外部操作1外部操作2…外部操作n對(duì)象名2.4.4繼承繼承是一個(gè)類可以獲得另一個(gè)類的特性的機(jī)制,繼承支持層次概念。低層的類只須定義特定于它的特征,而共享高層類中的特征。水果蘋果桔子香蕉紅富士紅香蕉2.4.5多態(tài)性不同的對(duì)象可以調(diào)用相同名稱的函數(shù),但可導(dǎo)致完全不同的行為的現(xiàn)象稱為多態(tài)性,程序中只須一般形式的函數(shù)調(diào)用,函數(shù)的實(shí)現(xiàn)細(xì)節(jié)留給接受函數(shù)調(diào)用的對(duì)象。有利于提高解決復(fù)雜問題的能力。如“+”7+81.1+2.22.5使用類和對(duì)象本節(jié)介紹C++標(biāo)準(zhǔn)程序庫提供的string和complex類。2.5.1使用string對(duì)象C++的string類很復(fù)雜,在這里我們只給出它的部分屬性和操作。字符串str是string類的屬性函數(shù)string是構(gòu)造函數(shù),有多個(gè)函數(shù)find檢索子串函數(shù)size計(jì)算并返回字符串的長度函數(shù)substr返回字符串中的子串stringstrstring();findsizesubstr使用頭文件<string>,即應(yīng)有語句#include<string>string對(duì)象的構(gòu)造stringstr=“abc”;stringstr(“abc”);注意:字符串是“”括起來的字符序列。stringstr=‘a(chǎn)’; //錯(cuò)誤stringstr=“a”; //正確函數(shù)size的應(yīng)用string對(duì)象名.size()字符串連接運(yùn)算符“+”str+“a” //字符串之間的連接Str+‘a(chǎn)’ //字符串與字符之間的連接例2.8:演示使用string對(duì)象及初始化的例子。#include<iostream>#include<string>usingnamespacestd;voidmain() {stringstr1("Wearehere!"); stringstr2="Whereareyou?"; cout<<str1[0]<<str1[11]<<","<<str1<<endl; cout<<str2[0]<<str1[13]<<","<<str2<<endl; cout<<"Pleaseinputaword:"; cin>>str1; cout<<"lengthofthe"<<str1<<"is"<<str1.size()<<"."<<endl; }2.5.2使用string類的典型成員函數(shù)實(shí)例對(duì)象調(diào)用成員函數(shù)的語法可表示如下:對(duì)象名稱.成員函數(shù)(參數(shù)(可供選擇的消息內(nèi)容))函數(shù)size沒有參數(shù)如,str1.size()函數(shù)substr有兩個(gè)參數(shù)第一個(gè)參數(shù):截取串在字符串中的起始位置(從0開始)第二個(gè)參數(shù):截取串的長度(可以超出字符串的長度)如,str2=str1.substr(3,3);函數(shù)find有兩個(gè)參數(shù)返回子串在字符串中的位置,找不到返回-1第一個(gè)參數(shù):要查找的子串第二個(gè)參數(shù):開始查找的位置(缺省時(shí)默認(rèn)為0)如,inti=str1.find(“are”,0);函數(shù)getline用來從流cin中讀出輸入的一行給string類的對(duì)象,如stringstr;getline(cin,str,‘\n’);功能為從鍵盤上讀取一串字符給對(duì)象str,以回車結(jié)束例2.9:將美國日期轉(zhuǎn)換為國際日期的例子。如輸入“December29,2008”,則輸出“28December2008”思路:尋找月份。在第一個(gè)空格之前為月份,用find函數(shù)查找空格位置。尋找日子。在第一個(gè)空格之后到“,”之前為日子,用find函數(shù)查找“,”,用substr函數(shù)取日子數(shù)據(jù)。尋找年份。取剩余子串為年份(注意“,”之后有一空格)。/*源程序*/#include<iostream>#include<string>usingnamespacestd;voidmain(){ stringDate; cout<<"InteradateinAmericanformat:"; getline(cin,Date,'\n'); intx=Date.find(""); stringMonth=Date.substr(0,x); inty=Date.find(","); stringDay=Date.substr(x+1,y-x-1);
stringYear=Date.substr(y+2,Date.size()-y-2); stringNewDate=Day+""+Month+""+Year; cout<<"Originaldate:"<<Date<<endl; cout<<"Converteddate:"<<NewDate<<endl;}InteradateinAmericanformat:Dec22,2003Originaldate:Dec22,2003Converteddate:22Dec20032.5.3使用complex對(duì)象用來定義復(fù)數(shù)對(duì)象使用時(shí)應(yīng)包含頭文件<complex>,即#include<complex>complex對(duì)象有兩個(gè)初始值,用構(gòu)造函數(shù)來實(shí)現(xiàn)多值處理。complex類是一個(gè)模板類,所謂模板,就是指它可以定義多種數(shù)據(jù)類型的復(fù)數(shù)對(duì)象。如實(shí)部與虛部為整數(shù)實(shí)部與虛部為實(shí)數(shù),等其類型可在complex后面加“<type>”來說明。complex對(duì)象的定義complex<type>對(duì)象名(實(shí)部,虛部);complexreal;image;complex();real();imag();例2.10:演示使用complex和string對(duì)象及初始化的例子。/*源程序*/#include<iostream>#include<string>#include<complex>usingnamespacestd;voidmain(){ complex<int>num1(2,3); complex<float>num2(2.5,3); stringstr1("Realpartis:"); stringstr2="Imagepartis:"; cout<<str1<<num1.real()<<","<<str2<<num1.imag()<<endl <<str1<<num2.real()<<","<<str2<<num2.imag()<<endl; }Realpartis:2,Imagepartis:3Realpartis:2.5,Imagepartis:32.5.4使用對(duì)象小節(jié)類是一類對(duì)象的抽象。類的屬性稱為數(shù)據(jù)成員。如string類的str屬性,comple類的實(shí)部與虛部。通過屬性的值來區(qū)分對(duì)象。通過成員函數(shù)(操作方法)對(duì)數(shù)據(jù)成員(屬性)進(jìn)行操作。complex類是一個(gè)模板類,即定義復(fù)數(shù)類時(shí)與類型無關(guān),只有定義對(duì)象時(shí)才指定實(shí)部與虛部的類型。這就象作了一個(gè)燒鑄勺子的模具,具體用什么材質(zhì)(鐵、鋁等)做具體的勺子時(shí)才確定。2.6string對(duì)象數(shù)組與泛型算法第一章中介紹的針對(duì)數(shù)組的泛型算法同樣適用于string類。使用時(shí)應(yīng)請注意以下兩點(diǎn):泛型算法中的find函數(shù)與string類中find成員函數(shù)的區(qū)別。string類中有一個(gè)swap函數(shù)來交換兩個(gè)對(duì)象的屬性。如,stringstr1(“We”),str2(“You”);str1.swap(str2);上面語句的作用是將str1和str2的屬性交換,所以與以下語句等效str2.swap(str1);例2.11:演示string對(duì)象的例子。#include<iostream>#include<string>#include<algorithm>usingnamespacestd;voidmain(){ stringstr1("Wearehere!"),str2=str1; reverse(&str1[0],&str1[0]+12); cout<<str1<<endl; copy(&str1[0],&str1[0]+12,&str2[0]); cout<<str2<<endl; reverse_copy(&str2[0],&str2[0]+12,ostream_iterator<char>(cout)); cout<<endl;}!ereheraeW!ereheraeWWearehere!從上面例子可以看出,當(dāng)使用string對(duì)象中的地址時(shí)很麻煩,str1不再是一個(gè)地址,而是一個(gè)對(duì)象名,引用字符串第一個(gè)字符的地址不得不用&str1[0]。String類提供兩個(gè)成員函數(shù)來標(biāo)識(shí)string對(duì)象中字符串的存儲(chǔ)空間:begin()函數(shù)end()函數(shù)字符串的存儲(chǔ)區(qū)間為:[begin,end)如,對(duì)于str1Weareher!estr1.begin()str1.end()可見,string對(duì)象的字符串中不用“\0”作為結(jié)束標(biāo)志,而char定義的字符串中自動(dòng)加“\0”作為結(jié)束標(biāo)志。例2.12:用成員函數(shù)表示存儲(chǔ)區(qū)間的例子。#include<iostream>#include<string>#include<algorithm>#include<functional>usingnamespacestd;voidmain(){ stringstr1("wearehere!"),str2=str1; reverse(str1.begin(),str1.en
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025福建環(huán)三興港投資集團(tuán)有限公司招聘工作人員補(bǔ)充考試參考題庫及答案解析
- 東華大食品包裝工業(yè)學(xué)課件第4章 金屬、玻璃、陶瓷包裝材料及容器
- 東華大包裝概論課件07復(fù)合包裝材料
- 面向智慧城市建設(shè)的復(fù)雜系統(tǒng)計(jì)算復(fù)雜度評(píng)估模型-洞察及研究
- 2025湖北武漢市漢口重點(diǎn)初級(jí)中學(xué)招聘教師4人筆試備考題庫及答案解析
- 2026河北傳媒學(xué)院招聘134人考試備考題庫及答案解析
- 2025年安陽市中醫(yī)院公開招聘工作人員47人筆試模擬試題及答案解析
- 2026云南昆明醫(yī)科大學(xué)第一附屬醫(yī)院開展第二批校園招聘47人筆試備考題庫及答案解析
- 智慧旅游通行系統(tǒng)創(chuàng)新應(yīng)用研究
- 人工智聯(lián)網(wǎng)構(gòu)與全面應(yīng)用拓展
- 2025版人教版高中物理精講精練必修1專題強(qiáng)化03:水平和傾斜傳送帶模型 原卷版
- 統(tǒng)編版四年級(jí)上冊語文期末專題復(fù)習(xí)課件2-6-文言文之超級(jí)訪問
- 湘少版英語-6年級(jí)上冊-單詞表(帶音標(biāo))
- 新概念英語第一冊隨堂練習(xí)-Lesson53~54 有答案
- 廣東省深圳市龍崗區(qū)外國語學(xué)校2024-2025學(xué)年九年級(jí)上學(xué)期期中歷史試題
- 2020年智慧樹知道網(wǎng)課《非英語國家文化(山東聯(lián)盟)》課后章節(jié)測試滿分答案
- 壅水計(jì)算完整版本
- 07FJ02防空地下室建筑構(gòu)造
- 外研版(三起)(2024)三年級(jí)上冊英語Unit 2 My school things單元測試卷(含答案)
- 化工建設(shè)綜合項(xiàng)目審批作業(yè)流程圖
- 馬工程《經(jīng)濟(jì)法學(xué)》教學(xué)
評(píng)論
0/150
提交評(píng)論