版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第一章認識C++的對象§1.1初識C++的函數(shù)和對象1、混合型函數(shù)C++以.cpp為文件擴展名,有且只有一個名為main的主函數(shù),因保留了這個面向過程的主函數(shù),所以被稱為混合型語言。2、注釋方式=1\*GB3①從“/*”開始,到“*/”結束,如:/*……*/=2\*GB3②從“//”開始到本行結束,如://……3、輸入輸出對象=1\*GB3①提取操作:用提取操作符“>>”從cin輸入流中提取字符,如:cin>>a.x;=2\*GB3②插入操作:用插入操作符“<<”向cout輸出流中插入字符,如:cout<<“we”;cout<<endl;=3\*GB3③使用標準輸入(鍵盤輸入)cin及標準輸出(屏幕輸出)cout前,要在主函數(shù)前使用#include<iostream>將C++標準輸入輸出庫頭文件iostream將其包括。=4\*GB3④換行操作:用語句cout<<endl;或cout<<“\n”;實現(xiàn),其中endl可以插在流的中間。如:cout<<a.x<<endl<<a.y<<endl;4、使用命名空間C++相比C而言,可以省略“.h”標識頭文件,但必須使用語句usingnamespacestd;來讓命名空間中的對象名稱曝光。因此一般的程序都要具有下面的兩條語句:#include<iostream>//包含頭文件usingnamespacestd;//使用命名空間注意C++庫中代替C庫中頭文件的正確名稱,例如下面兩個語句效果一樣:=1\*GB3①#include<math.h>=2\*GB3②#include<cmath>usingnamespacestd;5、對象的定義和初始化定義對象包括為它命名并賦予它數(shù)據(jù)類型,一般即使初值只用來表示該對象尚未具有真正意義的值,也應將每個對象初始化。C++中利用構造函數(shù)語法實現(xiàn)初始化,如:Intz(0);//等同于intz=0;6、函數(shù)原型及其返回值=1\*GB3①C++使用變量和函數(shù)的基本規(guī)則都是:先聲明,后使用。變量有時也可邊聲明邊使用,但必須聲明,否則出錯。比如對函數(shù)的調(diào)用,要在主函數(shù)之前先對調(diào)用的函數(shù)進行原型聲明,如:intresult(int,int);它向編譯系統(tǒng)聲明,后面有一個result函數(shù),該函數(shù)有兩個整型類型的參數(shù),函數(shù)返回整型值。函數(shù)聲明時,除了默認參數(shù)(需給出默認參數(shù)的默認值)和內(nèi)聯(lián)函數(shù)(需給出函數(shù)體及其內(nèi)語句)外,不需給出參數(shù)的變量名稱,如果給出,效果也一樣,如:intresult(inta,intb);和上面的聲明效果一樣。=2\*GB3②除構造函數(shù)與析構函數(shù)外,函數(shù)都需要有類型聲明。如intmain(),指出main是整數(shù)類型,返回值由return后面的表達式?jīng)Q定,且表達式的值必須與聲明函數(shù)的類型一致。如果函數(shù)確實不需要返回值,還可用void標識,一旦使用void標識,函數(shù)體內(nèi)就不再需要使用return語句,否則會編譯出錯,但可使用return;語句。=3\*GB3③C++函數(shù)有庫函數(shù)(標準函數(shù),引用時函數(shù)名外加<>)和自定義函數(shù)(引用時函數(shù)名外加“”)兩類。7、const(常量)修飾符及預處理程序=1\*GB3①const修飾符:用于定義符號常量。C中一般使用宏定義“#define”定義常量,而C++中除此外,建議使用const代替宏定義,用關鍵字const修飾的標識符稱為符號常量。因const是放在語句定義之前的,因此可以進行類型判別,這比用宏定義更安全一些。如下面兩個語句是等同的,但是后者可以比前者避免一些很難發(fā)現(xiàn)的錯誤。#difineBOFSIZE100constintBUFSIZE100;常量定義也可使用構造函數(shù)的初始化方法,如:constintk(2);//等同于constintk=2;因被const修飾的變量的值在程序中不能被改變,所以在聲明符號常量時,必須對符號常量進行初始化,除非這個變量是用extern修飾的外部變量,如:constintd;×constintd=2;√externconstintd;√const的用處不僅是在常量表達式中代替宏定義,如果一個變量在生存期內(nèi)的值不會改變,就應該用const來修飾這個變量,以提高程序安全性。=2\*GB3②預處理程序C++的預處理程序不是C++編譯程序的一部分,它負責在編譯程序的其他部分之前分析處理預處理語句,為與一般的C++語句區(qū)別,所有預處理語句都以位于行首的符號“#”開始,作用是把所有出現(xiàn)的、被定義的名字全部替換成對應的“字符序列”。預處理語句有三種:宏定義、文件包含(也成嵌入指令)和條件編譯。文件包含是指一個程序把另一個指定文件的內(nèi)容包含進來,書寫時可以使用引號也可以使用尖括號,前者引用自己定義的包含文件,如:#include“E:\prog\myfile.h”,后者引用系統(tǒng)提供的包含文件,如標準輸入輸出是定義在標準庫iostream中的,引用時要包括以下兩條語句:#include<iostream>//包含頭文件usingnamespacestd;//使用命名空間8、程序運行結果9、程序書寫格式C++的格式和C一樣,都很自由,一行可以寫幾條語句,但也要注意以下規(guī)則,增加可讀性:=1\*GB3①括號緊跟函數(shù)名后面,但在for和while后面,應用一個空格與左括號隔開;=2\*GB3②數(shù)學運算符左右各留一個空格,以與表達式區(qū)別;=3\*GB3③在表示參數(shù)時,逗號后面留一個空格;=4\*GB3④在for、do…while和while語句中,合理使用縮進、一對花括號和空行;
=5\*GB3⑤適當增加空行和程序注釋以增加可讀性;=6\*GB3⑥太長的程序分為兩行或幾行,并注意選取合適的分行和縮進位置。§1.2認識C++面向過程編譯的特點一、使用函數(shù)重載C++允許為同一個函數(shù)定義幾個版本,從而使一個函數(shù)名具有多種功能,這稱為函數(shù)重載。假設有一個函數(shù)max,分別具有以下函數(shù)原型:intmax(int,int);//2個整型參數(shù)的函數(shù)原型intmax(int,int,int);//3個整型參數(shù)的函數(shù)原型只要分別為不同參數(shù)的max編制相應的函數(shù)體,就可以實現(xiàn)各自的功能。二、新的基本數(shù)據(jù)類型及其注意事項1、void是無類型標識符,只能聲明函數(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、地址運算符“&”用來取對象存儲的首地址,對于數(shù)組,則數(shù)組名就是數(shù)組的首地址。如:intx=56;定義x,VC++6.0使用4個字節(jié)存儲對象56,假設存放的內(nèi)存首地址用十六進制表示為006AFDEC,則語句cout<<&x;自動使用十六進制輸出存儲的首地址006AFDEC。5、C++中的常量分三種,第一種為符號常量;第二種為整數(shù)常量,有4種類型,分別為十進制、長整型、八進制、十六進制,并用前綴和后綴進行分類標識;第三種為浮點常量,有三種類型,分別為float型、longfloat型、double型,并用后綴進行分類識別。符號常量float型:后綴F(f),如3.2f、0.002f、52.48f浮點常量longfloat型:后綴L(l),如0.2L、4.5L、52.48L常量double型:無后綴,如3.0、12.3、0.002長整型:后綴L(l),如-456L、0L、2145857852L整數(shù)常量十進制:無后綴,如-32、0、123八進制:前綴O(o),如O123、O5、O32737十六進制:前綴OX(ox),如0x15,0x1A,0x1f16、C++與C一樣,也使用轉義序列。如:’\0’表示ASC=2\*ROMANII碼值為零的空字符(NULL),’\101’表示字符A。三、動態(tài)分配內(nèi)存1、在使用指針時,如果不使用對象地址初始化指針,可以自己給它分配地址。對于只存儲一個基本類型數(shù)據(jù)的指針,申請方式如下:new類型名[size]//申請可以存儲size個該數(shù)據(jù)類型的對象不再使用時,必須使用delete指針名;來釋放已經(jīng)申請的存儲空間。如:……double*p;//聲明double型指針p=newdouble[3]//分配3個double型數(shù)據(jù)的存儲空間……deletep;//釋放已申請的存儲空間……2、C必須在可執(zhí)行語句之前集中聲明變量,而C++可以在使用對象時再聲明或定義。3、C++為結構動態(tài)分配內(nèi)存一般格式為:指針名=new結構名;//分配delete指針名;//釋放例如給書中例1.1的Point結構指針分配內(nèi)存:p=newPoint;當不再使用這個空間時,必須使用deletep;釋放空間。四、引用1、引用簡單的說,就是為現(xiàn)有的對象起個別名,別名的地址與引用對象的地址是一樣的。引用的聲明方式為:數(shù)據(jù)類型&別名=對象名;,注意對象在引用前必須先初始化,另外聲明中符號“&”的位置無關緊要,比如int&a=x;、int&a=x;和int&a=x;等效。例:……intx=56;//定義并初始化xint&a=x;//聲明a是x的引用,二者地址相同int&r=a;//聲明r是a的引用,二者地址相同……r=25;//改變r,則a和x都同步變化……2、所謂“引用”,就是將一個新標識符和一塊已經(jīng)存在的存儲區(qū)域相關聯(lián)。因此,使用引用時沒有分配新的存儲區(qū)域,它本身不是新的數(shù)據(jù)類型。可以通過修改引用來修改原對象,但是不能有空引用,在程序中必須確保引用是和一塊正確的存儲區(qū)域關聯(lián)。引用通常用于函數(shù)的參數(shù)表中或作為函數(shù)的返回值。前者因為使用引用作為函數(shù)參數(shù)不產(chǎn)生臨時對象,可提高程序執(zhí)行效率和安全性(§4.4.3),后者則是因為引用作為函數(shù)返回值可用于賦值運算符的左邊。3、引用實際上就是變量的別名,使用引用就如同直接使用變量一樣,引用與變量名在使用的形式上完全一樣,引用只是作為一種標識對象的手段。但要注意,可以聲明指向變量或引用的指針,如:int*p=&x;√int&a=x;int*p=&a;√;也可以聲明指針對指針的引用,如:int*&p2=p1;√(式中p1、p2是指針,*聲明p2是指針,&聲明p2是p1的引用);但不能聲明指針對變量的引用,如:int*&P=&x;×;不能聲明引用的引用,如:int&&r=x;×;也不能直接聲明對數(shù)組的引用。4、引用的作用與指針有相似之處,它會對內(nèi)存地址上存在的變量進行修改,但它不占用新的地址,從而節(jié)省開銷。二者除使用形式不同,本質(zhì)也不同:指針是低級的直接操作內(nèi)存地址的機制,可由整型數(shù)強制類型轉換得到,功能強大但易出錯;引用則是較高級的封裝了指針的特性,不直接操作內(nèi)存地址,不可由強制類型轉換而得,安全性較高。5、雖然不能直接定義對數(shù)組的引用,但可以通過typedef來間接的建立對數(shù)組的引用。如:……typedefintarray[10];//定義int型數(shù)組類型array……arraya={12,34,……};//定義array型數(shù)組aarray&b=a;//定義數(shù)組a的引用b……五、對指針使用const限定符1、變量的指針、指向變量的指針變量、指針變量指向的變量變量的指針就是變量的地址,存放變量地址的變量是指針變量,為了表示指針變量和它所指向的變量之間的聯(lián)系,在程序中用“*”符號表示“指向”。例如用p代表指針變量,來存放變量a所在的內(nèi)存地址,則*p代表指針變量指向的變量,也就是變量a,且下面等式成立:p=&a*p=*&a=a&*p=&a(*p)++=a++2、左值和右值左值是指某個對象的表達式,必須是可變的。左值表達式在賦值語句中即可作為左操作數(shù),也可作為右操作數(shù),如:x=56;和y=x;,而右值56就只能作為右操作數(shù),不能作為左操作數(shù)。某些運算符如指針運算符“*”和取首地址運算符“&”也可產(chǎn)生左值,例如p是一個指針類型的表達式,則“*p”是左值表達式,代表由p指向的對象,且可通過“*p=”改變這個對象的值;“&p”也是左值表達式,代表由p指向的對象的首地址,且可通過“&p=”改變這個指針的指向。3、指向常量的指針(constint*p=&x;“*p=”的操作不成立)指向常量的指針是在非常量指針聲明前面使用const,如:constint*p;,它告訴編譯器,*p是常量,不能將*p作為左值進行操作,即限定了“*p=”的操作,所以稱為指向常量的指針。如:constinty=58;constint*p1=&y;//指向常量的指針指向常量y,y不能作為左值intx=45;constint*p=&x;//只能通過左值x間接改變*p的值上式中*p不能作為左值,但可以通過“x=”改變x的值,間接改變*p的值,即const僅是限制使用*p的方式,*p仍然可以作為右值使用,還可以通過運算符&改變指針所指向的地址,但不能改變指針所指向的內(nèi)存地址中的內(nèi)容。4、常量指針(int*constp=&x;“p=”的操作不成立)把const限定符放在*號的右邊,就可使指針本身成為一個const,即常量指針。如:intx=5;int*constp=&x;式中的指針本身是常量,編譯器要求給它一個初始化值,這個值在指針的整個生存期中都不會改變,編譯器把p看作常量地址,所以不能作為左值,即“p=”不成立,也就是說不能改變指針p所指向的地址。但這個內(nèi)存地址里的內(nèi)容可以使用間接引用運算符*改變其值,例如語句*p=56;將上面的x的值改變?yōu)?6。4、指向常量的常量指針也可以聲明指針本身和所指向的對象都不能改變的“指向常量的常量指針”,這時必須要初始化指針。如:intx=2;constint*constp=&x;語句告訴編譯器,*p和p都是常量,都不能作為左值,即“*p=”和“p=”兩操作均不成立,這種指針限制“&”和“*”運算符,在實際中很少用。六、泛型算法應用于普通數(shù)組1、數(shù)組中元素及位置的關系如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。對數(shù)組按元素位置進行操作時,不包括起始位置,如:語句sort(a+1,a+4);,只對從a+1位置(不含a+1位置的元素)起到a+4位置(含a+4位置的元素)為止的各元素進行操作,即a+2,a+3,a+4三個位置上的三個元素,而不是a+1~a+4四個位置上的所有4個元素。注意式中的a+1并不是地址a加上一個字節(jié)后的地址,而是a+1×d得到的地址,其中d是元素類型占用的字節(jié)數(shù),比如C++中整型數(shù)占用4個字節(jié),則a+1位置上元素的地址就是地址a加上4個字節(jié)后得到的地址。2、數(shù)組不能作為整體輸出,C++引入STL庫提供的泛型算法,大大簡化數(shù)組操作。所謂泛型算法,就是提供的操作與元素的類型無關。3、對數(shù)組內(nèi)容進行升冪、輸出、反轉和復制等操作需要包含頭文件<algorithm>;對數(shù)組內(nèi)容進行降冪和檢索等操作需要包含頭文件<functional>。4、假設一維數(shù)組a和b的長度均為Len,數(shù)據(jù)類型為Type,則對數(shù)組內(nèi)容的相關操作和語句如下:=1\*GB3①數(shù)據(jù)內(nèi)容反轉:reverse(a,a+Len);//數(shù)組元素反轉排列=2\*GB3②復制數(shù)組內(nèi)容:copy(a,a+Len,b);//將數(shù)組a的內(nèi)容原樣復制到數(shù)組breverse_copy(a,a+Len,b);//逆向復制數(shù)組a中內(nèi)容到數(shù)組b=3\*GB3③數(shù)組升冪排序:sort(a,a+Len);//默認排序方式是升冪=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)容按正向送往屏幕,輸出方式是將每個元素與“字符串”的內(nèi)容組合在一起連續(xù)輸出。如果使用空格“”或換行符“\n”,可以按格式輸出。也可將數(shù)組內(nèi)容按逆向方式送往屏幕,語句為:reverse_copy(a,a+Len,ostream_iterator<Type>(cout,“字符串”));反轉:reverse關復制:copy,reverse_copy(逆向復制)鍵排序:sort(默認升冪,尾部加greater<Type>()為降冪)字檢索:find輸出:copy(尾部必須加ostream_iterator<Yype>(cout,“字符串”))七、數(shù)據(jù)的簡單輸入輸出格式1、C++提供了兩種格式控制方式,一種是使用iso_base類提供的接口,另一種是使用一種稱為操控符的特殊函數(shù),操控符的特點是可直接包含在輸入和輸出表達式中,因此更為方便,不帶形式參數(shù)的操控符定義在頭文件<iostream>中,帶形式參數(shù)的操控符定義在頭文件<iomanip>中。在使用操控符時,一是要正確包含它們,二是只有與符號“<<”或“>>”連接時才起作用,三是無參數(shù)的操控符函數(shù)不能帶有“()”號。2、常用操控符及其作用格式含義作用dec設置轉換基數(shù)為十進制輸入/輸出oct設置轉換基數(shù)為八進制輸入/輸出hex設置轉換技術為十六進制輸入/輸出endl輸出一個換行符并刷新流輸出Setprecision(n)設置浮點數(shù)輸出精度n輸出Setw(n)設置輸出數(shù)據(jù)字段寬度輸出Setfill(’字符’)設置ch為填充字符輸出Setiosflags(flag)設置flag指定的標志位輸出resetiosflags(flag)清除flag指定的標志位輸出上表中操控符使用時,后四個操控符必須包含頭文件<iomanip>,其中后兩個操控符的參數(shù)flag是引用C++的類ios_base里定義的枚舉常量,要使用限定符“::”,下面的表中是幾個常用的ios_base定義的枚舉常量,另外flag可由多個常量“或”起來使用,如:setiosflags(ios_base::showpoint|ios_base::fixed)。參數(shù)flag常引用的枚舉常量及其含義常量名含義ios_base::left輸出數(shù)據(jù)按輸出域左邊對齊輸出ios_base::right輸出數(shù)據(jù)按輸出域右邊對齊輸出ios_base::showpos在正數(shù)前添加一個“+”號ios_base::showpoint浮點輸出時必須帶有一個小數(shù)點ios_base::scientific使用科學計數(shù)法表示浮點數(shù)ios_base::fixed使用定點形式表示浮點數(shù)3、操控符使用實例=1\*GB3①使用setw設置輸出寬度#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)//設置標志位<<setw(5)<<1<<setw(5)<<2<<setw(5)<<3;cout<<resetiosflags(ios_base::right);//清除標志位cout<<setiosflags(ios_base::left)<<setw(5)<<1<<setw(5)<<2<<setw(5)<<3<<endl;}程序輸出結果為:151515*15**15*******************1****2****31****2****3****如上所示,setw(n)只對在后面緊接著的那個元素有效;當域?qū)抧比后面要顯示元素的位數(shù)少時,則不起作用,即不影響顯示;使用填充字符時,n比后面要顯示元素的位數(shù)大1時,才發(fā)生填充作用;要顯示15個“*”號,必須取n=16,同時setfill后面使用“”才能全部填充為設定字符“*”,否則將全部填充為空格;如果在程序中使用了設置標志,只有在清除設置標志之后,才能進行新的設置。=2\*GB3②使用setprecition設置浮點數(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;……}程序輸出結果為:3.1415941592注意使用setprecition(intn)設定顯示小數(shù)位數(shù)時,小數(shù)點本身也占1位,0等于不設,由系統(tǒng)決定(默認為最多輸出5位小數(shù)),1代表顯示整數(shù)數(shù)字,2才顯示小數(shù)點后面的一位數(shù)。因系統(tǒng)只輸出5位小數(shù),所以為了將6位小數(shù)全部輸出,最后一行必須設置7位才行。=3\*GB3③使用dec、oct、hex設置轉換基數(shù)為不同進制……intb=100;cout<<”Dec:”<<dec<<b<<endl//十進制格式輸出<<”Hex:”<<hex<<b<<endl//十六進制格式輸出<<”O(jiān)ct:”<<oct<<b<<endl;//八進制格式輸出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;……程序輸出結果為:Dec:100Hex:164Oct:144144Inputb=100//輸入100144//因尚未轉換基數(shù),100仍按八進制輸出+100Inputb=100//輸入100+100//已轉換基數(shù),將100按十進制輸出100//清除flag指定的標志位和正數(shù)前顯示的+號如上面程序,程序執(zhí)行cout<<oct語句后,將保持八進制格式輸出,雖然輸入100,但輸出仍按八進制,只有使用cout<<dec語句將其恢復為十進制。使用語句cout<<dec<<setiosflags(ios_base::showpos)<<b<<endl;除了將進制恢復為十進制,還將輸出設置為在正的數(shù)字前面顯示“+”號,直到后面的語句使用清除該設置標志的語句cout<<resetiosflags(ios_base::showpos);執(zhí)行,另外如果單獨使用語句“resetiosflags(ios_base::showpos);”,則不起作用?!?.3程序的編輯、編譯和運行的基本概念1、C++程序編制過程=1\*GB3①先使用編輯器編輯一個C++程序mycpp.cpp,又稱其為C++的源程序;=2\*GB3②然后使用C++編譯器對這個C++程序進行編譯,產(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++語言的編輯、編譯、連接和運行程序都集成到一個綜合環(huán)境中。利用VC編制C++程序源文件的步驟如下:=1\*GB3①啟動VC6.0;=2\*GB3②File菜單-New對話框-Project選項卡-Win32ConsoleApplication選項,在右邊的Projectname輸入框中輸入項目名稱myfile,在右邊的Location輸入框中輸入存儲目錄,然后單擊OK按鍵,進入Win32ConsoleApplication制作向?qū)У牡谝徊?,編輯C++程序文件是選擇Anemptyproject選項,單擊Finish按鈕,完成設置;=3\*GB3③選中FileView選項卡,進入空項目,單擊它展開樹形結構,選中myfilefiles節(jié)點;選中SourceFile標記,再從File菜單中選new命令,彈出new對話框;選中C++SourceFile選項,在右方的File輸入框中輸入C++程序文件名(mycpp),系統(tǒng)默認的文件擴展名為.cpp,單擊OK按鈕,返回集成環(huán)境,并在SourceFile項下面產(chǎn)生空文件mycpp.cpp;在右邊的源代碼編輯框中輸入源文件;=4\*GB3④部分Build菜單項描述菜單項描述Compile編譯源代碼窗口中的活動源文件Build查看工程中所有文件,并對最近修改過的文件進行編譯和鏈接RebuildAll對工程中的所有文件全部進行重新編譯和連接Clean刪除項目的中間文件和輸出文件StartDebug彈出級聯(lián)菜單,主要包括有關程序調(diào)試的選項Execute運行應用程序第二章從結構到類的演變§2.1結構的演化一、結構發(fā)生質(zhì)的演變1、函數(shù)與數(shù)據(jù)共存C++中首先允許結構中可以定義函數(shù),這些函數(shù)稱為成員函數(shù),形式如下:struct結構名{數(shù)據(jù)成員成員函數(shù)};可以像C語言中結構變量使用結構成員的方法那樣,通過C++的結構對象使用成員函數(shù),形式如下:結構對象.成員函數(shù)2、封裝性如果在定義結構時,將數(shù)據(jù)成員使用private關鍵字定義,則產(chǎn)生封裝性,沒有使用private定義的成員函數(shù),默認為public。要注意,私有的數(shù)據(jù)成員,必須通過公有的成員函數(shù)才能使用,而不能不通過公有的成員函數(shù)直接來使用,否則就會出錯,這就稱為數(shù)據(jù)的封裝性。二、使用構造函數(shù)初始化結構的對象函數(shù)名與結構同名,稱為構造函數(shù),專門用于初始化結構的對象,構造函數(shù)使用的一般形式為:構造函數(shù)名對象名(初始化參數(shù));程序在運行時,會自動完成初始化任務?!?.2從結構演變一個簡單的類1、用關鍵字class代替struct,就是一個標準的類。實例:#include<iostream>usingnamespacestd;classPoint{//定義類Pointprivate: doublex,y;//類Point的數(shù)據(jù)成員public: Point(){};//類Point的無參數(shù)構造函數(shù) Point(doublea,doubleb){x=a;y=b;}//具有兩個參數(shù)的構造函數(shù) voidSetxy(doublea,doubleb){x=a;y=b;}//成員函數(shù),用于重新設置數(shù)據(jù)成員 voidDisplay(){cout<<x<<"\t"<<y<<endl;}//成員函數(shù),按指定格式輸出數(shù)據(jù)成員 };voidmain(){ Pointa;//定義類Point的對象a Pointb(18.5,10.6);//定義類Point的對象b并初始化 a.Setxy(10.6,18.5);//為對象a的數(shù)據(jù)成員賦值 a.Display();//顯示對象a的數(shù)據(jù)成員 b.Display();//顯示對象b的數(shù)據(jù)成員}類名Point具有的屬性x和y提供的操作構造函數(shù)PointSetxy用來給對象賦值Display用來輸出x和y程序運行結果:10.618.518.510.62、類的示意圖上例中的Point類可以看作直角坐標系中的點類,其結構示意圖如右:第一個方框中是類名;第二個方框中是坐標點的數(shù)據(jù),稱為屬性(或稱數(shù)據(jù)成員);第三個方框中表示類所提供的具體操作方法,實際上是如何使用數(shù)據(jù)x和y,以實現(xiàn)預定功能的函數(shù),這里稱為成員函數(shù)?!?.3面向過程與面向?qū)ο?、面向過程的方法所謂面向過程,就是不必了解計算機的內(nèi)部邏輯,而把精力集中在對如何求解問題的算法邏輯和過程的描述上,通過編寫程序把解決問題的步驟告訴計算機。C語言就是面向過程的結構化程序設計語言,其程序設計特點就是通過函數(shù)設計,實現(xiàn)程序功能的模塊化、結構化。但實際工作中,盡管結構化程序設計中的分而治之的想法非常好,但在結構化程序設計語言和結構化程序設計方法下卻難以貫徹到底,特別是在軟件規(guī)模在三四萬行以上時,開發(fā)和維護就十分困難。2、面向?qū)ο蟮姆椒榱私鉀Q面向過程的方法存在的問題,人們提出了面向?qū)ο蟮姆椒āK^對象,就是現(xiàn)實世界中客觀存在的事務。相對于過程,對象是穩(wěn)定的,復雜的對象可由簡單的對象組成,對象各自完成特定的功能。在面向?qū)ο蟪绦蛟O計中,可以將一組密切相關的函數(shù)統(tǒng)一封裝在一個對象中,從而合理而又有效的避免全局變量的使用,更徹底的實現(xiàn)了結構化程序設計的思想。結構化程序設計使用的是功能抽象,而面向?qū)ο蟪绦蛟O計不僅能進行功能抽象,還能進行數(shù)據(jù)抽象,“對象”實際上是功能抽象和數(shù)據(jù)抽象的統(tǒng)一。面向?qū)ο蟮某绦蛟O計方法不是以函數(shù)過程和數(shù)據(jù)結構為中心,而是以對象代表來求解問題的中心環(huán)節(jié),追求的是現(xiàn)實問題空間與軟件系統(tǒng)解空間的近似和直接模擬,從而使人們對復雜系統(tǒng)的認識過程與系統(tǒng)的程序設計實現(xiàn)過程盡可能的一致。3、軟件開發(fā)過程及發(fā)展趨勢軟件開發(fā)者將被開發(fā)的整個業(yè)務范圍稱為問題域,軟件開發(fā)是對給定問題求解的過程,分為兩項主要內(nèi)容:認識和描述?!罢J識”就是在所要處理的問題域范圍內(nèi),通過人的思維,對該問題域客觀存在的事務以及對所要解決的問題產(chǎn)生正確的認識和理解?!懊枋觥本褪怯靡环N語言把人們對問題域中事務的認識、對問題及解決方法的認識描述出來,最終的描述必須使用一種能夠被機器讀懂的語言,即編程語言。人們習慣使用的自然語言和計算機能夠理解并執(zhí)行的編程語言之間存在很大的差距,稱為“語言的鴻溝”。由于人的認識差距,問題域和自然語言之間也有縫隙,機器語言和自然語言之間鴻溝最寬,程序設計語言的發(fā)展趨勢則是為了鴻溝變窄。§2.4C++面向?qū)ο蟪绦蛟O計的特點對象名屬性1屬性2……屬性n操作1操作2……操作n面向?qū)ο蟮某绦蛟O計具有抽象、封裝、繼承和多態(tài)性等關鍵要素。1、對象C++中的對象是系統(tǒng)中用來描述客觀事物的一個實體,是構成系統(tǒng)的一個基本單位,C++中使用對象名、屬性和操作三要素來描述對象,如右所示:對象名用來標識一個具體對象;用數(shù)據(jù)來表示對象的屬性,一個屬性就是描述對象靜態(tài)特征的一個數(shù)據(jù)項;操作是描述對象動態(tài)特征(行為)的一個函數(shù)序列(使用函數(shù)實現(xiàn)操作),也稱方法或服務。數(shù)據(jù)稱為數(shù)據(jù)成員,函數(shù)稱為成員函數(shù),一個對象由一組屬性和對這組屬性進行操作的成員函數(shù)構成。例:用簡單對象表示平面上的A(3.5,6.4)和B(8.5,8.9)兩個坐標點??捎萌缦碌膶ο蠼Y構圖表示A和B的對象結構:Ax(3.5)y(6.4)Display();Setxy();Move();Bx(8.5)y(8.9)Display();Setxy();Move();2、抽象和類抽象是一種從一般的觀點看待事物的方法,即集中于事物的本質(zhì)特征,而不是具體細節(jié)或具體實現(xiàn)。面向?qū)ο蟮姆椒ò殉绦蚩醋魇怯梢唤M抽象的對象組成的,如果把一組對象的共同特征進一步抽象出來,就形成了“類”的概念。對于一個具體的類,它有許多具體的個體,這些個體叫做“對象”,同一類的不同對象具有相同的行為方式。一個對象是由一些屬性和操作構成的,對象的屬性和操作描述了對象的內(nèi)部細節(jié),類是具有相同的屬性和操作的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和操作兩個主要部分。類的作用是定義對象,類和對象的關系如同一個模具和其鑄造出來的鑄造件的關系,對象之間就像是同一模具鑄出的零件,模樣相同,鑄造材料可能不同。類給出了屬于該類的全部對象的抽象定義,而對象則是符合這種定義的實體。所謂一個類的所有對象具有相同屬性和操作,是指它們的定義形式(即屬性的個數(shù)、名稱、數(shù)據(jù)類型)相同,而不是說每個對象的屬性值都相同。3、封裝為了保護類的安全,即限制使用類的屬性和操作,需要將類封裝起來。封裝就像用同一個模具鑄造零件,各零件使用的材料(數(shù)據(jù)成員)和鑄造工藝(成員函數(shù))均不同,每一種材料都有其對應的鑄造工藝,材料與鑄造工藝是成套使用(封裝)的,雖然鑄出零件的模樣一樣,但如果用錯了鑄造工藝,就可能出廢品。所謂“封裝”,就是把對象的屬性和操作結合成一個獨立的系統(tǒng)單位,并盡可能隱蔽對象的內(nèi)部細節(jié)。按照面向?qū)ο蟮姆庋b原則,一個對象的屬性和操作是緊密結合的,對象的屬性只能由這個對象的操作來存取。對象的操作分為內(nèi)部操作和外部操作,前者只供對象內(nèi)部的其他操作使用,不對外提供;后者對外提供一個信息接口,通過這個接口接受對象外部的消息并為之提供操作(服務)。對象內(nèi)部數(shù)據(jù)結構的這種不可訪問性稱為信息(數(shù)據(jù))隱藏。數(shù)據(jù)封裝給數(shù)據(jù)提供了與外界聯(lián)訊的標準接口,只有通過這些接口,使用規(guī)范的方式,才能訪問這些數(shù)據(jù),同時程序員也只需要和接口打交道,而不必了解數(shù)據(jù)的具體細節(jié)。由此可見,封裝要求一個對象應具備明確的功能,并具有接口以便和其他對象相互作用,同時,對象的內(nèi)部實現(xiàn)(代碼和數(shù)據(jù))是受保護的,外界不能訪問它們,這樣封裝一方面使得程序員在設計程序時能專注于自己的對象,同時也切斷了不同模塊之間數(shù)據(jù)的非法使用,減少了出錯。在類中,封裝是通過存取權限實現(xiàn)的,例如每個類的屬性和操作分為私有和公有兩種類型,對象的外部職能訪問對象的公有部分,而不能直接訪問對象的私有部分。4、繼承繼承是一個類可以獲得另一個類的特性的機制,支持層次概念,通過繼承,低層的類只需定義特定于它的特征,而共享高層的類中的特征。繼承具有重要的實際意義,它簡化了人們對事物的認識和描述。繼承就像鑄造中母模與子模的關系。5、多態(tài)性不同的對象可以調(diào)用相同名稱的函數(shù),但可導致完全不同的行為的現(xiàn)象稱為多態(tài)性。利用多態(tài)性,程序中只需進行一般形式的函數(shù)調(diào)用,函數(shù)的實現(xiàn)細節(jié)留給接受函數(shù)調(diào)用的對象,這大大提高了解決人們復雜問題的能力。多態(tài)性就像是鑄造時不同的零件、不同材料所鑄的同一款零件雖然可以使用相同的鑄造工藝,但鑄出的零件用途、使用壽命和使用方法都不一樣?!?.5使用類和對象1、使用string對象stringstrstringfindsizesubstr實際上string類很復雜,如右的string類的簡化圖中只給出了下例中涉及的屬性和部分操作。由圖,類string的屬性是一個字符串str,同名函數(shù)string是構造函數(shù),用來初始化字符串,另外三個成員函數(shù)用來對屬性str進行操作,其中find成員函數(shù)用來在str字符串中檢索需要的子串;size成員函數(shù)計算并輸出str存儲的單詞長度;substr成員函數(shù)用來返回str字符串中的子串。在程序中可以使用string類定義存儲字符串的對象,這些對象屬于string類,因此還要使用#include<string>來包含這個類的頭文件。因為string需要的是字符串,所以string類的對象不能用單引號括起來的單個字符常量初始化,即:stringstr=’A’;×//同理stringstr(’A’);×但可以使用雙引號括起來的單個字符常量初始化,即:stringstr=“A”;√//同理stringstr(“A”);√如果string的對象str的內(nèi)容為“ab”,則str[0]=’a’,str[1]=’b’。例:使用string對象及初始化#include<iostream>#include<string>//在程序中包含string類的頭文件usingnamespacestd;voidmain(){ stringstr1("Wearehere!");//用構造函數(shù)string定義對象str1并賦值 stringstr2="Whereareyou?";//用構造函數(shù)string定義對象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;}程序運行結果為:W!Wearehere!W?Whereareyou?Pleaseinputaword:goodLengthofthegoodis4.程序中使用了兩種方法給string類的兩個對象初始化,也可將它們定義在一行中:stringstr1("Wearehere!"),stringstr2="Whereareyou?";string類還提供將兩個字符串連接起來組成一個新字符串的能力,用“+”號將后面的字符串連接到前一個字符串的后面,也可以與單個字符常量連接,如:str1=str1+“”+str1;將原來的兩個str1的內(nèi)容用空格連接起來。2、使用string類的典型成員函數(shù)string對象是通過調(diào)用成員函數(shù)實現(xiàn)操作,從而提供對象的行為或消息傳遞的,對象調(diào)用成員函數(shù)的語法為:對象名稱.成員函數(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用來返回給定字符串的子串,格式為:對象名稱.substr(要截取子串的起始位置,截取的長度);如:stringstr1("Wearehere!");語句中要從對象str1中截取字符串a(chǎn)re,可用下面的語句實現(xiàn):stringnewstr=str1.substr(3,3);此時newstr的內(nèi)容為are,括號中的第一個3是因為C++規(guī)定字符串的計數(shù)從0開始,所以a處于位置3;第二個3是因為are是3個字符,所以截取子串的長度為3。注意給出的要截取子串的起始位置必須位于字符串中,否則出錯。如果截取長度大于字符串長度,則是可以的,程序?qū)⒆詣咏厝〉阶址┪?,如語句stringstrnew=newstr.substr(2,8);和語句stringstrnew=newstr.substr(2,1);等效,都是截取字符e。=2\*GB3②成員函數(shù)find用來在主串中檢索所需字符串,格式為:對象名稱.find(要查找的字符串,開始查找的位置);函數(shù)返回查找到的字符串在主串中的位置,如:inti=str1.find(“are”,0);表示從str1字符串的位置0開始查找are出現(xiàn)的位置,結果為3。如果不給位置參數(shù),默認位置參數(shù)為0。=3\*GB3③string類還提供一個輔助功能,以便使用getline從流cin中讀出輸入的一行給string類的對象,如:stringInputLine;getline(cin,InputLline,’\n’);cout<<”yourinput:”<<InputLine<<endl;如果輸入“Iamhere!”,則得到如下結果:yourinput:Iamhere!例:將美國格式的日期轉換為國際格式#include<iostream>#include<string>usingnamespacestd;voidmain(){ cout<<"EnterthedateinAmericanformat" <<"(例如:December25,2002):";//注意逗號后面有一個空格 stringDate; getline(cin,Date,'\n');//輸入時間: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;}程序運行實例:EnterthedateinAmericanformat(例如:December25,2002):May28,2002Originaldate:May28,2002Converteddate:28May20023、使用complex對象C++標準庫提供complex類定義復數(shù)對象,在程序中包含這個類的頭文件為:#include<complex>復數(shù)(complexnumber)類需要兩個初始值:實部和虛部,complex是一個模板類,利用構造函數(shù)初始化的格式為:comlex<數(shù)據(jù)類型>對象名(實部值,虛部值);如:complex<int>num1(2,3);//定義復數(shù)2+3icomplex<float>num2(2.5,3.6);//定義復數(shù)2.5+3.6icomplex的real和imag成員函數(shù)用來輸出對象的實部和虛部的值,如:cout<<num2.real()<<”,”<<num2.imag()<<endl;4、使用對象小結標準庫提供的類都是經(jīng)過抽象,代表了一類對象,例如string類描述的是字符串特性,具有一個用來描述對象靜態(tài)性質(zhì)的字符串,字符串的值可以區(qū)分不同的對象;通過一系列的操作方法對這個字符串進行操作,用函數(shù)實現(xiàn)這些方法,又稱這些函數(shù)為成員函數(shù);數(shù)據(jù)成員(屬性)和成員函數(shù)(方法)代表了字符串一類事物的特征。String類的使用方法一般如下:#include<string>stringstr1;//定義這個類的一個對象str1str1=“thisisastring”;//給str1賦值stringstr2(“thisisastr2”);//定義str2并賦值cout<<str1<<str2.size();可以先定義對象,然后給它賦值(如上式str1),也可以在定義對象的同時初始化對象(如上式str2),如果要使用對象的成員函數(shù),則用“.”運算符(如最后一句)。同理,復數(shù)類可以抽象為具有實部和虛部的數(shù)據(jù)成員,以及能對復數(shù)進行基本操作的成員函數(shù),與string不同的是,定義復數(shù)類時與數(shù)據(jù)成員的類型無關,當定義復數(shù)類的對象時才指定實部和虛部的數(shù)據(jù)類型。注意,類是抽象出一類物質(zhì)的共同特征,模板則是歸納出不同類型事物的共同操作。§2.6string對象數(shù)組與泛型算法1、第1.2.6節(jié)介紹的泛型算法同樣適合string類,但要注意不要將該節(jié)介紹的find函數(shù)與string本身的find函數(shù)混淆。另外,string類還有一個swap成員函數(shù),用來交換兩個對象的屬性。假設有兩個string類的對象str1和str2,下面兩種調(diào)用方式是等效的:str1.swap(str2);str2.swap(str1);例:演示string對象#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));}程序運行結果:!ereheraew!ereheraewwearehere!該例中用str1初始化str2,是為了保證在復制時str2能有足夠的空間存儲str1,另外要注意ostream_iterator的數(shù)據(jù)類型是char,不是string。2、string類的成員函數(shù)begin和end[begin,end)二者都用來指示元素位置,前者指示第一個元素,后者指示最后一個元素后面的字符串結束位置。如果begin不等于end,算法首先作用于begin所指元素,并將begin前進一個位置,然后作用于當前的begin所指元素,如此繼續(xù)前進,直到begin等于end為止,所以它們是元素存在的半開區(qū)間。[begin,end)在實例中,例如str2值為“wrrheeeea!”,則reverse(str2.begin()+2,str2.begin()+8);執(zhí)行后str2值為“wreeeehra!”,這是因為begin()+2~begin+8是一個半開區(qū)間,區(qū)間包含的元素不是7個,而是上面陰影中包含的6個,即處于begin()+8位置的元素a并不被包含在這個半開區(qū)間中。同理,上例中的&str1[0]~&str1[12]也是這樣的一個半開區(qū)間,包含的元素是12個而不是13個。有了這兩個成員函數(shù),就可以用它們表示元素存儲區(qū)間,使用string定義的字符串中不用字符’\0’為結束符,而使用char定義的字符串則自動在尾部加入’0’作為結束符。例:演示string對象使用成員函數(shù)表示存儲空間#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());//按默認升冪排序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);//此時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ù)組,但只能對數(shù)組分量使用這些操作,不能對整個數(shù)組使用這些操作,swap成員函數(shù)可以用來交換兩個數(shù)組分量。例:演示string對象數(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!}程序輸出結果為:wearehere!Whereareyou?Welcome!Whereareyou?Welcome!Wearehere!注意除非輸出部分內(nèi)容,否則使用cout<<str[i]的方法更方便。第三章函數(shù)和函數(shù)模板C語言補充資料:一、函數(shù)的參數(shù):函數(shù)的參數(shù)分為形參和實參兩種。形參出現(xiàn)在函數(shù)定義中,在整個函數(shù)體內(nèi)都可以使用,離開該函數(shù)則不能使用。實參出現(xiàn)在主調(diào)函數(shù)中,進入被調(diào)函數(shù)后,實參變量也不能使用。形參和實參的功能是做數(shù)據(jù)傳送,發(fā)生函數(shù)調(diào)用時,主調(diào)函數(shù)把實參的值傳送給被調(diào)函數(shù)的形參,從而實現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。二、函數(shù)的形參和實參具有以下特點:1、形參變量只有在被調(diào)用時才分配內(nèi)存單元,在調(diào)用結束時,即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效,函數(shù)調(diào)用結束返回主調(diào)函數(shù)后,則不能再使用該形參變量。2、實參可是是常量、變量、表達式、函數(shù)等,無論實參是何種類型的量,在進行函數(shù)調(diào)用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此,應預先用賦值、輸入等辦法使實參獲得確定值。3、實參和形參在數(shù)量上、類型上、順序上應嚴格一致,否則會發(fā)生“類型不匹配”的錯誤。4、函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的,即只能把實參的值傳送給形參,而不能把形參的值反向的傳給實參,因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實參中的值不會變化。§3.1函數(shù)的參數(shù)及其傳遞方式一、C++的函數(shù)參數(shù)傳遞方式C語言函數(shù)參數(shù)的傳遞方式只有傳值一種,又分為傳變量值和傳變量地址值兩種情況,而C++的函數(shù)參數(shù)傳遞方式有兩種:第一種和C語言一樣,是傳值;第二種是傳引用,即傳對象的地址,所以也稱傳地址方式。注意傳地址值傳遞的是值,是以對象指針作為參數(shù);而傳地址傳遞的是地址,是以對象引用作為參數(shù)。所以在設計函數(shù)參數(shù)時,可以使用“對象”、“對象指針”和“對象引用”作為參數(shù)。二、對象作為函數(shù)參數(shù)使用對象作為函數(shù)參數(shù),是將實參對象的值傳遞給形參對象,傳遞是單向的,形參具有實參的備份,當在函數(shù)中改變形參的值時,改變的是這個備份中的值,不影響原來實參的值。例:傳對象不改變原來對象數(shù)據(jù)成員值的例子。#include<iostream>#include<string>=1\*GB3①=1\*GB3①voidswap(string,string);//定義函數(shù)swap,使用string類的對象作為函數(shù)形參voidmain(){stringstr1(“現(xiàn)在”),str2(“過去”);//定義對象str1和str2=2\*GB3②swap(str1,str2);=2\*GB3②=4\*GB3④cout<<”返回后:str1=”<<str1<<”str2=”=4\*GB3④}voidswap(strings1,strings2)//定義string類的對象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)將實參str1和str2的值分別傳遞給被調(diào)函數(shù)swap(s1,s2)的形參s1和s2。第三步:執(zhí)行=3\*GB3③所包含語句,即函數(shù)跳轉到被調(diào)函數(shù)的函數(shù)體執(zhí)行,直至被調(diào)函數(shù)結束。第四步:執(zhí)行=4\*GB3④語句,即函數(shù)調(diào)用結束,函數(shù)返回發(fā)生調(diào)用語句的下一個語句繼續(xù)執(zhí)行。程序輸出結果:交換為:str1=過去str2=現(xiàn)在返回后:str1=現(xiàn)在str2=過去三、對象指針作為函數(shù)參數(shù)使用指向?qū)ο蟮闹羔樧鳛楹瘮?shù)參數(shù),形參是對象指針(指針可以指向?qū)ο蟮牡刂罚?,實參可以是對象的地址值,而不一定非得是指針。雖然參數(shù)傳遞方式仍然是傳值方式,但因為形參傳遞的就是實參本身,所以當在函數(shù)中改變形參的值時,改變的就是原來實參的值。傳對象地址值要用到對象的指針,而對于數(shù)組,因數(shù)組名就是數(shù)組的指針名,所以數(shù)組也能用傳數(shù)組地址值的方式。例:使用對象指針作為函數(shù)參數(shù)的例子。#include<iostream>#include<string>=1\*GB3①=1\*GB3①voidswap(string*,string*);//定義函數(shù)swap,使用string類的指針作為函數(shù)形參voidmain(){stringstr1(“現(xiàn)在”),str2(“過去”);//定義對象str1和str2=2\*GB3②swap(&str1,&str2);//因函數(shù)原型中參數(shù)的類型是指針,所以=2\*GB3②是完全正確的,即在主調(diào)函數(shù)中可將對象str1和str2的首地址值&str1和&str2作為實參,并傳遞給形參=4\*GB3④cout<<”返回后:str1=”<<str1<<”str2=”=4\*GB3④}voidswap(string*s1,string*s2)//string類的對象指針s1和s2作為函數(shù)形參=3\*GB3③=3\*GB3③stringtemp=*s1;*s1=*s2;*s2=temp;cout<<”交換為:str1=”<<*s1<<”str2=”<<*s2<<endl;}因為采用的是傳地址值的方式,實參與形參的地址相同,所以改變形參的值的同時也改變了實參的值。程序輸出結果:交換為:str1=過去str2=現(xiàn)在返回后:str1=過去str2=現(xiàn)在在上例中,因為函數(shù)原型參數(shù)的類型是指針,可以直接指向?qū)ο蟮刂?,即string*s1=&str1;是完全正確的,所以主函數(shù)中,實參的產(chǎn)生并不是非先要在主程序中產(chǎn)生指針,然后再使用指針作為實參,而是直接使用&str1和&str2作為了實參,這是因為使用&str1和&str2標識的是取對象str1的首地址值,所以可以直接作為實參。另外在以數(shù)組作為函數(shù)參數(shù)時,因數(shù)組名即是數(shù)組指針名,指向數(shù)組首地址(例如a為數(shù)組名,則a同時也是數(shù)組指針名,a+1則指向數(shù)組a的第一個元素),所以也能采用傳地址值的方式,當交換后,因形參的改變,實參也會同時改變。例:傳遞數(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;}程序運行結果為:交換為:a=8b=3返回后:a=8b=3四、引用作為函數(shù)參數(shù)使用引用作為函數(shù)參數(shù),函數(shù)調(diào)用時,把實參對象的地址傳給形參對象,使形參對象的地址取實參對象的地址,從而使形參對象和實參對象共享同一個單元,(也可形象的記為實參對象名傳給形參對象名,形參對象名成為實參對象名的別名)所以改變形參對象的值就是改變實參對象的值。例:使用引用作為函數(shù)參數(shù)的例子。#include<iostream>#include<string>=1\*GB3①=1\*GB3①voidswap(string&,string&);//函數(shù)swap,使用string類的引用對象作為函數(shù)形參voidmain(){stringstr1(“現(xiàn)在”),str2(“過去”);//定義對象str1和str2=2\*GB3②swap(str1,str2);//=2\*GB3②=4\*GB3④cout<<”返回后:str1=”<<str1<<”str2=”=4\*GB3④}voidswap(string&s1,string&s2)//string類的引用對象s1和s2作為函數(shù)形參=3\*GB3③=3\*GB3③stringtemp=s1;s1=s2;s2=temp;cout<<”交換為:str1=”<<s1<<”str2=”<<s2<<endl;}程序輸出結果:交換為:str1=過去str2=現(xiàn)在返回后:str1=過去str2=現(xiàn)在在程序中調(diào)用函數(shù)swap時,實參str1和str2分別初始化引用s1和s2,在函數(shù)swap中,s1和s2分別是str1和str2的別名,形參對象s1和s2和實參對象str1和str2共享同一個單元(系統(tǒng)向形參傳遞的是實參的地址而不是實參的值),對s1和s2的訪問就是對str1和str2的訪問,所以函數(shù)swap改變了main函數(shù)中變量str1和str2的值。因為引用對象不是一個獨立的對象,不單獨占用內(nèi)存單元,而對象指針要另外開辟內(nèi)存單元(其內(nèi)容是所指向?qū)ο蟮牡刂罚?,所以傳引用要比傳指針更好。但要注意,雖然系統(tǒng)向形參傳遞的是實參的地址而不是實參的值,但實參必須使用對象名,例如:“swap(str1,str2);”正確,而“swap(&str1,&str2);”錯誤。五、可以通過間接引用的方法使用數(shù)組,如下例:#include<iostream>usingnamespacestd;typedefdoublearray[12];//自定義數(shù)組標識符arrayvoidavecount(array&b,intn)//定義函數(shù)avecount,其形參一個使用引用,{一個使用對象For(表達式1;表達式2;表達式3){語句1;For(表達式1;表達式2;表達式3){語句1;語句2;}語句3;語句4;上面for循環(huán)的執(zhí)行步驟為:1、執(zhí)行表達式1;2、執(zhí)行語句1、2,并返回到表達式2;3、如表達式2值為真,執(zhí)行表達式3,然后執(zhí)行語句1、2,并返回到表達式2,直到表達式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;}程序輸出結果:平均成績?yōu)?3.6分,不及格人數(shù)為4人。六、默認參數(shù)默認參數(shù)就是不要求程序員設定該參數(shù),而由編譯器在需要時給該參數(shù)賦默認值。當程序員需要傳遞特殊值時,必須顯式的指明。默認參數(shù)必須在函數(shù)原型中說明,默認參數(shù)可以多于1個,但必須放在參數(shù)序列的后部。例如:intSaveName(char*first,char*second=””,char*third=””,char*fourth=””);表明在實際調(diào)用函數(shù)SaveName時,如不給出參數(shù)second、third和fourth,則取默認值“”。另外,如果某個默認參數(shù)需要指明一個特定值,則在此之前的所有參數(shù)都必須賦值,如上例中,如果需要給出參數(shù)th
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 交通事故賠償金協(xié)議書七篇
- 鮑恩病病因介紹
- 勞務派遣書面協(xié)議書七篇
- 《數(shù)據(jù)資產(chǎn)入表合規(guī)規(guī)范指南》(征求意見稿)
- (參考)雕刻工藝品投資項目可行性研究報告
- 2023年天津市南開區(qū)高考語文二模試卷
- 《廉政公署專題》課件
- 電工培訓課件之跌落熔絲的操作
- 《廣告創(chuàng)意文案設計》課件
- 內(nèi)蒙古呼倫貝爾市阿榮旗2023-2024學年七年級上學期期末考試數(shù)學試卷(含答案)
- 2024秋期國家開放大學《公共政策概論》一平臺在線形考(形考任務1至4)試題及答案
- 《2024版 CSCO非小細胞肺癌診療指南》解讀
- GB 44497-2024智能網(wǎng)聯(lián)汽車自動駕駛數(shù)據(jù)記錄系統(tǒng)
- 家具售后合同協(xié)議書
- 空氣動力學數(shù)值方法:有限體積法(FVM):離散化技術與數(shù)值通量
- 下肢靜脈曲張的靜脈內(nèi)射頻消融術
- 北師大版七上冊數(shù)學期末沖刺復習
- 物流管理專業(yè)培養(yǎng)專題方案調(diào)研綜合報告樣本
- 小學語文整本書閱讀《夏洛的網(wǎng)》導讀課公開課一等獎創(chuàng)新教學設計
- 建筑鋼結構質(zhì)量通病及防治措施
- 骨科中醫(yī)護理方案總結與優(yōu)化(2篇)
評論
0/150
提交評論