版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1第二章從結(jié)構(gòu)到類的演變第二章從結(jié)構(gòu)到類的演變 C+中的結(jié)構(gòu)與中的結(jié)構(gòu)與C中的結(jié)構(gòu)已經(jīng)發(fā)生了質(zhì)的變化。中的結(jié)構(gòu)已經(jīng)發(fā)生了質(zhì)的變化。本章通過實(shí)例,簡要說明結(jié)構(gòu)如何向類變化,從而本章通過實(shí)例,簡要說明結(jié)構(gòu)如何向類變化,從而引入對象和類的知識。然后介紹引入對象和類的知識。然后介紹c+標(biāo)準(zhǔn)程序庫提標(biāo)準(zhǔn)程序庫提供的兩個典型的類。通過使用這兩個類,進(jìn)一步熟供的兩個典型的類。通過使用這兩個類,進(jìn)一步熟悉類和對象,為學(xué)習(xí)面向?qū)ο缶幊檀蛳禄A(chǔ)。悉類和對象,為學(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ù)類型的、定義
2、:由相互關(guān)聯(lián)的相同或者不同數(shù)據(jù)類型的數(shù)據(jù)數(shù)據(jù)組成的有機(jī)整體。是一種構(gòu)造數(shù)據(jù)類型。組成的有機(jī)整體。是一種構(gòu)造數(shù)據(jù)類型。2 2、定義格式、定義格式struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 類型標(biāo)識符類型標(biāo)識符 成員名成員名1 1; 類型標(biāo)識符類型標(biāo)識符 成員名成員名2 2; .;例:例:struct student char name20 ; int age ; char sex; ;一、一、c中的結(jié)構(gòu)中的結(jié)構(gòu)3結(jié)構(gòu)名稱結(jié)構(gòu)名稱 變量名稱變量名稱例如:例如: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)體類型類型定義結(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ù)來完,只能使用函數(shù)來完成。成。6 C+允許結(jié)構(gòu)中可以定義函數(shù),這些函數(shù)成為允許結(jié)構(gòu)中可以定義函數(shù),這些函數(shù)成為成員函成員函數(shù)數(shù)。如果將原來的結(jié)構(gòu)成員稱為。如果
5、將原來的結(jié)構(gòu)成員稱為數(shù)據(jù)成員數(shù)據(jù)成員的話,結(jié)構(gòu)的定的話,結(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)體對象后,結(jié)構(gòu)體對象自動具有結(jié)構(gòu)體的數(shù)據(jù)成定義結(jié)構(gòu)體對象后,結(jié)構(gòu)體對象自動具有結(jié)構(gòu)體的數(shù)據(jù)成員和成員函數(shù)。員和成員函數(shù)??梢酝ㄟ^以下形式來使用:可以通過以下形式來使用: 對象名對象名.成員函數(shù)()成員函數(shù)() 對象名對象名.數(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)對象定義結(jié)構(gòu)對象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; 由此例看出,由此例看出,可以通過結(jié)構(gòu)可以通過結(jié)構(gòu)的成員函數(shù)使的成員函數(shù)使用數(shù)據(jù)成員,用數(shù)據(jù)成員,a.Setxya.Displaya.xa.y也可以也可以直接直接使使用數(shù)據(jù)成員。用數(shù)據(jù)成員。這稱作結(jié)構(gòu)這
10、稱作結(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ù)成員必須通過私有的數(shù)據(jù)成員必須通過公有的成員函數(shù)才能使用,公有的成員函數(shù)才能使用,這就稱為數(shù)據(jù)的這就稱為數(shù)據(jù)的封裝性封裝性。這就變成了具有類的性質(zhì)這就變成了具有類的性質(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)部通過的,只能在結(jié)構(gòu)體內(nèi)部通過公有成員函數(shù)使用。公有成員函數(shù)使用。若未添加若未添加private則表示則表示默認(rèn)為默認(rèn)為public。即:即:私有成員私有成員不不可通過可通過 對象名對
14、象名.數(shù)據(jù)成員數(shù)據(jù)成員 對象名對象名.成員函數(shù)成員函數(shù)()形式來使用形式來使用也就是說封裝之后不可通過對象名使用也就是說封裝之后不可通過對象名使用private成員成員16四、從結(jié)構(gòu)演變一個簡單的類四、從結(jié)構(gòu)演變一個簡單的類使用關(guān)鍵字使用關(guān)鍵字class代替代替struct,就是一個標(biāo)準(zhǔn)的類。,就是一個標(biāo)準(zhǔn)的類。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類類使用類產(chǎn)生對象的方式和結(jié)構(gòu)一樣。(如:)使用類產(chǎn)生
15、對象的方式和結(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)中,沒有使用、在結(jié)構(gòu)中,沒有使用private定義的成員,默認(rèn)定義的成員,默認(rèn)為為 。public2、私有的數(shù)據(jù)成員,必須通過公有的成員函數(shù)才能
16、使用,、私有的數(shù)據(jù)成員,必須通過公有的成員函數(shù)才能使用,這稱為數(shù)據(jù)的這稱為數(shù)據(jù)的 性。性。封裝封裝3、與結(jié)構(gòu)不同的是,類使用、與結(jié)構(gòu)不同的是,類使用 關(guān)鍵字來定義,關(guān)鍵字來定義,其成員默認(rèn)的性質(zhì)是其成員默認(rèn)的性質(zhì)是 。privateclass19 類類圖圖的的表表示示20五、使用構(gòu)造函數(shù)初五、使用構(gòu)造函數(shù)初 始化對象始化對象 因?yàn)轭惥哂蟹庋b性,所以不能使用因?yàn)轭惥哂蟹庋b性,所以不能使用“對象名對象名.數(shù)據(jù)成數(shù)據(jù)成員員”的方式對數(shù)據(jù)成員進(jìn)行初始化。所以為類的方式對數(shù)據(jù)成員進(jìn)行初始化。所以為類Point設(shè)計(jì)設(shè)計(jì)兩個兩個專門用于初始化的函數(shù)專門用于初始化的函數(shù)。其原型如下:。其原型如下: 因?yàn)轭愂且?/p>
17、種數(shù)據(jù)類型,在聲明一個類時(shí)系統(tǒng)并因?yàn)轭愂且环N數(shù)據(jù)類型,在聲明一個類時(shí)系統(tǒng)并不會為其分配內(nèi)存空間,所以在定義類中的數(shù)據(jù)成員不會為其分配內(nèi)存空間,所以在定義類中的數(shù)據(jù)成員時(shí),不能對其進(jìn)行初始化。時(shí),不能對其進(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;錯誤錯誤Point();();Point(double,double););若定義的函數(shù)與某個已定義函數(shù)重名而參數(shù)類型或個若定義的函數(shù)與某個已定義函數(shù)重名而
18、參數(shù)類型或個數(shù)不同,則稱為數(shù)不同,則稱為 。函數(shù)重載函數(shù)重載在定義類時(shí),與類同名的函數(shù)稱為在定義類時(shí),與類同名的函數(shù)稱為構(gòu)造函數(shù)構(gòu)造函數(shù)。其作用是。其作用是專門用于初始化對象。專門用于初始化對象。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;/定義對象定義對象a/設(shè)置設(shè)置a的數(shù)據(jù)成員的數(shù)據(jù)成員/顯示顯示a的數(shù)據(jù)成員的數(shù)據(jù)成員Point a(10.2,8.9);a.Display ();當(dāng)對象在內(nèi)存中產(chǎn)生時(shí)當(dāng)對象在內(nèi)存中產(chǎn)生時(shí)會會自動調(diào)用自動調(diào)用構(gòu)造函數(shù)構(gòu)造函數(shù)222.3面向過程和面向?qū)ο竺嫦蜻^程和面向?qū)ο?簡單了解對象的含義簡單了解對象的含義231、面向過程、面向過程 的求解步驟:的求解步驟:例題:給出三角形三個頂點(diǎn)坐標(biāo),計(jì)算三邊長,并輸出。例題:給出三角形三個頂點(diǎn)坐標(biāo),計(jì)算三邊長,并輸出。(1)輸入三個頂點(diǎn)坐標(biāo))輸入三個頂點(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)輸出三個距離)輸出三個距離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ū)ο?的求解步驟的求解步驟(給出三角形三個頂點(diǎn)坐標(biāo),計(jì)算三邊長,并輸出)(給出三角形三個頂點(diǎn)坐標(biāo),計(jì)算三邊長,并輸出)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)操操 作:作:是對象是對象動態(tài)特征動態(tài)特征的一個函數(shù)序列,用函數(shù)來實(shí)現(xiàn),的一個函數(shù)序列,用函數(shù)來實(shí)現(xiàn), 也稱方法或服務(wù)。稱為也稱方法或服務(wù)。稱為成員函數(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)鍵要素。一、對象一、對象 C+中對象是描述客觀事物的一個實(shí)體,是中對象是描述客觀事物的一個實(shí)體,是構(gòu)成系構(gòu)成系統(tǒng)的基本單位統(tǒng)的基本單位。可以使用。可以使用對象名對象名、屬性屬性和和操作操作三要素來三要素來描述一個對象。描述一個對象。 對象名:對象名:用來標(biāo)識一個具體對象,用來標(biāo)識一個具體對象,屬屬 性:性:就是描述對象就是描述對象靜態(tài)特征靜態(tài)特征的一個數(shù)據(jù)項(xiàng),用數(shù)據(jù)的一個數(shù)據(jù)項(xiàng),用數(shù)據(jù)來表示,稱為來表示,稱為數(shù)據(jù)成員數(shù)據(jù)成員。30操作操作1 1操作操作2 2操作操作
25、n n屬性屬性1 1屬性屬性2 2屬性屬性n n對象名對象名對對象象的的結(jié)結(jié)構(gòu)構(gòu)圖圖31二、抽象和類二、抽象和類 如果把程序看作是由一組抽象的對象組成的,然后將如果把程序看作是由一組抽象的對象組成的,然后將一組對象的共同特征抽象出來,就形成了一組對象的共同特征抽象出來,就形成了“類類”的概念。的概念。類由類由類名類名、一組屬性一組屬性和和一組操作一組操作3部分構(gòu)成部分構(gòu)成類的類的屬性:屬性:是性質(zhì)的說明。對象才具有具體的數(shù)據(jù),是性質(zhì)的說明。對象才具有具體的數(shù)據(jù), 具體的屬性具體的屬性類的類的操作:操作:是行為的定義是行為的定義32 類是具有相同屬性和操作的一組對象的集合,它為屬類是具有相同屬性
26、和操作的一組對象的集合,它為屬于該類的全部對象提供統(tǒng)一描述,內(nèi)部主要包括:屬于該類的全部對象提供統(tǒng)一描述,內(nèi)部主要包括:屬性和操作兩部分。性和操作兩部分。類與對象的關(guān)系:類與對象的關(guān)系: 對象是由一些屬性和操作構(gòu)成的。對象屬性和操作描對象是由一些屬性和操作構(gòu)成的。對象屬性和操作描 述對象內(nèi)部細(xì)節(jié)。述對象內(nèi)部細(xì)節(jié)。 類的作用是類的作用是定義對象。定義對象。 c+中將對象稱做類的中將對象稱做類的實(shí)例實(shí)例怎樣理解怎樣理解“一個一個類的所有對象具類的所有對象具有相同的屬性有相同的屬性”?是指是指屬性屬性的的個數(shù)個數(shù)、名稱名稱、數(shù)據(jù)類型數(shù)據(jù)類型相同相同,各個對,各個對象的象的屬性值屬性值則可以則可以互不
27、互不相同相同,并且隨著程序的,并且隨著程序的執(zhí)行而變化。執(zhí)行而變化。33 一個對象的屬性和操作是緊密結(jié)合的,對象一個對象的屬性和操作是緊密結(jié)合的,對象的屬性只能由這個對象的操作來存取,對象的屬性只能由這個對象的操作來存取,對象的操作分為內(nèi)部操作和外部操作,內(nèi)部操作的操作分為內(nèi)部操作和外部操作,內(nèi)部操作只提供對象內(nèi)部其他操作使用,不對外提供。只提供對象內(nèi)部其他操作使用,不對外提供。外部操作提供一個消息接口,通過這個接口外部操作提供一個消息接口,通過這個接口接收對象外部的消息并為之提供操作(服接收對象外部的消息并為之提供操作(服務(wù))。務(wù))。三、封裝三、封裝34對象內(nèi)部數(shù)據(jù)的不可訪問性稱為數(shù)據(jù)隱藏,
28、封對象內(nèi)部數(shù)據(jù)的不可訪問性稱為數(shù)據(jù)隱藏,封裝給數(shù)據(jù)提供了與外界聯(lián)系的接口,無論是誰,裝給數(shù)據(jù)提供了與外界聯(lián)系的接口,無論是誰,只有通過這些接口,使用規(guī)范的格式,才能訪只有通過這些接口,使用規(guī)范的格式,才能訪問內(nèi)部數(shù)據(jù)。問內(nèi)部數(shù)據(jù)。封裝就是把對象的屬性和操作結(jié)合成一個獨(dú)立封裝就是把對象的屬性和操作結(jié)合成一個獨(dú)立的系統(tǒng)單位,并盡可能隱藏對象的內(nèi)部細(xì)節(jié)。的系統(tǒng)單位,并盡可能隱藏對象的內(nèi)部細(xì)節(jié)。封裝在類中是通過封裝在類中是通過存取權(quán)限存取權(quán)限(如私有的:(如私有的:private、公有的:、公有的:public)實(shí)現(xiàn)的。實(shí)現(xiàn)的。35繼承是一個類獲得另一個類的特性的機(jī)制。繼承是一個類獲得另一個類的特性的
29、機(jī)制。 繼承支持層次概念繼承支持層次概念四、繼承(第四、繼承(第6章)章)36 不同對象可以調(diào)用同名函數(shù),但可導(dǎo)致完不同對象可以調(diào)用同名函數(shù),但可導(dǎo)致完全不同的行為的現(xiàn)象稱為全不同的行為的現(xiàn)象稱為多態(tài)性多態(tài)性。 例如除法運(yùn)算例如除法運(yùn)算 / 3/2 3.0/2五、多態(tài)性(第五、多態(tài)性(第8章)章)372.52.5使用類和對象使用類和對象 2.5.1使用使用string對象對象 C+標(biāo)準(zhǔn)程序庫提供了標(biāo)準(zhǔn)程序庫提供了string類和類和complex類。本節(jié)類。本節(jié)通過這兩個類了解類和對象的使用。通過這兩個類了解類和對象的使用。3839一、一、stringstring對象的定義對象的定義格式:格式
30、:string 對象名對象名如:如:string str1,str2;二、二、string 對象的初始化對象的初始化 string對象隸屬于對象隸屬于string類,所以必須用類,所以必須用雙引號雙引號括起來的字符串進(jìn)行初始化。括起來的字符串進(jìn)行初始化。401、定義的同時(shí)初始化、定義的同時(shí)初始化格式:格式:string 對象名(初始值)對象名(初始值) string 對象名對象名=初始值初始值正確正確錯誤錯誤hw41422、從鍵盤接收字符串給、從鍵盤接收字符串給string類對象賦值。類對象賦值。格式:格式:getline(cin,對象名對象名,結(jié)束字符結(jié)束字符)第三個參數(shù)是字符串的結(jié)束符,第
31、三個參數(shù)是字符串的結(jié)束符,也就是當(dāng)也就是當(dāng)getline遇到這個結(jié)束遇到這個結(jié)束符時(shí),就不在接受輸入了符時(shí),就不在接受輸入了 。系。系統(tǒng)默認(rèn)為回車符統(tǒng)默認(rèn)為回車符n。如:如:string str;getline(cin,str,n);coutstr對象名對象名如:如:string str;getline(cin,str,n);coutstrstr;coutstrendl; 44三、三、stringstring類常用的幾個方法(成員函數(shù))類常用的幾個方法(成員函數(shù))1、size():求對象的長度。求對象的長度。格式:格式:對象名對象名.成員函數(shù)名成員函數(shù)名例:例:string str=“a bo
32、y”; coutstr.size()endl;則輸出結(jié)果為:則輸出結(jié)果為:545例題:請分析一下程序結(jié)果例題:請分析一下程序結(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;求字符串求字符串長度。同長度。同size函數(shù)函數(shù)462 2、substr():substr():求字符串的字串求字符串的字串格式:格式:substr(int start
33、,int length)功能:從功能:從start位置開始,截取位置開始,截取length個長度的字符串。個長度的字符串。注注:(1)c+規(guī)定字符串的計(jì)數(shù)從規(guī)定字符串的計(jì)數(shù)從0開始。開始。例如:例如:string str=“wish you happy!”;string newstr= str.substr(5,3) ;coutnewstrendl;程序輸出:程序輸出:注注: (2)截取的起始位截取的起始位置必須位于字符串中,置必須位于字符串中,否則出錯。否則出錯。注注: (3)如果截取的長如果截取的長度大于字符串長度,度大于字符串長度,則自動截取到末尾。則自動截取到末尾。473 3、find
34、( ):find( ):字符串檢索字符串檢索格式:格式:find( 要查找的字符串,開始查找的位置要查找的字符串,開始查找的位置)功能:從指定位置開始查找所需的字符串,如果找到了,功能:從指定位置開始查找所需的字符串,如果找到了,則返回字符串在主串中的位置,如果沒有沒到則返回則返回字符串在主串中的位置,如果沒有沒到則返回-1。如果沒有指定開始查找的位置,則系統(tǒng)默認(rèn)為如果沒有指定開始查找的位置,則系統(tǒng)默認(rèn)為0。例如:例如: string s=“how are you? “ int n=s.find( “are” , 0 );則則n的值為:的值為:4“how”“me”0-148例題:以下程序是輸入
35、一個美國格式的日期(月例題:以下程序是輸入一個美國格式的日期(月 日日,年)年),(用字符串來接受日期)。然后轉(zhuǎn)換成(用字符串來接受日期)。然后轉(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、+:將前后兩個:將前后兩個string s1=you,s2=happy; couts1+ +s2endl;注:字符串也可與單個字符常量相加。注:字符串也可與單個字符常量相加。如上例中:如上例中: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對象中對象中string newdate= year+年年+month+月月+day+日日;52四、四
38、、stringstring對象數(shù)組與泛型算法對象數(shù)組與泛型算法 此前在數(shù)組中介紹的泛型算法同樣適合于此前在數(shù)組中介紹的泛型算法同樣適合于string類。類。1、swap():交換兩個交換兩個string對象的屬性。對象的屬性。格式:對象格式:對象1.swap(對象對象2)例如:例如:string s1=“me”,s2=“you”; couts1“,”s2endl; s1.swap(s2); couts1“,”s2endl;s2.swap(s1);另外另外string類還有幾個成員函數(shù)。類還有幾個成員函數(shù)。#include#include #include using namespace std
39、;void main()string s=china;coutsendl;reverse(&s0,&s0+5);coutsendl;size(s);532、begin():指示第一個元素位置():指示第一個元素位置 end():指示最后一個元素():指示最后一個元素之后之后的位置的位置 當(dāng)使用泛型算法時(shí),如果當(dāng)使用泛型算法時(shí),如果begin不等于不等于end,算法首,算法首先作用于先作用于begin所指元素,并將所指元素,并將begin前進(jìn)一個位置,然前進(jìn)一個位置,然后作用于當(dāng)前的后作用于當(dāng)前的begin所指元素,如此繼續(xù)下去,直到所指元素,如此繼續(xù)下去,直到begin等于等于
40、end為止。為止。如有:如有:string s=“china”chinas.begin()s.end()注:使用注:使用string定義的字符串中不用字符定義的字符串中不用字符0作為結(jié)束符,作為結(jié)束符,使用使用char定義的字符串則自動在末尾加入定義的字符串則自動在末尾加入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
41、 );coutsendl;s.begin()s.end()reverse(s.begin (),s.end() );55練習(xí):以下程序是將一個字符串中的字母轉(zhuǎn)換成大寫練習(xí):以下程序是將一個字符串中的字母轉(zhuǎn)換成大寫輸出,其他字符不變。如輸入輸出,其他字符不變。如輸入”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
42、=a) *p=*p-32; coutsendl;/定義一個字符串對象定義一個字符串對象s/定義一個指針用來遍歷字符串中的每一個字符。定義一個指針用來遍歷字符串中的每一個字符。/輸入一個字符串給輸入一個字符串給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 namespac
43、e std;void main()string 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 namespa
44、ce std;void main()string 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
45、);coutendl;59#include #include 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對象的四大基本特性是多
46、態(tài)性、繼承性、_和封裝性。抽象性抽象性BB課程回顧634為了使類中的成員不能被類外的函數(shù)通過成員操作符訪問,則應(yīng)把該成員的訪問權(quán)限定義為_。private5.C+允許在結(jié)構(gòu)中定義函數(shù),這些函數(shù)稱為( )A.靜態(tài)函數(shù) B.構(gòu)造函數(shù) C.析構(gòu)函數(shù) D.成員函數(shù)6.下列哪個不是面向?qū)ο蟮年P(guān)鍵要素( )A.抽象性B.結(jié)構(gòu)性C.封裝性D.多態(tài)性D.B.64真題真題7.C+類的構(gòu)造函數(shù)名與_名稱一樣,且沒有返回值。8.C+類中定義的成員默認(rèn)訪問屬性為( ) A.public B.private C.protected D.friend 類類B9.不同對象調(diào)用同名函數(shù),但導(dǎo)致完全不同行為的現(xiàn)象稱為( ) A
47、.抽象 B.封裝 C.繼承 D.多態(tài)性D6510.類的構(gòu)造函數(shù)在以下什么情況下會被自動調(diào)用( )A.定義成員函數(shù)時(shí) B.定義對象時(shí) C.定義數(shù)據(jù)成員時(shí) D.定義友元函數(shù)時(shí)11.與操作對象的數(shù)據(jù)類型相互獨(dú)立的算法稱為_. 泛型算法泛型算法B6612不同對象可以調(diào)用相同名稱的函數(shù),但可導(dǎo)致完全不同的行為的現(xiàn)象稱為_。多態(tài)性多態(tài)性13在使用string類的find成員函數(shù)來檢索主串中是否含有指定的子串時(shí),若在主串中不含指定的子串,find函數(shù)的返回值是_。-167作業(yè):作業(yè):編寫程序完成字符串的替換功能:具體要求:編寫程序完成字符串的替換功能:具體要求:輸入要查找的字符串和要替換的字符串,然后在給出的輸入要查找的字符串和要替換的字符串,然后在給出的字符串中進(jìn)行字符串的替換。運(yùn)行結(jié)果示例如下:字符串中進(jìn)行字符串的替換。運(yùn)行結(jié)果示例如下:683、string數(shù)組數(shù)組 可以聲明可以聲明string類數(shù)組,但只能對數(shù)組分量使用上述操作,類數(shù)組,但只能對數(shù)組分量使用上述操作,不能對整個數(shù)組使用這些操作。不能對整個數(shù)組使用這些操作。例題例題(lt2_13.cpp):編程將一個字符串?dāng)?shù)組中的元素倒序排放。例如:編程將一個字符串?dāng)?shù)組中的元素倒序排放。例如:string s5=zhang,wa
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024副食品保障供應(yīng)合同
- 農(nóng)產(chǎn)品采購合作協(xié)議書
- 社區(qū)物業(yè)管理服務(wù)合同
- 小額民間借款合同范本
- 建筑行業(yè)材料購銷協(xié)議模板
- 2023年高考地理復(fù)習(xí)精題精練-區(qū)域發(fā)展對交通運(yùn)輸布局的影響(解析版)
- 2024年售房的合同范本
- 建筑工地物資租賃合同書
- 房產(chǎn)抵押擔(dān)保協(xié)議參考
- 2024年勞務(wù)協(xié)議書樣本
- 企業(yè)如何利用新媒體做好宣傳工作課件
- 如何培養(yǎng)孩子的自信心課件
- 中醫(yī)藥膳學(xué)全套課件
- 頸脊髓損傷-匯總課件
- 齒輪故障診斷完美課課件
- 2023年中國鹽業(yè)集團(tuán)有限公司校園招聘筆試題庫及答案解析
- 大班社會《特殊的車輛》課件
- 野生動物保護(hù)知識講座課件
- 早教托育園招商加盟商業(yè)計(jì)劃書
- 光色變奏-色彩基礎(chǔ)知識與應(yīng)用課件-高中美術(shù)人美版(2019)選修繪畫
- 前列腺癌的放化療護(hù)理
評論
0/150
提交評論