第二章從結(jié)構(gòu)到類(lèi)的演變_第1頁(yè)
第二章從結(jié)構(gòu)到類(lèi)的演變_第2頁(yè)
第二章從結(jié)構(gòu)到類(lèi)的演變_第3頁(yè)
第二章從結(jié)構(gòu)到類(lèi)的演變_第4頁(yè)
第二章從結(jié)構(gòu)到類(lèi)的演變_第5頁(yè)
已閱讀5頁(yè),還剩71頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1第二章從結(jié)構(gòu)到類(lèi)的演變第二章從結(jié)構(gòu)到類(lèi)的演變 C+中的結(jié)構(gòu)與中的結(jié)構(gòu)與C中的結(jié)構(gòu)已經(jīng)發(fā)生了質(zhì)的變化。中的結(jié)構(gòu)已經(jīng)發(fā)生了質(zhì)的變化。本章通過(guò)實(shí)例,簡(jiǎn)要說(shuō)明結(jié)構(gòu)如何向類(lèi)變化,從而本章通過(guò)實(shí)例,簡(jiǎn)要說(shuō)明結(jié)構(gòu)如何向類(lèi)變化,從而引入對(duì)象和類(lèi)的知識(shí)。然后介紹引入對(duì)象和類(lèi)的知識(shí)。然后介紹c+標(biāo)準(zhǔn)程序庫(kù)提標(biāo)準(zhǔn)程序庫(kù)提供的兩個(gè)典型的類(lèi)。通過(guò)使用這兩個(gè)類(lèi),進(jìn)一步熟供的兩個(gè)典型的類(lèi)。通過(guò)使用這兩個(gè)類(lèi),進(jìn)一步熟悉類(lèi)和對(duì)象,為學(xué)習(xí)面向?qū)ο缶幊檀蛳禄A(chǔ)。悉類(lèi)和對(duì)象,為學(xué)習(xí)面向?qū)ο缶幊檀蛳禄A(chǔ)。22.12.1結(jié)構(gòu)的演化結(jié)構(gòu)的演化2.1.1 結(jié)構(gòu)發(fā)生質(zhì)的改變結(jié)構(gòu)發(fā)生質(zhì)的改變 1、定義:由相互關(guān)聯(lián)的相同或者不同數(shù)據(jù)類(lèi)型的、定義

2、:由相互關(guān)聯(lián)的相同或者不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)數(shù)據(jù)組成的有機(jī)整體。是一種構(gòu)造數(shù)據(jù)類(lèi)型。組成的有機(jī)整體。是一種構(gòu)造數(shù)據(jù)類(lèi)型。2 2、定義格式、定義格式struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名成員名1 1; 類(lèi)型標(biāo)識(shí)符類(lèi)型標(biāo)識(shí)符 成員名成員名2 2; .;例:例:struct student char name20 ; int age ; char sex; ;一、一、c中的結(jié)構(gòu)中的結(jié)構(gòu)3結(jié)構(gòu)名稱(chēng)結(jié)構(gòu)名稱(chēng) 變量名稱(chēng)變量名稱(chēng)例如:例如:struct student struct student char name20 ; int age ; char sex; ; ; students

3、tudent stu1,stu2;只有在定義了結(jié)構(gòu)只有在定義了結(jié)構(gòu)體變量后系統(tǒng)才為體變量后系統(tǒng)才為其分配內(nèi)存。其分配內(nèi)存。定義結(jié)構(gòu)體定義結(jié)構(gòu)體類(lèi)型類(lèi)型定義結(jié)構(gòu)體定義結(jié)構(gòu)體變量變量4 結(jié)構(gòu)體變量結(jié)構(gòu)體變量不能整體引用不能整體引用, ,只能引用變量只能引用變量成員成員形式:結(jié)構(gòu)體變量名形式:結(jié)構(gòu)體變量名. .成員名成員名 例如:例如:struct student struct student char name20 ; int age ; char sex; ; ; studentstudent stu1,stu2;stu1.age=25;stu1.sex=F;正確的成員使用正確的成員使用5#in

4、clude using namespace std;void main() struct student char name20; int age; char sex; ; student a; strcpy(,zhang); a.age=12; a.sex=m; ,a.age,a.sexendl;strcpy():字符串復(fù)制函數(shù)。字符串復(fù)制函數(shù)。字符串的賦值不能使用字符串的賦值不能使用“=”,只能使用函數(shù)來(lái)完,只能使用函數(shù)來(lái)完成。成。6 C+允許結(jié)構(gòu)中可以定義函數(shù),這些函數(shù)成為允許結(jié)構(gòu)中可以定義函數(shù),這些函數(shù)成為成員函成員函數(shù)數(shù)。如果將原來(lái)的結(jié)構(gòu)成員稱(chēng)為。如果

5、將原來(lái)的結(jié)構(gòu)成員稱(chēng)為數(shù)據(jù)成員數(shù)據(jù)成員的話(huà),結(jié)構(gòu)的定的話(huà),結(jié)構(gòu)的定義形式為:義形式為:struct 結(jié)構(gòu)名結(jié)構(gòu)名 數(shù)據(jù)成員數(shù)據(jù)成員 成員函數(shù)成員函數(shù);二、函數(shù)與數(shù)據(jù)共存(理解)二、函數(shù)與數(shù)據(jù)共存(理解)定義結(jié)構(gòu)體對(duì)象后,結(jié)構(gòu)體對(duì)象自動(dòng)具有結(jié)構(gòu)體的數(shù)據(jù)成定義結(jié)構(gòu)體對(duì)象后,結(jié)構(gòu)體對(duì)象自動(dòng)具有結(jié)構(gòu)體的數(shù)據(jù)成員和成員函數(shù)。員和成員函數(shù)。可以通過(guò)以下形式來(lái)使用:可以通過(guò)以下形式來(lái)使用: 對(duì)象名對(duì)象名.成員函數(shù)()成員函數(shù)() 對(duì)象名對(duì)象名.數(shù)據(jù)成員數(shù)據(jù)成員 7struct student char name20 ; int age ; char sex; void eat() cout吃飯了吃飯了endl

6、;cout喝湯了喝湯了endl;cout吃飽了吃飽了endl; ; struct student char name20 ; int age ; char sex; ; /結(jié)構(gòu)中只有數(shù)據(jù)結(jié)構(gòu)中只有數(shù)據(jù)/成員函數(shù)成員函數(shù)/數(shù)據(jù)成員數(shù)據(jù)成員函數(shù)與數(shù)據(jù)函數(shù)與數(shù)據(jù)共存共存8void main()student s1; ;couts1.age;couts1.sex; s1.ageendl;s1.eat();struct student char name20 ; int age ; char sex; void eat() cout吃飯了吃飯了endl;cou

7、t喝湯了喝湯了endl;cout吃飽了吃飽了endl; ; 9struct Pointdouble x,y;void Setxy(double a,double b) x=a;y=b;void Display() coutxtyendl;/數(shù)據(jù)成員數(shù)據(jù)成員/成員函數(shù)成員函數(shù)函數(shù)與數(shù)函數(shù)與數(shù)據(jù)共存據(jù)共存10#include /lt2_1.cppusing namespace std;struct Pointdouble x,y;void Setxy(double a,double b) x=a;y=b;void Display() coutxtyendl;void main()Point a;a

8、.Setxy(10.2,5.3);a.Display(); couta.xta.yendl; a.x=20.5;a.y=15.6; a.Display();couta.xta.yendl; /定義結(jié)構(gòu)對(duì)象定義結(jié)構(gòu)對(duì)象a/使用成員函數(shù),給數(shù)據(jù)成員賦值使用成員函數(shù),給數(shù)據(jù)成員賦值/直接使用數(shù)據(jù)成員直接使用數(shù)據(jù)成員/使用成員函數(shù),顯示數(shù)據(jù)成員的值使用成員函數(shù),顯示數(shù)據(jù)成員的值/直接使用數(shù)據(jù)成員,并給其賦值直接使用數(shù)據(jù)成員,并給其賦值10.2 5.310.2 5.320.5 15.620.5 15.6/數(shù)據(jù)成員數(shù)據(jù)成員11#include /lt2_1.cppusing namespace std;s

9、truct Pointdouble x,y;void Setxy(double a,double b)x=a;y=b;void Display()coutxtyendl;void main()Point a;a.Setxy(10.2,5.3);a.Display(); couta.xta.yendl; a.x=20.5;a.y=15.6; a.Display();couta.xta.yendl; 由此例看出,由此例看出,可以通過(guò)結(jié)構(gòu)可以通過(guò)結(jié)構(gòu)的成員函數(shù)使的成員函數(shù)使用數(shù)據(jù)成員,用數(shù)據(jù)成員,a.Setxya.Displaya.xa.y也可以也可以直接直接使使用數(shù)據(jù)成員。用數(shù)據(jù)成員。這稱(chēng)作結(jié)構(gòu)這

10、稱(chēng)作結(jié)構(gòu)Point的的公有公有(publie)性質(zhì)性質(zhì)12三、封裝性三、封裝性若定義結(jié)構(gòu)體時(shí),使用了若定義結(jié)構(gòu)體時(shí),使用了private關(guān)鍵字,則產(chǎn)生關(guān)鍵字,則產(chǎn)生封裝性封裝性。struct Point double x,y; void Setxy(double a,double b) x=a;y=b; void Display() coutxtyendl;public:在結(jié)構(gòu)體中,成員默認(rèn)為在結(jié)構(gòu)體中,成員默認(rèn)為public性質(zhì)。性質(zhì)。private:public:13#include using namespace std;struct Pointprivate: double x,y;

11、public: void Setxy(double a,double b) x=a;y=b; void Display() coutxtyendl;void main()Point a;a.Setxy(10.2,5.3);a.Display();couta.xta.yendl; a.x=20.5;a.y=15.6;couta.xta.yendl; a.Display();void main()Point a;a.Setxy(10.2,5.3);a.Display();couta.xta.yendl; a.x=20.5;a.y=15.6;couta.xta.yendl; a.Display();

12、/使用使用公有的公有的成員函數(shù)成員函數(shù)error:x : cannot access private member declared in class Point試圖使用試圖使用私有的數(shù)私有的數(shù)據(jù)成員據(jù)成員私有的數(shù)據(jù)成員必須通過(guò)私有的數(shù)據(jù)成員必須通過(guò)公有的成員函數(shù)才能使用,公有的成員函數(shù)才能使用,這就稱(chēng)為數(shù)據(jù)的這就稱(chēng)為數(shù)據(jù)的封裝性封裝性。這就變成了具有類(lèi)的性質(zhì)這就變成了具有類(lèi)的性質(zhì)的結(jié)構(gòu)的結(jié)構(gòu)使用了使用了private關(guān)鍵關(guān)鍵字,則產(chǎn)生字,則產(chǎn)生封裝性封裝性14#include using namespace std;struct Pointprivate: double x,y; publi

13、c: void Setxy(double a,double b) x=a;y=b; void Display() coutxtyendl; void main() Point a; a.Setxy(10.2,5.3); a.Display();10.2 5.315由上可知:由上可知:在定義結(jié)構(gòu)時(shí),若使用了在定義結(jié)構(gòu)時(shí),若使用了private則產(chǎn)生封裝性,則產(chǎn)生封裝性,表示成員為表示成員為私有私有的,只能在結(jié)構(gòu)體內(nèi)部通過(guò)的,只能在結(jié)構(gòu)體內(nèi)部通過(guò)公有成員函數(shù)使用。公有成員函數(shù)使用。若未添加若未添加private則表示則表示默認(rèn)為默認(rèn)為public。即:即:私有成員私有成員不不可通過(guò)可通過(guò) 對(duì)象名對(duì)

14、象名.數(shù)據(jù)成員數(shù)據(jù)成員 對(duì)象名對(duì)象名.成員函數(shù)成員函數(shù)()形式來(lái)使用形式來(lái)使用也就是說(shuō)封裝之后不可通過(guò)對(duì)象名使用也就是說(shuō)封裝之后不可通過(guò)對(duì)象名使用private成員成員16四、從結(jié)構(gòu)演變一個(gè)簡(jiǎn)單的類(lèi)四、從結(jié)構(gòu)演變一個(gè)簡(jiǎn)單的類(lèi)使用關(guān)鍵字使用關(guān)鍵字class代替代替struct,就是一個(gè)標(biāo)準(zhǔn)的類(lèi)。,就是一個(gè)標(biāo)準(zhǔn)的類(lèi)。struct Pointprivate: double x,y; public: void Setxy(double a,double b) x=a;y=b; void Display() coutxtyendl;結(jié)結(jié)構(gòu)構(gòu)class類(lèi)類(lèi)使用類(lèi)產(chǎn)生對(duì)象的方式和結(jié)構(gòu)一樣。(如:)使用類(lèi)產(chǎn)生

15、對(duì)象的方式和結(jié)構(gòu)一樣。(如:)17#include using namespace std;class Pointprivate: double x,y; public: void Setxy(double a,double b) x=a;y=b; void Display() coutxtyendl; void main() Point a; a.Setxy(10.2,5.3); a.Display();10.2 5.318課程回顧課程回顧1、在結(jié)構(gòu)中,沒(méi)有使用、在結(jié)構(gòu)中,沒(méi)有使用private定義的成員,默認(rèn)定義的成員,默認(rèn)為為 。public2、私有的數(shù)據(jù)成員,必須通過(guò)公有的成員函數(shù)才能

16、使用,、私有的數(shù)據(jù)成員,必須通過(guò)公有的成員函數(shù)才能使用,這稱(chēng)為數(shù)據(jù)的這稱(chēng)為數(shù)據(jù)的 性。性。封裝封裝3、與結(jié)構(gòu)不同的是,類(lèi)使用、與結(jié)構(gòu)不同的是,類(lèi)使用 關(guān)鍵字來(lái)定義,關(guān)鍵字來(lái)定義,其成員默認(rèn)的性質(zhì)是其成員默認(rèn)的性質(zhì)是 。privateclass19 類(lèi)類(lèi)圖圖的的表表示示20五、使用構(gòu)造函數(shù)初五、使用構(gòu)造函數(shù)初 始化對(duì)象始化對(duì)象 因?yàn)轭?lèi)具有封裝性,所以不能使用因?yàn)轭?lèi)具有封裝性,所以不能使用“對(duì)象名對(duì)象名.數(shù)據(jù)成數(shù)據(jù)成員員”的方式對(duì)數(shù)據(jù)成員進(jìn)行初始化。所以為類(lèi)的方式對(duì)數(shù)據(jù)成員進(jìn)行初始化。所以為類(lèi)Point設(shè)計(jì)設(shè)計(jì)兩個(gè)兩個(gè)專(zhuān)門(mén)用于初始化的函數(shù)專(zhuān)門(mén)用于初始化的函數(shù)。其原型如下:。其原型如下: 因?yàn)轭?lèi)是一

17、種數(shù)據(jù)類(lèi)型,在聲明一個(gè)類(lèi)時(shí)系統(tǒng)并因?yàn)轭?lèi)是一種數(shù)據(jù)類(lèi)型,在聲明一個(gè)類(lèi)時(shí)系統(tǒng)并不會(huì)為其分配內(nèi)存空間,所以在定義類(lèi)中的數(shù)據(jù)成員不會(huì)為其分配內(nèi)存空間,所以在定義類(lèi)中的數(shù)據(jù)成員時(shí),不能對(duì)其進(jìn)行初始化。時(shí),不能對(duì)其進(jìn)行初始化。class Pointprivate: double x=10.5,y=5.6; public: void Setxy(double a,double b) x=a;y=b; void Display() coutxtyendl;錯(cuò)誤錯(cuò)誤Point();();Point(double,double););若定義的函數(shù)與某個(gè)已定義函數(shù)重名而參數(shù)類(lèi)型或個(gè)若定義的函數(shù)與某個(gè)已定義函數(shù)重名而

18、參數(shù)類(lèi)型或個(gè)數(shù)不同,則稱(chēng)為數(shù)不同,則稱(chēng)為 。函數(shù)重載函數(shù)重載在定義類(lèi)時(shí),與類(lèi)同名的函數(shù)稱(chēng)為在定義類(lèi)時(shí),與類(lèi)同名的函數(shù)稱(chēng)為構(gòu)造函數(shù)構(gòu)造函數(shù)。其作用是。其作用是專(zhuān)門(mén)用于初始化對(duì)象。專(zhuān)門(mén)用于初始化對(duì)象。21class Pointprivate: double x,y; public: Point() ; Point (double a,double b) x=a;y=b; void Setxy(double a,double b) x=a;y=b; void Display() coutxtyendl;void main() Point a; a.Setxy(10.2,8.9); a.Display

19、 ();#include using namespace std;/定義對(duì)象定義對(duì)象a/設(shè)置設(shè)置a的數(shù)據(jù)成員的數(shù)據(jù)成員/顯示顯示a的數(shù)據(jù)成員的數(shù)據(jù)成員Point a(10.2,8.9);a.Display ();當(dāng)對(duì)象在內(nèi)存中產(chǎn)生時(shí)當(dāng)對(duì)象在內(nèi)存中產(chǎn)生時(shí)會(huì)會(huì)自動(dòng)調(diào)用自動(dòng)調(diào)用構(gòu)造函數(shù)構(gòu)造函數(shù)222.3面向過(guò)程和面向?qū)ο竺嫦蜻^(guò)程和面向?qū)ο?簡(jiǎn)單了解對(duì)象的含義簡(jiǎn)單了解對(duì)象的含義231、面向過(guò)程、面向過(guò)程 的求解步驟:的求解步驟:例題:給出三角形三個(gè)頂點(diǎn)坐標(biāo),計(jì)算三邊長(zhǎng),并輸出。例題:給出三角形三個(gè)頂點(diǎn)坐標(biāo),計(jì)算三邊長(zhǎng),并輸出。(1)輸入三個(gè)頂點(diǎn)坐標(biāo))輸入三個(gè)頂點(diǎn)坐標(biāo)A(x1,y1),B(x2,y2),

20、C(x3,y3)(2)計(jì)算)計(jì)算(x1,y1)和和(x2,y2)距離距離AB(3)計(jì)算)計(jì)算(x1,y1)和和(x3,y3)距離距離AC(4)計(jì)算)計(jì)算(x2,y2)和和(x3,y3)距離距離BC(5)輸出三個(gè)距離)輸出三個(gè)距離AB、AC、BC24題解:題解:lt2_6.cpp#include #include using namespace std;void main()25void main() double x1,y1,x2,y2,x3,y3; double AB,AC,BC; coutx1y1; coutx2y2; coutx3y3; AB=sqrt(x1-x2)*(x1-x2)+(y

21、1-y2)*(y1-y2); AC=sqrt(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3); BC=sqrt(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3); coutAB的距離的距離:ABendl; coutAC的距離的距離:ACendl; coutBC的距離的距離:BCendl;/聲明變量聲明變量262、面向?qū)ο?、面向?qū)ο?的求解步驟的求解步驟(給出三角形三個(gè)頂點(diǎn)坐標(biāo),計(jì)算三邊長(zhǎng),并輸出)(給出三角形三個(gè)頂點(diǎn)坐標(biāo),計(jì)算三邊長(zhǎng),并輸出)Pointx:doubley:doublePoint()Setxy(double,double)Getx()Gety()Getl

22、ength()27Pointx:doubley:doublePoint()Setxy(double,double)Getx()Gety()Getlength()class Pointprivate: double x,y;public: Point() ; Point(double a,double b) void Setxy(double a,double b) double Getx() double Gety() double Getlength(Point b) ;28#include #include using namespace std;class Point;void main

23、() double AB,AC,BC;Point a(2.5,3.6),b(4.5,3.6),c(3.5,5.6);AB= a.Getlength(b); AC= a.Getlength(c);BC= b.Getlength(c);coutAB的距離的距離:ABendl;coutAC的距離的距離:ACendl;coutBC的距離的距離:BCendl;292.4 C+面向?qū)ο蟪绦蛟O(shè)計(jì)特點(diǎn)面向?qū)ο蟪绦蛟O(shè)計(jì)特點(diǎn)操操 作:作:是對(duì)象是對(duì)象動(dòng)態(tài)特征動(dòng)態(tài)特征的一個(gè)函數(shù)序列,用函數(shù)來(lái)實(shí)現(xiàn),的一個(gè)函數(shù)序列,用函數(shù)來(lái)實(shí)現(xiàn), 也稱(chēng)方法或服務(wù)。稱(chēng)為也稱(chēng)方法或服務(wù)。稱(chēng)為成員函數(shù)。成員函數(shù)。 和傳統(tǒng)的程序設(shè)計(jì)方法相比,

24、面向?qū)ο蟮某绦蛟O(shè)和傳統(tǒng)的程序設(shè)計(jì)方法相比,面向?qū)ο蟮某绦蛟O(shè)計(jì)具有計(jì)具有抽象抽象、封裝封裝、集成集成和和多態(tài)性多態(tài)性等關(guān)鍵要素。等關(guān)鍵要素。一、對(duì)象一、對(duì)象 C+中對(duì)象是描述客觀事物的一個(gè)實(shí)體,是中對(duì)象是描述客觀事物的一個(gè)實(shí)體,是構(gòu)成系構(gòu)成系統(tǒng)的基本單位統(tǒng)的基本單位??梢允褂???梢允褂脤?duì)象名對(duì)象名、屬性屬性和和操作操作三要素來(lái)三要素來(lái)描述一個(gè)對(duì)象。描述一個(gè)對(duì)象。 對(duì)象名:對(duì)象名:用來(lái)標(biāo)識(shí)一個(gè)具體對(duì)象,用來(lái)標(biāo)識(shí)一個(gè)具體對(duì)象,屬屬 性:性:就是描述對(duì)象就是描述對(duì)象靜態(tài)特征靜態(tài)特征的一個(gè)數(shù)據(jù)項(xiàng),用數(shù)據(jù)的一個(gè)數(shù)據(jù)項(xiàng),用數(shù)據(jù)來(lái)表示,稱(chēng)為來(lái)表示,稱(chēng)為數(shù)據(jù)成員數(shù)據(jù)成員。30操作操作1 1操作操作2 2操作操作

25、n n屬性屬性1 1屬性屬性2 2屬性屬性n n對(duì)象名對(duì)象名對(duì)對(duì)象象的的結(jié)結(jié)構(gòu)構(gòu)圖圖31二、抽象和類(lèi)二、抽象和類(lèi) 如果把程序看作是由一組抽象的對(duì)象組成的,然后將如果把程序看作是由一組抽象的對(duì)象組成的,然后將一組對(duì)象的共同特征抽象出來(lái),就形成了一組對(duì)象的共同特征抽象出來(lái),就形成了“類(lèi)類(lèi)”的概念。的概念。類(lèi)由類(lèi)由類(lèi)名類(lèi)名、一組屬性一組屬性和和一組操作一組操作3部分構(gòu)成部分構(gòu)成類(lèi)的類(lèi)的屬性:屬性:是性質(zhì)的說(shuō)明。對(duì)象才具有具體的數(shù)據(jù),是性質(zhì)的說(shuō)明。對(duì)象才具有具體的數(shù)據(jù), 具體的屬性具體的屬性類(lèi)的類(lèi)的操作:操作:是行為的定義是行為的定義32 類(lèi)是具有相同屬性和操作的一組對(duì)象的集合,它為屬類(lèi)是具有相同屬性

26、和操作的一組對(duì)象的集合,它為屬于該類(lèi)的全部對(duì)象提供統(tǒng)一描述,內(nèi)部主要包括:屬于該類(lèi)的全部對(duì)象提供統(tǒng)一描述,內(nèi)部主要包括:屬性和操作兩部分。性和操作兩部分。類(lèi)與對(duì)象的關(guān)系:類(lèi)與對(duì)象的關(guān)系: 對(duì)象是由一些屬性和操作構(gòu)成的。對(duì)象屬性和操作描對(duì)象是由一些屬性和操作構(gòu)成的。對(duì)象屬性和操作描 述對(duì)象內(nèi)部細(xì)節(jié)。述對(duì)象內(nèi)部細(xì)節(jié)。 類(lèi)的作用是類(lèi)的作用是定義對(duì)象。定義對(duì)象。 c+中將對(duì)象稱(chēng)做類(lèi)的中將對(duì)象稱(chēng)做類(lèi)的實(shí)例實(shí)例怎樣理解怎樣理解“一個(gè)一個(gè)類(lèi)的所有對(duì)象具類(lèi)的所有對(duì)象具有相同的屬性有相同的屬性”?是指是指屬性屬性的的個(gè)數(shù)個(gè)數(shù)、名稱(chēng)名稱(chēng)、數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型相同相同,各個(gè)對(duì),各個(gè)對(duì)象的象的屬性值屬性值則可以則可以互不

27、互不相同相同,并且隨著程序的,并且隨著程序的執(zhí)行而變化。執(zhí)行而變化。33 一個(gè)對(duì)象的屬性和操作是緊密結(jié)合的,對(duì)象一個(gè)對(duì)象的屬性和操作是緊密結(jié)合的,對(duì)象的屬性只能由這個(gè)對(duì)象的操作來(lái)存取,對(duì)象的屬性只能由這個(gè)對(duì)象的操作來(lái)存取,對(duì)象的操作分為內(nèi)部操作和外部操作,內(nèi)部操作的操作分為內(nèi)部操作和外部操作,內(nèi)部操作只提供對(duì)象內(nèi)部其他操作使用,不對(duì)外提供。只提供對(duì)象內(nèi)部其他操作使用,不對(duì)外提供。外部操作提供一個(gè)消息接口,通過(guò)這個(gè)接口外部操作提供一個(gè)消息接口,通過(guò)這個(gè)接口接收對(duì)象外部的消息并為之提供操作(服接收對(duì)象外部的消息并為之提供操作(服務(wù))。務(wù))。三、封裝三、封裝34對(duì)象內(nèi)部數(shù)據(jù)的不可訪(fǎng)問(wèn)性稱(chēng)為數(shù)據(jù)隱藏,

28、封對(duì)象內(nèi)部數(shù)據(jù)的不可訪(fǎng)問(wèn)性稱(chēng)為數(shù)據(jù)隱藏,封裝給數(shù)據(jù)提供了與外界聯(lián)系的接口,無(wú)論是誰(shuí),裝給數(shù)據(jù)提供了與外界聯(lián)系的接口,無(wú)論是誰(shuí),只有通過(guò)這些接口,使用規(guī)范的格式,才能訪(fǎng)只有通過(guò)這些接口,使用規(guī)范的格式,才能訪(fǎng)問(wèn)內(nèi)部數(shù)據(jù)。問(wèn)內(nèi)部數(shù)據(jù)。封裝就是把對(duì)象的屬性和操作結(jié)合成一個(gè)獨(dú)立封裝就是把對(duì)象的屬性和操作結(jié)合成一個(gè)獨(dú)立的系統(tǒng)單位,并盡可能隱藏對(duì)象的內(nèi)部細(xì)節(jié)。的系統(tǒng)單位,并盡可能隱藏對(duì)象的內(nèi)部細(xì)節(jié)。封裝在類(lèi)中是通過(guò)封裝在類(lèi)中是通過(guò)存取權(quán)限存取權(quán)限(如私有的:(如私有的:private、公有的:、公有的:public)實(shí)現(xiàn)的。實(shí)現(xiàn)的。35繼承是一個(gè)類(lèi)獲得另一個(gè)類(lèi)的特性的機(jī)制。繼承是一個(gè)類(lèi)獲得另一個(gè)類(lèi)的特性的

29、機(jī)制。 繼承支持層次概念繼承支持層次概念四、繼承(第四、繼承(第6章)章)36 不同對(duì)象可以調(diào)用同名函數(shù),但可導(dǎo)致完不同對(duì)象可以調(diào)用同名函數(shù),但可導(dǎo)致完全不同的行為的現(xiàn)象稱(chēng)為全不同的行為的現(xiàn)象稱(chēng)為多態(tài)性多態(tài)性。 例如除法運(yùn)算例如除法運(yùn)算 / 3/2 3.0/2五、多態(tài)性(第五、多態(tài)性(第8章)章)372.52.5使用類(lèi)和對(duì)象使用類(lèi)和對(duì)象 2.5.1使用使用string對(duì)象對(duì)象 C+標(biāo)準(zhǔn)程序庫(kù)提供了標(biāo)準(zhǔn)程序庫(kù)提供了string類(lèi)和類(lèi)和complex類(lèi)。本節(jié)類(lèi)。本節(jié)通過(guò)這兩個(gè)類(lèi)了解類(lèi)和對(duì)象的使用。通過(guò)這兩個(gè)類(lèi)了解類(lèi)和對(duì)象的使用。3839一、一、stringstring對(duì)象的定義對(duì)象的定義格式:格式

30、:string 對(duì)象名對(duì)象名如:如:string str1,str2;二、二、string 對(duì)象的初始化對(duì)象的初始化 string對(duì)象隸屬于對(duì)象隸屬于string類(lèi),所以必須用類(lèi),所以必須用雙引號(hào)雙引號(hào)括起來(lái)的字符串進(jìn)行初始化。括起來(lái)的字符串進(jìn)行初始化。401、定義的同時(shí)初始化、定義的同時(shí)初始化格式:格式:string 對(duì)象名(初始值)對(duì)象名(初始值) string 對(duì)象名對(duì)象名=初始值初始值正確正確錯(cuò)誤錯(cuò)誤hw41422、從鍵盤(pán)接收字符串給、從鍵盤(pán)接收字符串給string類(lèi)對(duì)象賦值。類(lèi)對(duì)象賦值。格式:格式:getline(cin,對(duì)象名對(duì)象名,結(jié)束字符結(jié)束字符)第三個(gè)參數(shù)是字符串的結(jié)束符,第

31、三個(gè)參數(shù)是字符串的結(jié)束符,也就是當(dāng)也就是當(dāng)getline遇到這個(gè)結(jié)束遇到這個(gè)結(jié)束符時(shí),就不在接受輸入了符時(shí),就不在接受輸入了 。系。系統(tǒng)默認(rèn)為回車(chē)符統(tǒng)默認(rèn)為回車(chē)符n。如:如:string str;getline(cin,str,n);coutstr對(duì)象名對(duì)象名如:如:string str;getline(cin,str,n);coutstrstr;coutstrendl; 44三、三、stringstring類(lèi)常用的幾個(gè)方法(成員函數(shù))類(lèi)常用的幾個(gè)方法(成員函數(shù))1、size():求對(duì)象的長(zhǎng)度。求對(duì)象的長(zhǎng)度。格式:格式:對(duì)象名對(duì)象名.成員函數(shù)名成員函數(shù)名例:例:string str=“a bo

32、y”; coutstr.size()endl;則輸出結(jié)果為:則輸出結(jié)果為:545例題:請(qǐng)分析一下程序結(jié)果例題:請(qǐng)分析一下程序結(jié)果(lt2_7.cpp)#include #include using namespace std;void main() string str=a boy; int n=0,i=0; while(stri!=0) n+; i+; coutn:nendl; coutsize:str.size()endl;求字符串求字符串長(zhǎng)度。同長(zhǎng)度。同size函數(shù)函數(shù)462 2、substr():substr():求字符串的字串求字符串的字串格式:格式:substr(int start

33、,int length)功能:從功能:從start位置開(kāi)始,截取位置開(kāi)始,截取length個(gè)長(zhǎng)度的字符串。個(gè)長(zhǎng)度的字符串。注注:(1)c+規(guī)定字符串的計(jì)數(shù)從規(guī)定字符串的計(jì)數(shù)從0開(kāi)始。開(kāi)始。例如:例如:string str=“wish you happy!”;string newstr= str.substr(5,3) ;coutnewstrendl;程序輸出:程序輸出:注注: (2)截取的起始位截取的起始位置必須位于字符串中,置必須位于字符串中,否則出錯(cuò)。否則出錯(cuò)。注注: (3)如果截取的長(zhǎng)如果截取的長(zhǎng)度大于字符串長(zhǎng)度,度大于字符串長(zhǎng)度,則自動(dòng)截取到末尾。則自動(dòng)截取到末尾。473 3、find

34、( ):find( ):字符串檢索字符串檢索格式:格式:find( 要查找的字符串,開(kāi)始查找的位置要查找的字符串,開(kāi)始查找的位置)功能:從指定位置開(kāi)始查找所需的字符串,如果找到了,功能:從指定位置開(kāi)始查找所需的字符串,如果找到了,則返回字符串在主串中的位置,如果沒(méi)有沒(méi)到則返回則返回字符串在主串中的位置,如果沒(méi)有沒(méi)到則返回-1。如果沒(méi)有指定開(kāi)始查找的位置,則系統(tǒng)默認(rèn)為如果沒(méi)有指定開(kāi)始查找的位置,則系統(tǒng)默認(rèn)為0。例如:例如: string s=“how are you? “ int n=s.find( “are” , 0 );則則n的值為:的值為:4“how”“me”0-148例題:以下程序是輸入

35、一個(gè)美國(guó)格式的日期(月例題:以下程序是輸入一個(gè)美國(guó)格式的日期(月 日日,年)年),(用字符串來(lái)接受日期)。然后轉(zhuǎn)換成(用字符串來(lái)接受日期)。然后轉(zhuǎn)換成”XX年年XX月月XX”日日 的形式輸出。的形式輸出。例如:輸入例如:輸入31 3,2011則輸出則輸出2011年年3月月31日。日。49#includeusing namespace std;void main()#include data,day,month,year;stringcoutEnter the date(e.g. 3 31,2011):;getline(cin,data,n);int i= data.find( );data.s

36、ubstr (0,i);month=data.find(,);int k=day=data.substr( , );stringdata.substr ( , );coutyear年年month月月day日日endl;i+1 k-i-1 year=k+14504、+:將前后兩個(gè):將前后兩個(gè)string s1=you,s2=happy; couts1+ +s2endl;注:字符串也可與單個(gè)字符常量相加。注:字符串也可與單個(gè)字符常量相加。如上例中:如上例中:couts1+ +s2endl;51#includeusing namespace std;void main()#include data,

37、day,month,year;stringcoutEnter the date(e.g. 3 31,2011):;getline(cin,data,n);int i= data.find( );data.substr (0,i);month=data.find(,);int k=day=data.substr( , );stringdata.substr ( , );coutnewdateendl;i+1 k-i-1 year=k+14如何將新格如何將新格式的日期存式的日期存入入newdate對(duì)象中對(duì)象中string newdate= year+年年+month+月月+day+日日;52四、四

38、、stringstring對(duì)象數(shù)組與泛型算法對(duì)象數(shù)組與泛型算法 此前在數(shù)組中介紹的泛型算法同樣適合于此前在數(shù)組中介紹的泛型算法同樣適合于string類(lèi)。類(lèi)。1、swap():交換兩個(gè)交換兩個(gè)string對(duì)象的屬性。對(duì)象的屬性。格式:對(duì)象格式:對(duì)象1.swap(對(duì)象對(duì)象2)例如:例如:string s1=“me”,s2=“you”; couts1“,”s2endl; s1.swap(s2); couts1“,”s2endl;s2.swap(s1);另外另外string類(lèi)還有幾個(gè)成員函數(shù)。類(lèi)還有幾個(gè)成員函數(shù)。#include#include #include using namespace std

39、;void main()string s=china;coutsendl;reverse(&s0,&s0+5);coutsendl;size(s);532、begin():指示第一個(gè)元素位置():指示第一個(gè)元素位置 end():指示最后一個(gè)元素():指示最后一個(gè)元素之后之后的位置的位置 當(dāng)使用泛型算法時(shí),如果當(dāng)使用泛型算法時(shí),如果begin不等于不等于end,算法首,算法首先作用于先作用于begin所指元素,并將所指元素,并將begin前進(jìn)一個(gè)位置,然前進(jìn)一個(gè)位置,然后作用于當(dāng)前的后作用于當(dāng)前的begin所指元素,如此繼續(xù)下去,直到所指元素,如此繼續(xù)下去,直到begin等于等于end為止。為止

40、。如有:如有:string s=“china”chinas.begin()s.end()注:使用注:使用string定義的字符串中不用字符定義的字符串中不用字符0作為結(jié)束符,作為結(jié)束符,使用使用char定義的字符串則自動(dòng)在末尾加入定義的字符串則自動(dòng)在末尾加入0作為結(jié)束作為結(jié)束符。符。54例題:以下程序是實(shí)現(xiàn)字符串內(nèi)容的反轉(zhuǎn)。例題:以下程序是實(shí)現(xiàn)字符串內(nèi)容的反轉(zhuǎn)。#include#include #include using namespace std;void main()string s=china;coutsendl;reverse( &s0 , &s0+5 );coutsendl;s.b

41、egin()s.end()reverse(s.begin (),s.end() );55練習(xí):以下程序是將一個(gè)字符串中的字母轉(zhuǎn)換成大寫(xiě)練習(xí):以下程序是將一個(gè)字符串中的字母轉(zhuǎn)換成大寫(xiě)輸出,其他字符不變。如輸入輸出,其他字符不變。如輸入”Im 20 years old”,則轉(zhuǎn)換成則轉(zhuǎn)換成IM 20 YEARS OLD.#include#include using namespace std;void main() string s; char *p; getline(cin,s,n); coutsendl; for( p=s.begin() ; p=a&*p=a) *p=*p-32; coutse

42、ndl;/定義一個(gè)字符串對(duì)象定義一個(gè)字符串對(duì)象s/定義一個(gè)指針用來(lái)遍歷字符串中的每一個(gè)字符。定義一個(gè)指針用來(lái)遍歷字符串中的每一個(gè)字符。/輸入一個(gè)字符串給輸入一個(gè)字符串給s/輸入原字符串輸入原字符串/轉(zhuǎn)換轉(zhuǎn)換56#include#include using namespace std;void main() string s; char *p; getline(cin,s,n); coutsendl; for( p=s.begin() ; p=a&*p=a) *p=*p-32; coutsendl;57#include using namespace std;void main()string

43、s1=happy!,s2(s1);/反轉(zhuǎn)反轉(zhuǎn)s1reverse(s1.begin(),s1.end();#include /原樣復(fù)制原樣復(fù)制s1給給s2couts1endl;!yppahcopy(s1.begin(),s1.end(),s2.begin();couts1endl;couts2endl;/將將s1升冪排序升冪排序sort(s1.begin(),s1.end();!ahppy!yppahcouts1endl;happy!#include 練習(xí):按要求填空練習(xí):按要求填空58#include #include using namespace std;void main()string

44、 s1=wearehere!,s2(s1);練習(xí):按要求填空練習(xí):按要求填空/將將s1中的中的s12到到s14的的內(nèi)容逆向內(nèi)容逆向couts1endl;wearehere!reverse_copy(s1.begin(),s1.end(),s2.begin();couts2endl;/逆向復(fù)制逆向復(fù)制s1給給s2!ereheraewreverse(s2.begin()+2,s2.begin()+4);/輸出逆向的部分內(nèi)容輸出逆向的部分內(nèi)容eracopy(s2.begin()+2,s2.begin()+4, ostream_iterator(cout);coutendl;59#include #i

45、nclude using namespace std;void main()string s1=wearehere!,s2(s1);練習(xí):按要求填空練習(xí):按要求填空/將將s1降冪排序降冪排序sort(s1.begin(),s1.end(),greater();couts1endl;wearehere!couts1endl;wrrheeeea!/查找是否存查找是否存在在e字符,是字符,是返回返回1,反則返,反則返回回0。#include cout(*find(s1.begin(),s1.end(),e)=e)a Dx-a()3對(duì)象的四大基本特性是多態(tài)性、繼承性、_和封裝性。抽象性抽象性BB課程回

46、顧634為了使類(lèi)中的成員不能被類(lèi)外的函數(shù)通過(guò)成員操作符訪(fǎng)問(wèn),則應(yīng)把該成員的訪(fǎng)問(wèn)權(quán)限定義為_(kāi)。private5.C+允許在結(jié)構(gòu)中定義函數(shù),這些函數(shù)稱(chēng)為( )A.靜態(tài)函數(shù) B.構(gòu)造函數(shù) C.析構(gòu)函數(shù) D.成員函數(shù)6.下列哪個(gè)不是面向?qū)ο蟮年P(guān)鍵要素( )A.抽象性B.結(jié)構(gòu)性C.封裝性D.多態(tài)性D.B.64真題真題7.C+類(lèi)的構(gòu)造函數(shù)名與_名稱(chēng)一樣,且沒(méi)有返回值。8.C+類(lèi)中定義的成員默認(rèn)訪(fǎng)問(wèn)屬性為( ) A.public B.private C.protected D.friend 類(lèi)類(lèi)B9.不同對(duì)象調(diào)用同名函數(shù),但導(dǎo)致完全不同行為的現(xiàn)象稱(chēng)為( ) A.抽象 B.封裝 C.繼承 D.多態(tài)性D6510

47、.類(lèi)的構(gòu)造函數(shù)在以下什么情況下會(huì)被自動(dòng)調(diào)用( )A.定義成員函數(shù)時(shí) B.定義對(duì)象時(shí) C.定義數(shù)據(jù)成員時(shí) D.定義友元函數(shù)時(shí)11.與操作對(duì)象的數(shù)據(jù)類(lèi)型相互獨(dú)立的算法稱(chēng)為_(kāi). 泛型算法泛型算法B6612不同對(duì)象可以調(diào)用相同名稱(chēng)的函數(shù),但可導(dǎo)致完全不同的行為的現(xiàn)象稱(chēng)為_(kāi)。多態(tài)性多態(tài)性13在使用string類(lèi)的find成員函數(shù)來(lái)檢索主串中是否含有指定的子串時(shí),若在主串中不含指定的子串,find函數(shù)的返回值是_。-167作業(yè):作業(yè):編寫(xiě)程序完成字符串的替換功能:具體要求:編寫(xiě)程序完成字符串的替換功能:具體要求:輸入要查找的字符串和要替換的字符串,然后在給出的輸入要查找的字符串和要替換的字符串,然后在給出的字符串中進(jìn)行字符串的替換。運(yùn)行結(jié)果示例如下:字符串中進(jìn)行字符串的替換。運(yùn)行結(jié)果示例如下:683、string數(shù)組數(shù)組 可以聲明可以聲明string類(lèi)數(shù)組,但只能對(duì)數(shù)組分量使用上述操作,類(lèi)數(shù)組,但只能對(duì)數(shù)組分量使用上述操作,不能對(duì)整個(gè)數(shù)組使用這些操作。不能對(duì)整個(gè)數(shù)組使用這些操作。例題例題(lt2_13.cpp):編程將一個(gè)字符串?dāng)?shù)組中的元素倒序排放。例如:編程將一個(gè)字符串?dāng)?shù)組中的元素倒序排放。例如:string s5=zhang,wang

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論