自學(xué)考試C++程序設(shè)計(jì)C++筆記(1-5)_第1頁
自學(xué)考試C++程序設(shè)計(jì)C++筆記(1-5)_第2頁
自學(xué)考試C++程序設(shè)計(jì)C++筆記(1-5)_第3頁
自學(xué)考試C++程序設(shè)計(jì)C++筆記(1-5)_第4頁
自學(xué)考試C++程序設(shè)計(jì)C++筆記(1-5)_第5頁
已閱讀5頁,還剩103頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第一章認(rèn)識(shí)C++的對(duì)象§1.1初識(shí)C++的函數(shù)和對(duì)象1、混合型函數(shù)C++以.cpp為文件擴(kuò)展名,有且只有一個(gè)名為main的主函數(shù),因保留了這個(gè)面向過程的主函數(shù),所以被稱為混合型語言。2、注釋方式=1\*GB3①從“/*”開始,到“*/”結(jié)束,如:/*……*/=2\*GB3②從“//”開始到本行結(jié)束,如://……3、輸入輸出對(duì)象=1\*GB3①提取操作:用提取操作符“>>”從cin輸入流中提取字符,如:cin>>a.x;=2\*GB3②插入操作:用插入操作符“<<”向cout輸出流中插入字符,如:cout<<“we”;cout<<endl;=3\*GB3③使用標(biāo)準(zhǔn)輸入(鍵盤輸入)cin及標(biāo)準(zhǔn)輸出(屏幕輸出)cout前,要在主函數(shù)前使用#include<iostream>將C++標(biāo)準(zhǔn)輸入輸出庫頭文件iostream將其包括。=4\*GB3④換行操作:用語句cout<<endl;或cout<<“\n”;實(shí)現(xiàn),其中endl可以插在流的中間。如:cout<<a.x<<endl<<a.y<<endl;4、使用命名空間C++相比C而言,可以省略“.h”標(biāo)識(shí)頭文件,但必須使用語句usingnamespacestd;來讓命名空間中的對(duì)象名稱曝光。因此一般的程序都要具有下面的兩條語句:#include<iostream>//包含頭文件usingnamespacestd;//使用命名空間注意C++庫中代替C庫中頭文件的正確名稱,例如下面兩個(gè)語句效果一樣:=1\*GB3①#include<math.h>=2\*GB3②#include<cmath>usingnamespacestd;5、對(duì)象的定義和初始化定義對(duì)象包括為它命名并賦予它數(shù)據(jù)類型,一般即使初值只用來表示該對(duì)象尚未具有真正意義的值,也應(yīng)將每個(gè)對(duì)象初始化。C++中利用構(gòu)造函數(shù)語法實(shí)現(xiàn)初始化,如:Intz(0);//等同于intz=0;6、函數(shù)原型及其返回值=1\*GB3①C++使用變量和函數(shù)的基本規(guī)則都是:先聲明,后使用。變量有時(shí)也可邊聲明邊使用,但必須聲明,否則出錯(cuò)。比如對(duì)函數(shù)的調(diào)用,要在主函數(shù)之前先對(duì)調(diào)用的函數(shù)進(jìn)行原型聲明,如:intresult(int,int);它向編譯系統(tǒng)聲明,后面有一個(gè)result函數(shù),該函數(shù)有兩個(gè)整型類型的參數(shù),函數(shù)返回整型值。函數(shù)聲明時(shí),除了默認(rèn)參數(shù)(需給出默認(rèn)參數(shù)的默認(rèn)值)和內(nèi)聯(lián)函數(shù)(需給出函數(shù)體及其內(nèi)語句)外,不需給出參數(shù)的變量名稱,如果給出,效果也一樣,如:intresult(inta,intb);和上面的聲明效果一樣。=2\*GB3②除構(gòu)造函數(shù)與析構(gòu)函數(shù)外,函數(shù)都需要有類型聲明。如intmain(),指出main是整數(shù)類型,返回值由return后面的表達(dá)式?jīng)Q定,且表達(dá)式的值必須與聲明函數(shù)的類型一致。如果函數(shù)確實(shí)不需要返回值,還可用void標(biāo)識(shí),一旦使用void標(biāo)識(shí),函數(shù)體內(nèi)就不再需要使用return語句,否則會(huì)編譯出錯(cuò),但可使用return;語句。=3\*GB3③C++函數(shù)有庫函數(shù)(標(biāo)準(zhǔn)函數(shù),引用時(shí)函數(shù)名外加<>)和自定義函數(shù)(引用時(shí)函數(shù)名外加“”)兩類。7、const(常量)修飾符及預(yù)處理程序=1\*GB3①const修飾符:用于定義符號(hào)常量。C中一般使用宏定義“#define”定義常量,而C++中除此外,建議使用const代替宏定義,用關(guān)鍵字const修飾的標(biāo)識(shí)符稱為符號(hào)常量。因const是放在語句定義之前的,因此可以進(jìn)行類型判別,這比用宏定義更安全一些。如下面兩個(gè)語句是等同的,但是后者可以比前者避免一些很難發(fā)現(xiàn)的錯(cuò)誤。#difineBOFSIZE100constintBUFSIZE100;常量定義也可使用構(gòu)造函數(shù)的初始化方法,如:constintk(2);//等同于constintk=2;因被const修飾的變量的值在程序中不能被改變,所以在聲明符號(hào)常量時(shí),必須對(duì)符號(hào)常量進(jìn)行初始化,除非這個(gè)變量是用extern修飾的外部變量,如:constintd;×constintd=2;√externconstintd;√const的用處不僅是在常量表達(dá)式中代替宏定義,如果一個(gè)變量在生存期內(nèi)的值不會(huì)改變,就應(yīng)該用const來修飾這個(gè)變量,以提高程序安全性。=2\*GB3②預(yù)處理程序C++的預(yù)處理程序不是C++編譯程序的一部分,它負(fù)責(zé)在編譯程序的其他部分之前分析處理預(yù)處理語句,為與一般的C++語句區(qū)別,所有預(yù)處理語句都以位于行首的符號(hào)“#”開始,作用是把所有出現(xiàn)的、被定義的名字全部替換成對(duì)應(yīng)的“字符序列”。預(yù)處理語句有三種:宏定義、文件包含(也成嵌入指令)和條件編譯。文件包含是指一個(gè)程序把另一個(gè)指定文件的內(nèi)容包含進(jìn)來,書寫時(shí)可以使用引號(hào)也可以使用尖括號(hào),前者引用自己定義的包含文件,如:#include“E:\prog\myfile.h”,后者引用系統(tǒng)提供的包含文件,如標(biāo)準(zhǔn)輸入輸出是定義在標(biāo)準(zhǔn)庫iostream中的,引用時(shí)要包括以下兩條語句:#include<iostream>//包含頭文件usingnamespacestd;//使用命名空間8、程序運(yùn)行結(jié)果9、程序書寫格式C++的格式和C一樣,都很自由,一行可以寫幾條語句,但也要注意以下規(guī)則,增加可讀性:=1\*GB3①括號(hào)緊跟函數(shù)名后面,但在for和while后面,應(yīng)用一個(gè)空格與左括號(hào)隔開;=2\*GB3②數(shù)學(xué)運(yùn)算符左右各留一個(gè)空格,以與表達(dá)式區(qū)別;=3\*GB3③在表示參數(shù)時(shí),逗號(hào)后面留一個(gè)空格;=4\*GB3④在for、do…while和while語句中,合理使用縮進(jìn)、一對(duì)花括號(hào)和空行;

=5\*GB3⑤適當(dāng)增加空行和程序注釋以增加可讀性;=6\*GB3⑥太長的程序分為兩行或幾行,并注意選取合適的分行和縮進(jìn)位置?!?.2認(rèn)識(shí)C++面向過程編譯的特點(diǎn)一、使用函數(shù)重載C++允許為同一個(gè)函數(shù)定義幾個(gè)版本,從而使一個(gè)函數(shù)名具有多種功能,這稱為函數(shù)重載。假設(shè)有一個(gè)函數(shù)max,分別具有以下函數(shù)原型:intmax(int,int);//2個(gè)整型參數(shù)的函數(shù)原型intmax(int,int,int);//3個(gè)整型參數(shù)的函數(shù)原型只要分別為不同參數(shù)的max編制相應(yīng)的函數(shù)體,就可以實(shí)現(xiàn)各自的功能。二、新的基本數(shù)據(jù)類型及其注意事項(xiàng)1、void是無類型標(biāo)識(shí)符,只能聲明函數(shù)的返回值類型,不能聲明變量。2、C++還比C多了bool(布爾)型。3、C++只限定int和short至少要有16位,而long至少32位,short不得長于int,int不能長于long,VC++6.0規(guī)定int使用4字節(jié),這與C使用2字節(jié)不同。4、地址運(yùn)算符“&”用來取對(duì)象存儲(chǔ)的首地址,對(duì)于數(shù)組,則數(shù)組名就是數(shù)組的首地址。如:intx=56;定義x,VC++6.0使用4個(gè)字節(jié)存儲(chǔ)對(duì)象56,假設(shè)存放的內(nèi)存首地址用十六進(jìn)制表示為006AFDEC,則語句cout<<&x;自動(dòng)使用十六進(jìn)制輸出存儲(chǔ)的首地址006AFDEC。5、C++中的常量分三種,第一種為符號(hào)常量;第二種為整數(shù)常量,有4種類型,分別為十進(jìn)制、長整型、八進(jìn)制、十六進(jìn)制,并用前綴和后綴進(jìn)行分類標(biāo)識(shí);第三種為浮點(diǎn)常量,有三種類型,分別為float型、longfloat型、double型,并用后綴進(jìn)行分類識(shí)別。符號(hào)常量float型:后綴F(f),如3.2f、0.002f、52.48f浮點(diǎn)常量longfloat型:后綴L(l),如0.2L、4.5L、52.48L常量double型:無后綴,如3.0、12.3、0.002長整型:后綴L(l),如-456L、0L、2145857852L整數(shù)常量十進(jìn)制:無后綴,如-32、0、123八進(jìn)制:前綴O(o),如O123、O5、O32737十六進(jìn)制:前綴OX(ox),如0x15,0x1A,0x1f16、C++與C一樣,也使用轉(zhuǎn)義序列。如:’\0’表示ASC=2\*ROMANII碼值為零的空字符(NULL),’\101’表示字符A。三、動(dòng)態(tài)分配內(nèi)存1、在使用指針時(shí),如果不使用對(duì)象地址初始化指針,可以自己給它分配地址。對(duì)于只存儲(chǔ)一個(gè)基本類型數(shù)據(jù)的指針,申請(qǐng)方式如下:new類型名[size]//申請(qǐng)可以存儲(chǔ)size個(gè)該數(shù)據(jù)類型的對(duì)象不再使用時(shí),必須使用delete指針名;來釋放已經(jīng)申請(qǐng)的存儲(chǔ)空間。如:……double*p;//聲明double型指針p=newdouble[3]//分配3個(gè)double型數(shù)據(jù)的存儲(chǔ)空間……deletep;//釋放已申請(qǐng)的存儲(chǔ)空間……2、C必須在可執(zhí)行語句之前集中聲明變量,而C++可以在使用對(duì)象時(shí)再聲明或定義。3、C++為結(jié)構(gòu)動(dòng)態(tài)分配內(nèi)存一般格式為:指針名=new結(jié)構(gòu)名;//分配delete指針名;//釋放例如給書中例1.1的Point結(jié)構(gòu)指針分配內(nèi)存:p=newPoint;當(dāng)不再使用這個(gè)空間時(shí),必須使用deletep;釋放空間。四、引用1、引用簡單的說,就是為現(xiàn)有的對(duì)象起個(gè)別名,別名的地址與引用對(duì)象的地址是一樣的。引用的聲明方式為:數(shù)據(jù)類型&別名=對(duì)象名;,注意對(duì)象在引用前必須先初始化,另外聲明中符號(hào)“&”的位置無關(guān)緊要,比如int&a=x;、int&a=x;和int&a=x;等效。例:……intx=56;//定義并初始化xint&a=x;//聲明a是x的引用,二者地址相同int&r=a;//聲明r是a的引用,二者地址相同……r=25;//改變r(jià),則a和x都同步變化……2、所謂“引用”,就是將一個(gè)新標(biāo)識(shí)符和一塊已經(jīng)存在的存儲(chǔ)區(qū)域相關(guān)聯(lián)。因此,使用引用時(shí)沒有分配新的存儲(chǔ)區(qū)域,它本身不是新的數(shù)據(jù)類型??梢酝ㄟ^修改引用來修改原對(duì)象,但是不能有空引用,在程序中必須確保引用是和一塊正確的存儲(chǔ)區(qū)域關(guān)聯(lián)。引用通常用于函數(shù)的參數(shù)表中或作為函數(shù)的返回值。前者因?yàn)槭褂靡米鳛楹瘮?shù)參數(shù)不產(chǎn)生臨時(shí)對(duì)象,可提高程序執(zhí)行效率和安全性(§4.4.3),后者則是因?yàn)橐米鳛楹瘮?shù)返回值可用于賦值運(yùn)算符的左邊。3、引用實(shí)際上就是變量的別名,使用引用就如同直接使用變量一樣,引用與變量名在使用的形式上完全一樣,引用只是作為一種標(biāo)識(shí)對(duì)象的手段。但要注意,可以聲明指向變量或引用的指針,如:int*p=&x;√int&a=x;int*p=&a;√;也可以聲明指針對(duì)指針的引用,如:int*&p2=p1;√(式中p1、p2是指針,*聲明p2是指針,&聲明p2是p1的引用);但不能聲明指針對(duì)變量的引用,如:int*&P=&x;×;不能聲明引用的引用,如:int&&r=x;×;也不能直接聲明對(duì)數(shù)組的引用。4、引用的作用與指針有相似之處,它會(huì)對(duì)內(nèi)存地址上存在的變量進(jìn)行修改,但它不占用新的地址,從而節(jié)省開銷。二者除使用形式不同,本質(zhì)也不同:指針是低級(jí)的直接操作內(nèi)存地址的機(jī)制,可由整型數(shù)強(qiáng)制類型轉(zhuǎn)換得到,功能強(qiáng)大但易出錯(cuò);引用則是較高級(jí)的封裝了指針的特性,不直接操作內(nèi)存地址,不可由強(qiáng)制類型轉(zhuǎn)換而得,安全性較高。5、雖然不能直接定義對(duì)數(shù)組的引用,但可以通過typedef來間接的建立對(duì)數(shù)組的引用。如:……typedefintarray[10];//定義int型數(shù)組類型array……arraya={12,34,……};//定義array型數(shù)組aarray&b=a;//定義數(shù)組a的引用b……五、對(duì)指針使用const限定符1、變量的指針、指向變量的指針變量、指針變量指向的變量變量的指針就是變量的地址,存放變量地址的變量是指針變量,為了表示指針變量和它所指向的變量之間的聯(lián)系,在程序中用“*”符號(hào)表示“指向”。例如用p代表指針變量,來存放變量a所在的內(nèi)存地址,則*p代表指針變量指向的變量,也就是變量a,且下面等式成立:p=&a*p=*&a=a&*p=&a(*p)++=a++2、左值和右值左值是指某個(gè)對(duì)象的表達(dá)式,必須是可變的。左值表達(dá)式在賦值語句中即可作為左操作數(shù),也可作為右操作數(shù),如:x=56;和y=x;,而右值56就只能作為右操作數(shù),不能作為左操作數(shù)。某些運(yùn)算符如指針運(yùn)算符“*”和取首地址運(yùn)算符“&”也可產(chǎn)生左值,例如p是一個(gè)指針類型的表達(dá)式,則“*p”是左值表達(dá)式,代表由p指向的對(duì)象,且可通過“*p=”改變這個(gè)對(duì)象的值;“&p”也是左值表達(dá)式,代表由p指向的對(duì)象的首地址,且可通過“&p=”改變這個(gè)指針的指向。3、指向常量的指針(constint*p=&x;“*p=”的操作不成立)指向常量的指針是在非常量指針聲明前面使用const,如:constint*p;,它告訴編譯器,*p是常量,不能將*p作為左值進(jìn)行操作,即限定了“*p=”的操作,所以稱為指向常量的指針。如:constinty=58;constint*p1=&y;//指向常量的指針指向常量y,y不能作為左值intx=45;constint*p=&x;//只能通過左值x間接改變*p的值上式中*p不能作為左值,但可以通過“x=”改變x的值,間接改變*p的值,即const僅是限制使用*p的方式,*p仍然可以作為右值使用,還可以通過運(yùn)算符&改變指針?biāo)赶虻牡刂?,但不能改變指針?biāo)赶虻膬?nèi)存地址中的內(nèi)容。4、常量指針(int*constp=&x;“p=”的操作不成立)把const限定符放在*號(hào)的右邊,就可使指針本身成為一個(gè)const,即常量指針。如:intx=5;int*constp=&x;式中的指針本身是常量,編譯器要求給它一個(gè)初始化值,這個(gè)值在指針的整個(gè)生存期中都不會(huì)改變,編譯器把p看作常量地址,所以不能作為左值,即“p=”不成立,也就是說不能改變指針p所指向的地址。但這個(gè)內(nèi)存地址里的內(nèi)容可以使用間接引用運(yùn)算符*改變其值,例如語句*p=56;將上面的x的值改變?yōu)?6。4、指向常量的常量指針也可以聲明指針本身和所指向的對(duì)象都不能改變的“指向常量的常量指針”,這時(shí)必須要初始化指針。如:intx=2;constint*constp=&x;語句告訴編譯器,*p和p都是常量,都不能作為左值,即“*p=”和“p=”兩操作均不成立,這種指針限制“&”和“*”運(yùn)算符,在實(shí)際中很少用。六、泛型算法應(yīng)用于普通數(shù)組1、數(shù)組中元素及位置的關(guān)系如inta[]={5,6,7,8};則數(shù)組中各元素分別為:a[0]=5,a[1]=6,a[2]=7,a[3]=8。a為數(shù)組的起始地址,各元素的位置分別是:a+1位置為5,a+2位置為6,a+3位置為7,a+4位置為8。對(duì)數(shù)組按元素位置進(jìn)行操作時(shí),不包括起始位置,如:語句sort(a+1,a+4);,只對(duì)從a+1位置(不含a+1位置的元素)起到a+4位置(含a+4位置的元素)為止的各元素進(jìn)行操作,即a+2,a+3,a+4三個(gè)位置上的三個(gè)元素,而不是a+1~a+4四個(gè)位置上的所有4個(gè)元素。注意式中的a+1并不是地址a加上一個(gè)字節(jié)后的地址,而是a+1×d得到的地址,其中d是元素類型占用的字節(jié)數(shù),比如C++中整型數(shù)占用4個(gè)字節(jié),則a+1位置上元素的地址就是地址a加上4個(gè)字節(jié)后得到的地址。2、數(shù)組不能作為整體輸出,C++引入STL庫提供的泛型算法,大大簡化數(shù)組操作。所謂泛型算法,就是提供的操作與元素的類型無關(guān)。3、對(duì)數(shù)組內(nèi)容進(jìn)行升冪、輸出、反轉(zhuǎn)和復(fù)制等操作需要包含頭文件<algorithm>;對(duì)數(shù)組內(nèi)容進(jìn)行降冪和檢索等操作需要包含頭文件<functional>。4、假設(shè)一維數(shù)組a和b的長度均為Len,數(shù)據(jù)類型為Type,則對(duì)數(shù)組內(nèi)容的相關(guān)操作和語句如下:=1\*GB3①數(shù)據(jù)內(nèi)容反轉(zhuǎn):reverse(a,a+Len);//數(shù)組元素反轉(zhuǎn)排列=2\*GB3②復(fù)制數(shù)組內(nèi)容:copy(a,a+Len,b);//將數(shù)組a的內(nèi)容原樣復(fù)制到數(shù)組breverse_copy(a,a+Len,b);//逆向復(fù)制數(shù)組a中內(nèi)容到數(shù)組b=3\*GB3③數(shù)組升冪排序:sort(a,a+Len);//默認(rèn)排序方式是升冪=4\*GB3④數(shù)組降冪排序:sort(b,b+Len,greater<Type>());//數(shù)組降冪排序=5\*GB3⑤檢索查找數(shù)組內(nèi)容:find(a,a+Len,value);//查找數(shù)組a中是否存在值為value的元素find函數(shù)返回的是位置指針,一般使用判別語句輸出查找的內(nèi)容,如:Type*x=find(a,a+Len,value);//x是類型為type的指針if(x==a+Len)cout<<“沒有值為value的數(shù)組元素”;elsecout<<“有值為value的數(shù)組元素”;=6\*GB3⑥輸出數(shù)組的內(nèi)容copy(a,a+Len,ostream_iterator<Type>(cout,“字符串”));可將ostream_iterator簡單理解為輸出流操作符,<Type>表示數(shù)組元素的數(shù)據(jù)類型,本語句將數(shù)組內(nèi)容按正向送往屏幕,輸出方式是將每個(gè)元素與“字符串”的內(nèi)容組合在一起連續(xù)輸出。如果使用空格“”或換行符“\n”,可以按格式輸出。也可將數(shù)組內(nèi)容按逆向方式送往屏幕,語句為:reverse_copy(a,a+Len,ostream_iterator<Type>(cout,“字符串”));反轉(zhuǎn):reverse關(guān)復(fù)制:copy,reverse_copy(逆向復(fù)制)鍵排序:sort(默認(rèn)升冪,尾部加greater<Type>()為降冪)字檢索:find輸出:copy(尾部必須加ostream_iterator<Yype>(cout,“字符串”))七、數(shù)據(jù)的簡單輸入輸出格式1、C++提供了兩種格式控制方式,一種是使用iso_base類提供的接口,另一種是使用一種稱為操控符的特殊函數(shù),操控符的特點(diǎn)是可直接包含在輸入和輸出表達(dá)式中,因此更為方便,不帶形式參數(shù)的操控符定義在頭文件<iostream>中,帶形式參數(shù)的操控符定義在頭文件<iomanip>中。在使用操控符時(shí),一是要正確包含它們,二是只有與符號(hào)“<<”或“>>”連接時(shí)才起作用,三是無參數(shù)的操控符函數(shù)不能帶有“()”號(hào)。2、常用操控符及其作用格式含義作用dec設(shè)置轉(zhuǎn)換基數(shù)為十進(jìn)制輸入/輸出oct設(shè)置轉(zhuǎn)換基數(shù)為八進(jìn)制輸入/輸出hex設(shè)置轉(zhuǎn)換技術(shù)為十六進(jìn)制輸入/輸出endl輸出一個(gè)換行符并刷新流輸出Setprecision(n)設(shè)置浮點(diǎn)數(shù)輸出精度n輸出Setw(n)設(shè)置輸出數(shù)據(jù)字段寬度輸出Setfill(’字符’)設(shè)置ch為填充字符輸出Setiosflags(flag)設(shè)置flag指定的標(biāo)志位輸出resetiosflags(flag)清除flag指定的標(biāo)志位輸出上表中操控符使用時(shí),后四個(gè)操控符必須包含頭文件<iomanip>,其中后兩個(gè)操控符的參數(shù)flag是引用C++的類ios_base里定義的枚舉常量,要使用限定符“::”,下面的表中是幾個(gè)常用的ios_base定義的枚舉常量,另外flag可由多個(gè)常量“或”起來使用,如:setiosflags(ios_base::showpoint|ios_base::fixed)。參數(shù)flag常引用的枚舉常量及其含義常量名含義ios_base::left輸出數(shù)據(jù)按輸出域左邊對(duì)齊輸出ios_base::right輸出數(shù)據(jù)按輸出域右邊對(duì)齊輸出ios_base::showpos在正數(shù)前添加一個(gè)“+”號(hào)ios_base::showpoint浮點(diǎn)輸出時(shí)必須帶有一個(gè)小數(shù)點(diǎn)ios_base::scientific使用科學(xué)計(jì)數(shù)法表示浮點(diǎn)數(shù)ios_base::fixed使用定點(diǎn)形式表示浮點(diǎn)數(shù)3、操控符使用實(shí)例=1\*GB3①使用setw設(shè)置輸出寬度#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){cout<<setfill(‘*’)<<setw(0)<<15<<endl<<setw(1)<<15<<endl<<setw(2)<<15<<endl<<setw(3)<<15<<endl<<setw(4)<<15<<endl;cout<<setw(16)<<setfill(‘*’)<<“”<<endl;cout<<setiosflags(ios_base::right)//設(shè)置標(biāo)志位<<setw(5)<<1<<setw(5)<<2<<setw(5)<<3;cout<<resetiosflags(ios_base::right);//清除標(biāo)志位cout<<setiosflags(ios_base::left)<<setw(5)<<1<<setw(5)<<2<<setw(5)<<3<<endl;}程序輸出結(jié)果為:151515*15**15*******************1****2****31****2****3****如上所示,setw(n)只對(duì)在后面緊接著的那個(gè)元素有效;當(dāng)域?qū)抧比后面要顯示元素的位數(shù)少時(shí),則不起作用,即不影響顯示;使用填充字符時(shí),n比后面要顯示元素的位數(shù)大1時(shí),才發(fā)生填充作用;要顯示15個(gè)“*”號(hào),必須取n=16,同時(shí)setfill后面使用“”才能全部填充為設(shè)定字符“*”,否則將全部填充為空格;如果在程序中使用了設(shè)置標(biāo)志,只有在清除設(shè)置標(biāo)志之后,才能進(jìn)行新的設(shè)置。=2\*GB3②使用setprecition設(shè)置浮點(diǎn)數(shù)輸出精度……constdoublePI=3.141592;voidmain(){cout<<setprecition(0)<<PI<<endl<<setprecition(1)<<PI<<endl<<setprecition(2)<<PI<<endl<<setprecition(3)<<PI<<endl<<setprecition(7)<<PI<<endl;……}程序輸出結(jié)果為:3.1415941592注意使用setprecition(intn)設(shè)定顯示小數(shù)位數(shù)時(shí),小數(shù)點(diǎn)本身也占1位,0等于不設(shè),由系統(tǒng)決定(默認(rèn)為最多輸出5位小數(shù)),1代表顯示整數(shù)數(shù)字,2才顯示小數(shù)點(diǎn)后面的一位數(shù)。因系統(tǒng)只輸出5位小數(shù),所以為了將6位小數(shù)全部輸出,最后一行必須設(shè)置7位才行。=3\*GB3③使用dec、oct、hex設(shè)置轉(zhuǎn)換基數(shù)為不同進(jìn)制……intb=100;cout<<”Dec:”<<dec<<b<<endl//十進(jìn)制格式輸出<<”Hex:”<<hex<<b<<endl//十六進(jìn)制格式輸出<<”O(jiān)ct:”<<oct<<b<<endl;//八進(jìn)制格式輸出cout<<b<<endl<<”Inputb=”;cin>>b;//輸入100cout<<b<<endl;cout<<dec<<setiosflags(ios_base::showpos)<<b<<endl;cout<<”Inputb=”;cin>>b;//輸入100cout<<b<<endl;cout<<resetiosflags(ios_base::showpos);cout<<b<<endl;……程序輸出結(jié)果為:Dec:100Hex:164Oct:144144Inputb=100//輸入100144//因尚未轉(zhuǎn)換基數(shù),100仍按八進(jìn)制輸出+100Inputb=100//輸入100+100//已轉(zhuǎn)換基數(shù),將100按十進(jìn)制輸出100//清除flag指定的標(biāo)志位和正數(shù)前顯示的+號(hào)如上面程序,程序執(zhí)行cout<<oct語句后,將保持八進(jìn)制格式輸出,雖然輸入100,但輸出仍按八進(jìn)制,只有使用cout<<dec語句將其恢復(fù)為十進(jìn)制。使用語句cout<<dec<<setiosflags(ios_base::showpos)<<b<<endl;除了將進(jìn)制恢復(fù)為十進(jìn)制,還將輸出設(shè)置為在正的數(shù)字前面顯示“+”號(hào),直到后面的語句使用清除該設(shè)置標(biāo)志的語句cout<<resetiosflags(ios_base::showpos);執(zhí)行,另外如果單獨(dú)使用語句“resetiosflags(ios_base::showpos);”,則不起作用?!?.3程序的編輯、編譯和運(yùn)行的基本概念1、C++程序編制過程=1\*GB3①先使用編輯器編輯一個(gè)C++程序mycpp.cpp,又稱其為C++的源程序;=2\*GB3②然后使用C++編譯器對(duì)這個(gè)C++程序進(jìn)行編譯,產(chǎn)生文件mycpp.obj;=3\*GB3③再使用連接程序(又稱Link),將mycpp.obj變成mycpp.exe文件。2、C++程序編制環(huán)境及使用方法現(xiàn)在C++的編制一般都使用集成環(huán)境,如VisualC++6.0等,所謂集成環(huán)境,就是將C++語言的編輯、編譯、連接和運(yùn)行程序都集成到一個(gè)綜合環(huán)境中。利用VC編制C++程序源文件的步驟如下:=1\*GB3①啟動(dòng)VC6.0;=2\*GB3②File菜單-New對(duì)話框-Project選項(xiàng)卡-Win32ConsoleApplication選項(xiàng),在右邊的Projectname輸入框中輸入項(xiàng)目名稱myfile,在右邊的Location輸入框中輸入存儲(chǔ)目錄,然后單擊OK按鍵,進(jìn)入Win32ConsoleApplication制作向?qū)У牡谝徊?,編輯C++程序文件是選擇Anemptyproject選項(xiàng),單擊Finish按鈕,完成設(shè)置;=3\*GB3③選中FileView選項(xiàng)卡,進(jìn)入空項(xiàng)目,單擊它展開樹形結(jié)構(gòu),選中myfilefiles節(jié)點(diǎn);選中SourceFile標(biāo)記,再從File菜單中選new命令,彈出new對(duì)話框;選中C++SourceFile選項(xiàng),在右方的File輸入框中輸入C++程序文件名(mycpp),系統(tǒng)默認(rèn)的文件擴(kuò)展名為.cpp,單擊OK按鈕,返回集成環(huán)境,并在SourceFile項(xiàng)下面產(chǎn)生空文件mycpp.cpp;在右邊的源代碼編輯框中輸入源文件;=4\*GB3④部分Build菜單項(xiàng)描述菜單項(xiàng)描述Compile編譯源代碼窗口中的活動(dòng)源文件Build查看工程中所有文件,并對(duì)最近修改過的文件進(jìn)行編譯和鏈接RebuildAll對(duì)工程中的所有文件全部進(jìn)行重新編譯和連接Clean刪除項(xiàng)目的中間文件和輸出文件StartDebug彈出級(jí)聯(lián)菜單,主要包括有關(guān)程序調(diào)試的選項(xiàng)Execute運(yùn)行應(yīng)用程序第二章從結(jié)構(gòu)到類的演變§2.1結(jié)構(gòu)的演化一、結(jié)構(gòu)發(fā)生質(zhì)的演變1、函數(shù)與數(shù)據(jù)共存C++中首先允許結(jié)構(gòu)中可以定義函數(shù),這些函數(shù)稱為成員函數(shù),形式如下:struct結(jié)構(gòu)名{數(shù)據(jù)成員成員函數(shù)};可以像C語言中結(jié)構(gòu)變量使用結(jié)構(gòu)成員的方法那樣,通過C++的結(jié)構(gòu)對(duì)象使用成員函數(shù),形式如下:結(jié)構(gòu)對(duì)象.成員函數(shù)2、封裝性如果在定義結(jié)構(gòu)時(shí),將數(shù)據(jù)成員使用private關(guān)鍵字定義,則產(chǎn)生封裝性,沒有使用private定義的成員函數(shù),默認(rèn)為public。要注意,私有的數(shù)據(jù)成員,必須通過公有的成員函數(shù)才能使用,而不能不通過公有的成員函數(shù)直接來使用,否則就會(huì)出錯(cuò),這就稱為數(shù)據(jù)的封裝性。二、使用構(gòu)造函數(shù)初始化結(jié)構(gòu)的對(duì)象函數(shù)名與結(jié)構(gòu)同名,稱為構(gòu)造函數(shù),專門用于初始化結(jié)構(gòu)的對(duì)象,構(gòu)造函數(shù)使用的一般形式為:構(gòu)造函數(shù)名對(duì)象名(初始化參數(shù));程序在運(yùn)行時(shí),會(huì)自動(dòng)完成初始化任務(wù)。§2.2從結(jié)構(gòu)演變一個(gè)簡單的類1、用關(guān)鍵字class代替struct,就是一個(gè)標(biāo)準(zhǔn)的類。實(shí)例:#include<iostream>usingnamespacestd;classPoint{//定義類Pointprivate: doublex,y;//類Point的數(shù)據(jù)成員public: Point(){};//類Point的無參數(shù)構(gòu)造函數(shù) Point(doublea,doubleb){x=a;y=b;}//具有兩個(gè)參數(shù)的構(gòu)造函數(shù) voidSetxy(doublea,doubleb){x=a;y=b;}//成員函數(shù),用于重新設(shè)置數(shù)據(jù)成員 voidDisplay(){cout<<x<<"\t"<<y<<endl;}//成員函數(shù),按指定格式輸出數(shù)據(jù)成員 };voidmain(){ Pointa;//定義類Point的對(duì)象a Pointb(18.5,10.6);//定義類Point的對(duì)象b并初始化 a.Setxy(10.6,18.5);//為對(duì)象a的數(shù)據(jù)成員賦值 a.Display();//顯示對(duì)象a的數(shù)據(jù)成員 b.Display();//顯示對(duì)象b的數(shù)據(jù)成員}類名Point具有的屬性x和y提供的操作構(gòu)造函數(shù)PointSetxy用來給對(duì)象賦值Display用來輸出x和y程序運(yùn)行結(jié)果:10.618.518.510.62、類的示意圖上例中的Point類可以看作直角坐標(biāo)系中的點(diǎn)類,其結(jié)構(gòu)示意圖如右:第一個(gè)方框中是類名;第二個(gè)方框中是坐標(biāo)點(diǎn)的數(shù)據(jù),稱為屬性(或稱數(shù)據(jù)成員);第三個(gè)方框中表示類所提供的具體操作方法,實(shí)際上是如何使用數(shù)據(jù)x和y,以實(shí)現(xiàn)預(yù)定功能的函數(shù),這里稱為成員函數(shù)。§2.3面向過程與面向?qū)ο?、面向過程的方法所謂面向過程,就是不必了解計(jì)算機(jī)的內(nèi)部邏輯,而把精力集中在對(duì)如何求解問題的算法邏輯和過程的描述上,通過編寫程序把解決問題的步驟告訴計(jì)算機(jī)。C語言就是面向過程的結(jié)構(gòu)化程序設(shè)計(jì)語言,其程序設(shè)計(jì)特點(diǎn)就是通過函數(shù)設(shè)計(jì),實(shí)現(xiàn)程序功能的模塊化、結(jié)構(gòu)化。但實(shí)際工作中,盡管結(jié)構(gòu)化程序設(shè)計(jì)中的分而治之的想法非常好,但在結(jié)構(gòu)化程序設(shè)計(jì)語言和結(jié)構(gòu)化程序設(shè)計(jì)方法下卻難以貫徹到底,特別是在軟件規(guī)模在三四萬行以上時(shí),開發(fā)和維護(hù)就十分困難。2、面向?qū)ο蟮姆椒榱私鉀Q面向過程的方法存在的問題,人們提出了面向?qū)ο蟮姆椒?。所謂對(duì)象,就是現(xiàn)實(shí)世界中客觀存在的事務(wù)。相對(duì)于過程,對(duì)象是穩(wěn)定的,復(fù)雜的對(duì)象可由簡單的對(duì)象組成,對(duì)象各自完成特定的功能。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,可以將一組密切相關(guān)的函數(shù)統(tǒng)一封裝在一個(gè)對(duì)象中,從而合理而又有效的避免全局變量的使用,更徹底的實(shí)現(xiàn)了結(jié)構(gòu)化程序設(shè)計(jì)的思想。結(jié)構(gòu)化程序設(shè)計(jì)使用的是功能抽象,而面向?qū)ο蟪绦蛟O(shè)計(jì)不僅能進(jìn)行功能抽象,還能進(jìn)行數(shù)據(jù)抽象,“對(duì)象”實(shí)際上是功能抽象和數(shù)據(jù)抽象的統(tǒng)一。面向?qū)ο蟮某绦蛟O(shè)計(jì)方法不是以函數(shù)過程和數(shù)據(jù)結(jié)構(gòu)為中心,而是以對(duì)象代表來求解問題的中心環(huán)節(jié),追求的是現(xiàn)實(shí)問題空間與軟件系統(tǒng)解空間的近似和直接模擬,從而使人們對(duì)復(fù)雜系統(tǒng)的認(rèn)識(shí)過程與系統(tǒng)的程序設(shè)計(jì)實(shí)現(xiàn)過程盡可能的一致。3、軟件開發(fā)過程及發(fā)展趨勢(shì)軟件開發(fā)者將被開發(fā)的整個(gè)業(yè)務(wù)范圍稱為問題域,軟件開發(fā)是對(duì)給定問題求解的過程,分為兩項(xiàng)主要內(nèi)容:認(rèn)識(shí)和描述。“認(rèn)識(shí)”就是在所要處理的問題域范圍內(nèi),通過人的思維,對(duì)該問題域客觀存在的事務(wù)以及對(duì)所要解決的問題產(chǎn)生正確的認(rèn)識(shí)和理解。“描述”就是用一種語言把人們對(duì)問題域中事務(wù)的認(rèn)識(shí)、對(duì)問題及解決方法的認(rèn)識(shí)描述出來,最終的描述必須使用一種能夠被機(jī)器讀懂的語言,即編程語言。人們習(xí)慣使用的自然語言和計(jì)算機(jī)能夠理解并執(zhí)行的編程語言之間存在很大的差距,稱為“語言的鴻溝”。由于人的認(rèn)識(shí)差距,問題域和自然語言之間也有縫隙,機(jī)器語言和自然語言之間鴻溝最寬,程序設(shè)計(jì)語言的發(fā)展趨勢(shì)則是為了鴻溝變窄?!?.4C++面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)對(duì)象名屬性1屬性2……屬性n操作1操作2……操作n面向?qū)ο蟮某绦蛟O(shè)計(jì)具有抽象、封裝、繼承和多態(tài)性等關(guān)鍵要素。1、對(duì)象C++中的對(duì)象是系統(tǒng)中用來描述客觀事物的一個(gè)實(shí)體,是構(gòu)成系統(tǒng)的一個(gè)基本單位,C++中使用對(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ù),一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的成員函數(shù)構(gòu)成。例:用簡單對(duì)象表示平面上的A(3.5,6.4)和B(8.5,8.9)兩個(gè)坐標(biāo)點(diǎn)??捎萌缦碌膶?duì)象結(jié)構(gòu)圖表示A和B的對(duì)象結(jié)構(gòu):Ax(3.5)y(6.4)Display();Setxy();Move();Bx(8.5)y(8.9)Display();Setxy();Move();2、抽象和類抽象是一種從一般的觀點(diǎn)看待事物的方法,即集中于事物的本質(zhì)特征,而不是具體細(xì)節(jié)或具體實(shí)現(xiàn)。面向?qū)ο蟮姆椒ò殉绦蚩醋魇怯梢唤M抽象的對(duì)象組成的,如果把一組對(duì)象的共同特征進(jìn)一步抽象出來,就形成了“類”的概念。對(duì)于一個(gè)具體的類,它有許多具體的個(gè)體,這些個(gè)體叫做“對(duì)象”,同一類的不同對(duì)象具有相同的行為方式。一個(gè)對(duì)象是由一些屬性和操作構(gòu)成的,對(duì)象的屬性和操作描述了對(duì)象的內(nèi)部細(xì)節(jié),類是具有相同的屬性和操作的一組對(duì)象的集合,它為屬于該類的全部對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和操作兩個(gè)主要部分。類的作用是定義對(duì)象,類和對(duì)象的關(guān)系如同一個(gè)模具和其鑄造出來的鑄造件的關(guān)系,對(duì)象之間就像是同一模具鑄出的零件,模樣相同,鑄造材料可能不同。類給出了屬于該類的全部對(duì)象的抽象定義,而對(duì)象則是符合這種定義的實(shí)體。所謂一個(gè)類的所有對(duì)象具有相同屬性和操作,是指它們的定義形式(即屬性的個(gè)數(shù)、名稱、數(shù)據(jù)類型)相同,而不是說每個(gè)對(duì)象的屬性值都相同。3、封裝為了保護(hù)類的安全,即限制使用類的屬性和操作,需要將類封裝起來。封裝就像用同一個(gè)模具鑄造零件,各零件使用的材料(數(shù)據(jù)成員)和鑄造工藝(成員函數(shù))均不同,每一種材料都有其對(duì)應(yīng)的鑄造工藝,材料與鑄造工藝是成套使用(封裝)的,雖然鑄出零件的模樣一樣,但如果用錯(cuò)了鑄造工藝,就可能出廢品。所謂“封裝”,就是把對(duì)象的屬性和操作結(jié)合成一個(gè)獨(dú)立的系統(tǒng)單位,并盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié)。按照面向?qū)ο蟮姆庋b原則,一個(gè)對(duì)象的屬性和操作是緊密結(jié)合的,對(duì)象的屬性只能由這個(gè)對(duì)象的操作來存取。對(duì)象的操作分為內(nèi)部操作和外部操作,前者只供對(duì)象內(nèi)部的其他操作使用,不對(duì)外提供;后者對(duì)外提供一個(gè)信息接口,通過這個(gè)接口接受對(duì)象外部的消息并為之提供操作(服務(wù))。對(duì)象內(nèi)部數(shù)據(jù)結(jié)構(gòu)的這種不可訪問性稱為信息(數(shù)據(jù))隱藏。數(shù)據(jù)封裝給數(shù)據(jù)提供了與外界聯(lián)訊的標(biāo)準(zhǔn)接口,只有通過這些接口,使用規(guī)范的方式,才能訪問這些數(shù)據(jù),同時(shí)程序員也只需要和接口打交道,而不必了解數(shù)據(jù)的具體細(xì)節(jié)。由此可見,封裝要求一個(gè)對(duì)象應(yīng)具備明確的功能,并具有接口以便和其他對(duì)象相互作用,同時(shí),對(duì)象的內(nèi)部實(shí)現(xiàn)(代碼和數(shù)據(jù))是受保護(hù)的,外界不能訪問它們,這樣封裝一方面使得程序員在設(shè)計(jì)程序時(shí)能專注于自己的對(duì)象,同時(shí)也切斷了不同模塊之間數(shù)據(jù)的非法使用,減少了出錯(cuò)。在類中,封裝是通過存取權(quán)限實(shí)現(xiàn)的,例如每個(gè)類的屬性和操作分為私有和公有兩種類型,對(duì)象的外部職能訪問對(duì)象的公有部分,而不能直接訪問對(duì)象的私有部分。4、繼承繼承是一個(gè)類可以獲得另一個(gè)類的特性的機(jī)制,支持層次概念,通過繼承,低層的類只需定義特定于它的特征,而共享高層的類中的特征。繼承具有重要的實(shí)際意義,它簡化了人們對(duì)事物的認(rèn)識(shí)和描述。繼承就像鑄造中母模與子模的關(guān)系。5、多態(tài)性不同的對(duì)象可以調(diào)用相同名稱的函數(shù),但可導(dǎo)致完全不同的行為的現(xiàn)象稱為多態(tài)性。利用多態(tài)性,程序中只需進(jìn)行一般形式的函數(shù)調(diào)用,函數(shù)的實(shí)現(xiàn)細(xì)節(jié)留給接受函數(shù)調(diào)用的對(duì)象,這大大提高了解決人們復(fù)雜問題的能力。多態(tài)性就像是鑄造時(shí)不同的零件、不同材料所鑄的同一款零件雖然可以使用相同的鑄造工藝,但鑄出的零件用途、使用壽命和使用方法都不一樣。§2.5使用類和對(duì)象1、使用string對(duì)象stringstrstringfindsizesubstr實(shí)際上string類很復(fù)雜,如右的string類的簡化圖中只給出了下例中涉及的屬性和部分操作。由圖,類string的屬性是一個(gè)字符串str,同名函數(shù)string是構(gòu)造函數(shù),用來初始化字符串,另外三個(gè)成員函數(shù)用來對(duì)屬性str進(jìn)行操作,其中find成員函數(shù)用來在str字符串中檢索需要的子串;size成員函數(shù)計(jì)算并輸出str存儲(chǔ)的單詞長度;substr成員函數(shù)用來返回str字符串中的子串。在程序中可以使用string類定義存儲(chǔ)字符串的對(duì)象,這些對(duì)象屬于string類,因此還要使用#include<string>來包含這個(gè)類的頭文件。因?yàn)閟tring需要的是字符串,所以string類的對(duì)象不能用單引號(hào)括起來的單個(gè)字符常量初始化,即:stringstr=’A’;×//同理stringstr(’A’);×但可以使用雙引號(hào)括起來的單個(gè)字符常量初始化,即:stringstr=“A”;√//同理stringstr(“A”);√如果string的對(duì)象str的內(nèi)容為“ab”,則str[0]=’a’,str[1]=’b’。例:使用string對(duì)象及初始化#include<iostream>#include<string>//在程序中包含string類的頭文件usingnamespacestd;voidmain(){ stringstr1("Wearehere!");//用構(gòu)造函數(shù)string定義對(duì)象str1并賦值 stringstr2="Whereareyou?";//用構(gòu)造函數(shù)string定義對(duì)象str2并賦值(或stringstr1("Wearehere!"),stringstr2="Whereareyou?";) cout<<str1[0]<<str1[11]<<","<<str1<<endl; cout<<str2[0]<<str2[13]<<","<<str2<<endl; cout<<"pleaseinputaword:"; cin>>str1;//輸入good cout<<"lenghtofthe"<<str1<<"is"<<str1.size()<<"."<<endl;}程序運(yùn)行結(jié)果為:W!Wearehere!W?Whereareyou?Pleaseinputaword:goodLengthofthegoodis4.程序中使用了兩種方法給string類的兩個(gè)對(duì)象初始化,也可將它們定義在一行中:stringstr1("Wearehere!"),stringstr2="Whereareyou?";string類還提供將兩個(gè)字符串連接起來組成一個(gè)新字符串的能力,用“+”號(hào)將后面的字符串連接到前一個(gè)字符串的后面,也可以與單個(gè)字符常量連接,如:str1=str1+“”+str1;將原來的兩個(gè)str1的內(nèi)容用空格連接起來。2、使用string類的典型成員函數(shù)string對(duì)象是通過調(diào)用成員函數(shù)實(shí)現(xiàn)操作,從而提供對(duì)象的行為或消息傳遞的,對(duì)象調(diào)用成員函數(shù)的語法為:對(duì)象名稱.成員函數(shù)(參數(shù)(可供選擇的消息內(nèi)容))常用的string類成員函數(shù):substr:stringnewstr=str1.substr(3,3);find:inti=str1.find(“are”,0);getline:getline(cin,InputLline,’\n’);swap:str1.swap(str2);=str2.swap(str1);begin和end:copy(str1.begin(),str1.end(),str2.begin());=1\*GB3①成員函數(shù)substr用來返回給定字符串的子串,格式為:對(duì)象名稱.substr(要截取子串的起始位置,截取的長度);如:stringstr1("Wearehere!");語句中要從對(duì)象str1中截取字符串a(chǎn)re,可用下面的語句實(shí)現(xiàn):stringnewstr=str1.substr(3,3);此時(shí)newstr的內(nèi)容為are,括號(hào)中的第一個(gè)3是因?yàn)镃++規(guī)定字符串的計(jì)數(shù)從0開始,所以a處于位置3;第二個(gè)3是因?yàn)閍re是3個(gè)字符,所以截取子串的長度為3。注意給出的要截取子串的起始位置必須位于字符串中,否則出錯(cuò)。如果截取長度大于字符串長度,則是可以的,程序?qū)⒆詣?dòng)截取到字符串末尾,如語句stringstrnew=newstr.substr(2,8);和語句stringstrnew=newstr.substr(2,1);等效,都是截取字符e。=2\*GB3②成員函數(shù)find用來在主串中檢索所需字符串,格式為:對(duì)象名稱.find(要查找的字符串,開始查找的位置);函數(shù)返回查找到的字符串在主串中的位置,如:inti=str1.find(“are”,0);表示從str1字符串的位置0開始查找are出現(xiàn)的位置,結(jié)果為3。如果不給位置參數(shù),默認(rèn)位置參數(shù)為0。=3\*GB3③string類還提供一個(gè)輔助功能,以便使用getline從流cin中讀出輸入的一行給string類的對(duì)象,如:stringInputLine;getline(cin,InputLline,’\n’);cout<<”yourinput:”<<InputLine<<endl;如果輸入“Iamhere!”,則得到如下結(jié)果:yourinput:Iamhere!例:將美國格式的日期轉(zhuǎn)換為國際格式#include<iostream>#include<string>usingnamespacestd;voidmain(){ cout<<"EnterthedateinAmericanformat" <<"(例如:December25,2002):";//注意逗號(hào)后面有一個(gè)空格 stringDate; getline(cin,Date,'\n');//輸入時(shí)間:May28,2002 inti=Date.find("");//i=3 stringMonth=Date.substr(0,i);//截取月份賦值給字符串Month intk=Date.find(",");//k=6 stringDay=Date.substr(i+1,k-i-1);//截取日期賦值給字符串Day stringYear=Date.substr(k+2,4);//截取年份賦值給字符串Year stringNewDate=Day+""+Month+""+Year; cout<<"Originaldate:"<<Date<<endl; cout<<"Converteddate:"<<NewDate<<endl;}程序運(yùn)行實(shí)例:EnterthedateinAmericanformat(例如:December25,2002):May28,2002Originaldate:May28,2002Converteddate:28May20023、使用complex對(duì)象C++標(biāo)準(zhǔn)庫提供complex類定義復(fù)數(shù)對(duì)象,在程序中包含這個(gè)類的頭文件為:#include<complex>復(fù)數(shù)(complexnumber)類需要兩個(gè)初始值:實(shí)部和虛部,complex是一個(gè)模板類,利用構(gòu)造函數(shù)初始化的格式為:comlex<數(shù)據(jù)類型>對(duì)象名(實(shí)部值,虛部值);如:complex<int>num1(2,3);//定義復(fù)數(shù)2+3icomplex<float>num2(2.5,3.6);//定義復(fù)數(shù)2.5+3.6icomplex的real和imag成員函數(shù)用來輸出對(duì)象的實(shí)部和虛部的值,如:cout<<num2.real()<<”,”<<num2.imag()<<endl;4、使用對(duì)象小結(jié)標(biāo)準(zhǔn)庫提供的類都是經(jīng)過抽象,代表了一類對(duì)象,例如string類描述的是字符串特性,具有一個(gè)用來描述對(duì)象靜態(tài)性質(zhì)的字符串,字符串的值可以區(qū)分不同的對(duì)象;通過一系列的操作方法對(duì)這個(gè)字符串進(jìn)行操作,用函數(shù)實(shí)現(xiàn)這些方法,又稱這些函數(shù)為成員函數(shù);數(shù)據(jù)成員(屬性)和成員函數(shù)(方法)代表了字符串一類事物的特征。String類的使用方法一般如下:#include<string>stringstr1;//定義這個(gè)類的一個(gè)對(duì)象str1str1=“thisisastring”;//給str1賦值stringstr2(“thisisastr2”);//定義str2并賦值cout<<str1<<str2.size();可以先定義對(duì)象,然后給它賦值(如上式str1),也可以在定義對(duì)象的同時(shí)初始化對(duì)象(如上式str2),如果要使用對(duì)象的成員函數(shù),則用“.”運(yùn)算符(如最后一句)。同理,復(fù)數(shù)類可以抽象為具有實(shí)部和虛部的數(shù)據(jù)成員,以及能對(duì)復(fù)數(shù)進(jìn)行基本操作的成員函數(shù),與string不同的是,定義復(fù)數(shù)類時(shí)與數(shù)據(jù)成員的類型無關(guān),當(dāng)定義復(fù)數(shù)類的對(duì)象時(shí)才指定實(shí)部和虛部的數(shù)據(jù)類型。注意,類是抽象出一類物質(zhì)的共同特征,模板則是歸納出不同類型事物的共同操作?!?.6string對(duì)象數(shù)組與泛型算法1、第1.2.6節(jié)介紹的泛型算法同樣適合string類,但要注意不要將該節(jié)介紹的find函數(shù)與string本身的find函數(shù)混淆。另外,string類還有一個(gè)swap成員函數(shù),用來交換兩個(gè)對(duì)象的屬性。假設(shè)有兩個(gè)string類的對(duì)象str1和str2,下面兩種調(diào)用方式是等效的:str1.swap(str2);str2.swap(str1);例:演示string對(duì)象#include<iostream>#include<string>#include<algorithm>usingnamespacestd;voidmain(){stringstr1=”wearehere!”,str2=str1;reverse(&str1[0],&str1[0]+12);copy(&str1[0],&str1[0]+12,&str2[0]);cout<<str1<<str2<<endl;reverse_copy(&str2[0],&str2[0]+12,ostream_iterator<char>(cout));}程序運(yùn)行結(jié)果:!ereheraew!ereheraewwearehere!該例中用str1初始化str2,是為了保證在復(fù)制時(shí)str2能有足夠的空間存儲(chǔ)str1,另外要注意ostream_iterator的數(shù)據(jù)類型是char,不是string。2、string類的成員函數(shù)begin和end[begin,end)二者都用來指示元素位置,前者指示第一個(gè)元素,后者指示最后一個(gè)元素后面的字符串結(jié)束位置。如果begin不等于end,算法首先作用于begin所指元素,并將begin前進(jìn)一個(gè)位置,然后作用于當(dāng)前的begin所指元素,如此繼續(xù)前進(jìn),直到begin等于end為止,所以它們是元素存在的半開區(qū)間。[begin,end)在實(shí)例中,例如str2值為“wrrheeeea!”,則reverse(str2.begin()+2,str2.begin()+8);執(zhí)行后str2值為“wreeeehra!”,這是因?yàn)閎egin()+2~begin+8是一個(gè)半開區(qū)間,區(qū)間包含的元素不是7個(gè),而是上面陰影中包含的6個(gè),即處于begin()+8位置的元素a并不被包含在這個(gè)半開區(qū)間中。同理,上例中的&str1[0]~&str1[12]也是這樣的一個(gè)半開區(qū)間,包含的元素是12個(gè)而不是13個(gè)。有了這兩個(gè)成員函數(shù),就可以用它們表示元素存儲(chǔ)區(qū)間,使用string定義的字符串中不用字符’\0’為結(jié)束符,而使用char定義的字符串則自動(dòng)在尾部加入’0’作為結(jié)束符。例:演示string對(duì)象使用成員函數(shù)表示存儲(chǔ)空間#include<iostream>#include<string>#include<algorithm>#include<functional>usingnamespacestd;voidmain(){stringstr1=”wearehere!”,str2(str1);reverse(str1.begin(),str1.end());//str1逆向cout<<str1<<endl;//輸出str1=“!ereheraew”copy(str1.begin(),str1.end(),str2.begin());sort(str1.begin(),str1.end());//按默認(rèn)升冪排序str1cout<<str1<<endl;//輸出str1=“!aeeeehrrw”cout<<str2<<endl;//輸出str2=“!ereheraew”reverse_copy(str1.begin(),str1.end(),str2.begin());cout<<str2<<endl;//輸出str2=“wrrheeeea!”reverse(str2.begin()+2,str2.begin()+8);//此時(shí)str2=“wreeeehra!”copy(str2.begin()+2,str2.begin()+8,ostream_iterator<char>(cout));//輸出“eeeehr”sort(str1.begin(),str1.end(),greater<char>());//str1降冪排列cout<<str1<<endl;//輸出str1=“wrrheeeea!”str1.swap(str2);//互換內(nèi)容cout<<str1<<””<<str2<<endl;//輸出wreeeehra!(str1)wrrheeeea!(str2)cout<<(*find(str1.begin(),str1.end(),’e’)==’e’)<<””(*find(str1.begin(),str1.end(),’e’)==’o’)<<endl;}//輸出10,注意上面的find不是成員函數(shù)find3、雖然可以聲明string類的數(shù)組,但只能對(duì)數(shù)組分量使用這些操作,不能對(duì)整個(gè)數(shù)組使用這些操作,swap成員函數(shù)可以用來交換兩個(gè)數(shù)組分量。例:演示string對(duì)象數(shù)組#include<iostream>#include<string>#include<algorithm>usingnamespacestd;voidmain(){stringstr[]={“wearehere!”,”whereareyou?”,”welcome”};for(inti=0;i<3;i++){copy(str[i].begin(),str[i].end(),ostream_iterator<char>(cout));cout<<endl;}//for循環(huán),換行分別輸出wearehere!Whereareyou?Welcome!str[0].swap(str[2]);//互換,str[0]=“Welcome!”str[2]=“wearehere!”str[0].swap(str[1]);//互換,str[0]=“Whereareyou?”str[1]=“Welcome!”for(i=0,i<3,i++)cout<<str[i]<<endl;//for循環(huán),換行分別輸出Whereareyou?Welcome!Wearehere!}程序輸出結(jié)果為:wearehere!Whereareyou?Welcome!Whereareyou?Welcome!Wearehere!注意除非輸出部分內(nèi)容,否則使用cout<<str[i]的方法更方便。第三章函數(shù)和函數(shù)模板C語言補(bǔ)充資料:一、函數(shù)的參數(shù):函數(shù)的參數(shù)分為形參和實(shí)參兩種。形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用,離開該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用。形參和實(shí)參的功能是做數(shù)據(jù)傳送,發(fā)生函數(shù)調(diào)用時(shí),主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參,從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。二、函數(shù)的形參和實(shí)參具有以下特點(diǎn):1、形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效,函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后,則不能再使用該形參變量。2、實(shí)參可是是常量、變量、表達(dá)式、函數(shù)等,無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須具有確定的值,以便把這些值傳送給形參。因此,應(yīng)預(yù)先用賦值、輸入等辦法使實(shí)參獲得確定值。3、實(shí)參和形參在數(shù)量上、類型上、順序上應(yīng)嚴(yán)格一致,否則會(huì)發(fā)生“類型不匹配”的錯(cuò)誤。4、函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的,即只能把實(shí)參的值傳送給形參,而不能把形參的值反向的傳給實(shí)參,因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實(shí)參中的值不會(huì)變化?!?.1函數(shù)的參數(shù)及其傳遞方式一、C++的函數(shù)參數(shù)傳遞方式C語言函數(shù)參數(shù)的傳遞方式只有傳值一種,又分為傳變量值和傳變量地址值兩種情況,而C++的函數(shù)參數(shù)傳遞方式有兩種:第一種和C語言一樣,是傳值;第二種是傳引用,即傳對(duì)象的地址,所以也稱傳地址方式。注意傳地址值傳遞的是值,是以對(duì)象指針作為參數(shù);而傳地址傳遞的是地址,是以對(duì)象引用作為參數(shù)。所以在設(shè)計(jì)函數(shù)參數(shù)時(shí),可以使用“對(duì)象”、“對(duì)象指針”和“對(duì)象引用”作為參數(shù)。二、對(duì)象作為函數(shù)參數(shù)使用對(duì)象作為函數(shù)參數(shù),是將實(shí)參對(duì)象的值傳遞給形參對(duì)象,傳遞是單向的,形參具有實(shí)參的備份,當(dāng)在函數(shù)中改變形參的值時(shí),改變的是這個(gè)備份中的值,不影響原來實(shí)參的值。例:傳對(duì)象不改變?cè)瓉韺?duì)象數(shù)據(jù)成員值的例子。#include<iostream>#include<string>=1\*GB3①=1\*GB3①voidswap(string,string);//定義函數(shù)swap,使用string類的對(duì)象作為函數(shù)形參voidmain(){stringstr1(“現(xiàn)在”),str2(“過去”);//定義對(duì)象str1和str2=2\*GB3②swap(str1,str2);=2\*GB3②=4\*GB3④cout<<”返回后:str1=”<<str1<<”str2=”=4\*GB3④}voidswap(strings1,strings2)//定義string類的對(duì)象s1和s2作為函數(shù)形參=3\*GB3③=3\*GB3③stringtemp=s1;s1=s2;s2=temp;cout<<”交換為:str1=”<<s1<<”str2=”<<s2<<endl;}程序執(zhí)行步驟:第一步:先執(zhí)行=1\*GB3①所包含的語句;第二步:執(zhí)行=2\*GB3②語句,發(fā)生函數(shù)調(diào)用,主調(diào)函數(shù)swap(str1,str2)將實(shí)參str1和str2的值分別傳遞給被調(diào)函數(shù)swap(s1,s2)的形參s1和s2。第三步:執(zhí)行=3\*GB3③所包含語句,即函數(shù)跳轉(zhuǎn)到被調(diào)函數(shù)的函數(shù)體執(zhí)行,直至被調(diào)函數(shù)結(jié)束。第四步:執(zhí)行=4\*GB3④語句,即函數(shù)調(diào)用結(jié)束,函數(shù)返回發(fā)生調(diào)用語句的下一個(gè)語句繼續(xù)執(zhí)行。程序輸出結(jié)果:交換為:str1=過去str2=現(xiàn)在返回后:str1=現(xiàn)在str2=過去三、對(duì)象指針作為函數(shù)參數(shù)使用指向?qū)ο蟮闹羔樧鳛楹瘮?shù)參數(shù),形參是對(duì)象指針(指針可以指向?qū)ο蟮牡刂罚?,?shí)參可以是對(duì)象的地址值,而不一定非得是指針。雖然參數(shù)傳遞方式仍然是傳值方式,但因?yàn)樾螀鬟f的就是實(shí)參本身,所以當(dāng)在函數(shù)中改變形參的值時(shí),改變的就是原來實(shí)參的值。傳對(duì)象地址值要用到對(duì)象的指針,而對(duì)于數(shù)組,因數(shù)組名就是數(shù)組的指針名,所以數(shù)組也能用傳數(shù)組地址值的方式。例:使用對(duì)象指針作為函數(shù)參數(shù)的例子。#include<iostream>#include<string>=1\*GB3①=1\*GB3①voidswap(string*,string*);//定義函數(shù)swap,使用string類的指針作為函數(shù)形參voidmain(){stringstr1(“現(xiàn)在”),str2(“過去”);//定義對(duì)象str1和str2=2\*GB3②swap(&str1,&str2);//因函數(shù)原型中參數(shù)的類型是指針,所以=2\*GB3②是完全正確的,即在主調(diào)函數(shù)中可將對(duì)象str1和str2的首地址值&str1和&str2作為實(shí)參,并傳遞給形參=4\*GB3④cout<<”返回后:str1=”<<str1<<”str2=”=4\*GB3④}voidswap(string*s1,string*s2)//string類的對(duì)象指針s1和s2作為函數(shù)形參=3\*GB3③=3\*GB3③stringtemp=*s1;*s1=*s2;*s2=temp;cout<<”交換為:str1=”<<*s1<<”str2=”<<*s2<<endl;}因?yàn)椴捎玫氖莻鞯刂分档姆绞?,?shí)參與形參的地址相同,所以改變形參的值的同時(shí)也改變了實(shí)參的值。程序輸出結(jié)果:交換為:str1=過去str2=現(xiàn)在返回后:str1=過去str2=現(xiàn)在在上例中,因?yàn)楹瘮?shù)原型參數(shù)的類型是指針,可以直接指向?qū)ο蟮刂?,即string*s1=&str1;是完全正確的,所以主函數(shù)中,實(shí)參的產(chǎn)生并不是非先要在主程序中產(chǎn)生指針,然后再使用指針作為實(shí)參,而是直接使用&str1和&str2作為了實(shí)參,這是因?yàn)槭褂?str1和&str2標(biāo)識(shí)的是取對(duì)象str1的首地址值,所以可以直接作為實(shí)參。另外在以數(shù)組作為函數(shù)參數(shù)時(shí),因數(shù)組名即是數(shù)組指針名,指向數(shù)組首地址(例如a為數(shù)組名,則a同時(shí)也是數(shù)組指針名,a+1則指向數(shù)組a的第一個(gè)元素),所以也能采用傳地址值的方式,當(dāng)交換后,因形參的改變,實(shí)參也會(huì)同時(shí)改變。例:傳遞數(shù)組名實(shí)例。#include<iostream>usingnamespacestd;voidswap(int[]);voidmain(){inta[]={3,8};swap(a);cout<<”返回后:a=”<<a[0]<<”b=”<<a[1]<<endl;}voidswap(inta[]){inttemp=a[0];a[0]=a[1];a[1]=temp;cout<<”交換為:a=”<<a[0]<<”b=”<<a[1]<<endl;}程序運(yùn)行結(jié)果為:交換為:a=8b=3返回后:a=8b=3四、引用作為函數(shù)參數(shù)使用引用作為函數(shù)參數(shù),函數(shù)調(diào)用時(shí),把實(shí)參對(duì)象的地址傳給形參對(duì)象,使形參對(duì)象的地址取實(shí)參對(duì)象的地址,從而使形參對(duì)象和實(shí)參對(duì)象共享同一個(gè)單元,(也可形象的記為實(shí)參對(duì)象名傳給形參對(duì)象名,形參對(duì)象名成為實(shí)參對(duì)象名的別名)所以改變形參對(duì)象的值就是改變實(shí)參對(duì)象的值。例:使用引用作為函數(shù)參數(shù)的例子。#include<iostream>#include<string>=1\*GB3①=1\*GB3①voidswap(string&,string&);//函數(shù)swap,使用string類的引用對(duì)象作為函數(shù)形參voidmain(){stringstr1(“現(xiàn)在”),str2(“過去”);//定義對(duì)象str1和str2=2\*GB3②swap(str1,str2);//=2\*GB3②=4\*GB3④cout<<”返回后:str1=”<<str1<<”str2=”=4\*GB3④}voidswap(string&s1,string&s2)//string類的引用對(duì)象s1和s2作為函數(shù)形參=3\*GB3③=3\*GB3③stringtemp=s1;s1=s2;s2=temp;cout<<”交換為:str1=”<<s1<<”str2=”<<s2<<endl;}程序輸出結(jié)果:交換為:str1=過去str2=現(xiàn)在返回后:str1=過去str2=現(xiàn)在在程序中調(diào)用函數(shù)swap時(shí),實(shí)參str1和str2分別初始化引用s1和s2,在函數(shù)swap中,s1和s2分別是str1和str2的別名,形參對(duì)象s1和s2和實(shí)參對(duì)象str1和str2共享同一個(gè)單元(系統(tǒng)向形參傳遞的是實(shí)參的地址而不是實(shí)參的值),對(duì)s1和s2的訪問就是對(duì)str1和str2的訪問,所以函數(shù)swap改變了main函數(shù)中變量str1和str2的值。因?yàn)橐脤?duì)象不是一個(gè)獨(dú)立的對(duì)象,不單獨(dú)占用內(nèi)存單元,而對(duì)象指針要另外開辟內(nèi)存單元(其內(nèi)容是所指向?qū)ο蟮牡刂罚詡饕靡葌髦羔樃?。但要注意,雖然系統(tǒng)向形參傳遞的是實(shí)參的地址而不是實(shí)參的值,但實(shí)參必須使用對(duì)象名,例如:“swap(str1,str2);”正確,而“swap(&str1,&str2);”錯(cuò)誤。五、可以通過間接引用的方法使用數(shù)組,如下例:#include<iostream>usingnamespacestd;typedefdoublearray[12];//自定義數(shù)組標(biāo)識(shí)符arrayvoidavecount(array&b,intn)//定義函數(shù)avecount,其形參一個(gè)使用引用,{一個(gè)使用對(duì)象For(表達(dá)式1;表達(dá)式2;表達(dá)式3){語句1;For(表達(dá)式1;表達(dá)式2;表達(dá)式3){語句1;語句2;}語句3;語句4;上面for循環(huán)的執(zhí)行步驟為:1、執(zhí)行表達(dá)式1;2、執(zhí)行語句1、2,并返回到表達(dá)式2;3、如表達(dá)式2值為真,執(zhí)行表達(dá)式3,然后執(zhí)行語句1、2,并返回到表達(dá)式2,直到表達(dá)式2值為假;4、執(zhí)行語句3、4intcount(0);//累加器初始化0for(intj=0;j<n-2;j++){ave=ave+b[j];if(b[j]<60)count++;}b[n-2]=ave/(n-2);//平均成績b[n-1]=count;//不及格人數(shù)}voidmain(){arrayb={12,34,56,78,90,98,76,85,64,43};array&a=b;avecount(a,12);ccout<<”平均成績?yōu)椤?lt;<a[10]<<”分,不及格人數(shù)為”<<int(a[11])<<”人?!?lt;<endl;}程序輸出結(jié)果:平均成績?yōu)?3.6分,不及格人數(shù)為4人。六、默認(rèn)參數(shù)默認(rèn)參數(shù)就是不要求程序員設(shè)定該參數(shù),而由編譯器在需要時(shí)給該參數(shù)賦默認(rèn)值。當(dāng)程序員需要傳遞特殊值時(shí),必須顯式的指明。默認(rèn)參數(shù)必須在函數(shù)原型中說明,默認(rèn)參數(shù)可以多于1個(gè),但必須放在參數(shù)序列的后部。例如:intSaveName(char*first,char*second=””,char*third=””,char*fourth=””);表明在實(shí)際調(diào)用函數(shù)SaveName時(shí),如不給出參數(shù)second、third和fourth,則取默認(rèn)值“”。另外,如果某個(gè)默認(rèn)參數(shù)需要指明一個(gè)特定值,則在此之前的所有參數(shù)都必須賦值,如上例中,如果需要給出參數(shù)th

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論