




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第一章認識C++的對象§1.1初識C++的函數和對象1、混合型函數C++以.cpp為文件擴展名,有且只有一個名為main的主函數,因保留了這個面向過程的主函數,所以被稱為混合型語言。2、注釋方式①從“/*”開始,到“*/”結束,如:/* */②從ッ/”開始到本行結束,如: //……3、輸入輸出對象①提取操作:用提取操作符“>ゾ從cin輸入流中提取字符,如:cin?a.x;②插入操作:用插入操作符“くく”向cout輸出流中插入字符,如:coutくく“we”;cout?endl;③使用標準輸入(鍵盤輸入)cin及標準輸出(屏幕輸出)cout前,要在主函數前使用#include<iostream>將C++標準輸入輸出庫頭文件iostream將其包括。④換行操作:用語句cout?endl;或cout?tt\n";實現,其中end!可以插在流的中間。如:cout<<a.x<<endl<<a.y<<endl;4、使用命名空間C++相比C而言,可以省略“.h”標識頭文件,但必須使用語句usingnamespacestd;來讓命名空間中的對象名稱曝光。因此一般的程序都要具有下面的兩條語句:#include<iostream> 〃包含頭文件usingnamespacestd; 〃使用命名空間注意C++庫中代替C庫中頭文件的正確名稱,例如下面兩個語句效果ー樣:①#include<math.h>②#include<cmath>usingnamespacestd;5、對象的定義和初始化定義對象包括為它命名并賦予它數據類型,一般即使初值只用來表示該對象尚未具有真正意義的值,也應將每個對象初始化。c++中利用構造函數語法實現初始化,如:Intz(0); 〃等同于intz=0;6、函數原型及其返回值①c++使用變量和函數的基本規則都是:先聲明,后使用。變量有時也可邊聲明邊使用,但必須聲明,否則出錯。比如對函數的調用,要在主函數之前先對調用的函數進行原型聲明,如:intresult(int,int);它向編譯系統聲明,后面有一個result函數,該函數有兩個整型類型的參數,函數返回整型值。函數聲明時,除了默認參數(需給出默認參數的默認值)和內聯函數(需給出函數體及其內語句)外,不需給出參數的變量名稱,如果給出,效果也ー樣,如:intresult(inta,intb);和上面的聲明效果ー樣。②除構造函數與析構函數外,函數都需要有類型聲明。如intmain(),指出main是整數類型,返回值由return后面的表達式決定,且表達式的值必須與聲明函數的類型一致。如果函數確實不需要返回值,還可用void標識,一旦使用void標識,函數體內就不再需要使用return語句,否則會編譯出錯,但可使用return;語句。③C++函數有庫函數(標準函數,引用時函數名外加〈))和自定義函數(引用時函數名外加“”)兩類。7、const(常量)修飾符及預處理程序①const修飾符:用于定義符號常量。C中一般使用宏定義“#define”定義常量,而C++中除此外,建議使用const代替宏定義,用關鍵字const修飾的標識符稱為符號常量。因const是放在語句定義之前的,因此可以進行類型判別,這比用宏定義更安全一些。如下面兩個語句是等同的,但是后者可以比前者避免ー些很難發現的錯誤。#difineBOFSIZE100constintBUFSIZE100;常量定義也可使用構造函數的初始化方法,如:constintk(2);〃等同于constintk=2;因被const修飾的變量的值在程序中不能被改變,所以在聲明符號常量時,必須對符號常量進行初始化,除非這個變量是用extern修飾的外部變量,如:constintd;xconstintd=2;Mexternconstintd;ノconst的用處不僅是在常量表達式中代替宏定義,如果ー個變量在生存期內的值不會改變,就應該用const來修飾這個變量,以提高程序安全性。②預處理程序C++的預處理程序不是C++編譯程序的一部分,它負責在編譯程序的其他部分之前分析處理預處理語句,為與一般的C++語句區別,所有預處理語句都以位于行首的符號“#”開始,作用是把所有出現的、被定義的名字全部替換成對應的“字符序列”。預處理語句有三種:宏定義、文件包含(也成嵌入指令)和條件編譯。文件包含是指ー個程序把另ー個指定文件的內容包含進來,書寫時可以使用引號也可以使用尖括號,前者引用自己定義的包含文件,如:#include“E:\prog\myfile.h",后者引用系統提供的包含文件,如標準輸入輸出是定義在標準庫iostream中的,引用時要包括以下兩條語句:#include<iostream> 〃包含頭文件usingnamespacestd; //使用命名空間8、程序運行結果9、程序書寫格式C++的格式和cー樣,都很自由,一行可以寫幾條語句,但也要注意以下規則,増加可讀性:①括號緊跟函數名后面,但在for和while后面,應用ー個空格與左括號隔開;②數學運算符左右各留一個空格,以與表達式區別;③在表示參數時,逗號后面留一個空格;④在for、do...while和while語句中,合理使用縮進、ー對花括號和空行;⑤適當增加空行和程序注釋以增加可讀性;⑥太長的程序分為兩行或幾行,并注意選取合適的分行和縮進位置?!?.2認識C++面向過程編譯的特點ー、使用函數重載c++允許為同一個函數定義幾個版本,從而使ー個函數名具有多種功能,這稱為函數重載。假設有一個函數max,分別具有以下函數原型:intmax(int,int); 〃2個整型參數的函數原型intmax(int,int,int);〃3個整型參數的函數原型只要分別為不同參數的max編制相應的函數體,就可以實現各自的功能。二、新的基本數據類型及其注意事項1、void是無類型標識符,只能聲明函數的返回值類型,不能聲明變量。2、C++還比C多了bool(布爾)型。3、C++只限定int和short至少要有16位,而!ong至少32位,short不得長于int,int不能長于long,VC++6.0規定int使用4字節,這與C使用2字節不同。4、地址運算符用來取對象存儲的首地址,對于數組,則數組名就是數組的首地址。如:intx=56;定義x,VC++6.0使用4個字節存儲對象56,假設存放的內存首地址用十六進制表示為006AFDEC,則語句cout?&x;自動使用十六進制輸出存儲的首地址006AFDEC。5、C++中的常量分三種,第一種為符號常量;第二種為整數常量,有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(1),如ー456L、0L、2145857852L整數常量 \十進制:無后綴,如ー32、〇、123ハ進制:前綴〇(〇),如0123、05、032737、十六進制:前綴0X(ox),如0x15,OxlA,Oxlf16、C++與Cー樣,也使用轉義序列。如:へ〇’表示ASCI!碼值為零的空字符(NULL),へ101‘表示字符A。三、動態分配內存1、在使用指針時,如果不使用對象地址初始化指針,可以自己給它分配地址。對于只存儲ー個基本類型數據的指針,申請方式如下:new類型名[size]//申請可以存儲size個該數據類型的對象不再使用時,必須使用delete指針名;來釋放已經申請的存儲空間。如: double*p; 〃聲明double型指針p=newdouble[3] //分配3個double型數據的存儲空間deletep; 〃釋放已申請的存儲空間2、C必須在可執行語句之前集中聲明變量,而C++可以在使用對象時再聲明或定義。3、C++為結構動態分配內存一般格式為:指針名=new結構名; 〃分配delete指針名; //釋放例如給書中例1.1的Point結構指針分配內存:p=newPoint;當不再使用這個空間時,必須使用deletep;釋放空間。四、引用1、引用簡單的說,就是為現有的對象起個別名,別名的地址與引用對象的地址是ー樣的。引用的聲明方式為:數據類型&別名=對象名;,注意對象在引用前必須先初始化,另外聲明中符號“&”的位置無關緊要,比如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、所謂“引用”,就是將一個新標識符和一塊已經存在的存儲區域相關聯。因此,使用引用時沒有分配新的存儲區域,它本身不是新的數據類型??梢酝ㄟ^修改引用來修改原對象,但是不能有空引用,在程序中必須確保引用是和一塊正確的存儲區域關聯。引用通常用于函數的參數表中或作為函數的返回值。前者因為使用引用作為函數參數不產生臨時對象,可提高程序執行效率和安全性(§4.4.3),后者則是因為引用作為函數返回值可用于賦值運算符的左邊。3、引用實際上就是變量的別名,使用引用就如同直接使用變量一樣,引用與變量名在使用的形式上完全一樣,引用只是作為ー種標識對象的手段。但要注意,可以聲明指向變量或引用的指針,如:int*p=&x;Mint&a=x;int*p=&a;M;也可以聲明指針對指針的引用,如:int*&p2=pl;M(式中pl、p2是指針,?聲明p2是指針,&聲明p2是pl的引用);但不能聲明指針對變量的引用,如:int*&P=&x;x5不能聲明引用的引用,如:int&&r=x;x5也不能直接聲明對數組的引用。4,引用的作用與指針有相似之處,它會對內存地址上存在的變量進行修改,但它不占用新的地址,從而節省開銷。二者除使用形式不同,本質也不同:指針是低級的直接操作內存地址的機制,可由整型數強制類型轉換得到,功能強大但易出錯;引用則是較高級的封裝了指針的特性,不直接操作內存地址,不可由強制類型轉換而得,安全性較高。5、雖然不能直接定義對數組的引用,但可以通過typedef來間接的建立對數組的引用。如:typedefintarray[10]; 〃定義int型數組類型arrayarraya={12,34,}; 〃定義array型數組aarray&b=a; //定義數組a的引用b五、對指針使用const限定符1、變量的指針、指向變量的指針變量、指針變量指向的變量變量的指針就是變量的地址,存放變量地址的變量是指針變量,為了表示指針變量和它所指向的變量之間的聯系,在程序中用符號表示“指向”。例如用P代表指針變量,來存放變量a所在的內存地址,則?p代表指針變量指向的變量,也就是變量a,且|下面等式成立I:p=&a*p=*&a=a &*p=&a (*p)++=a++2、左值和右值左值是指某個對象的表達式,必須是可變的。左值表達式在賦值語句中即可作為左操作數,也可作為右操作數,如:x=56;和y=x;,而右值56就只能作為右操作數,不能作為左操作數。某些運算符如指針運算符“*”和取首地址運算符也可產生左值,例如P是一個指針類型的表達式,則“*P”是左值表達式,代表由P指向的對象,且可通過“*p=”改變這個對象的值;“&P”也是左值表達式,代表由P指向的對象的首地址,且可通過“&p=”改變這個指針的指向。3,指向常量的指針(constint*p=&x; "*p="的操作不成立)指向常量的指針是在非常量指針聲明前面使用const,如:constint*p;,它告訴編譯器,*p是常量,不能將?p作為左值進行操作,即限定了“*p=”的操作,所以稱為指向常量的指針。如:constinty=58;constint*pl=&y; 〃指向常量的指針指向常量y,y不能作為左值intx=45;constint*p=&x; 〃只能通過左值x間接改變?p的值上式中?P不能作為左值,但可以通過“x=”改變X的值,間接改變?P的值,即const僅是限制使用?p的方式,*p仍然可以作為右值使用,還可以通過運算符&改變指針所指向的地址,但不能改變指針所指向的內存地址中的內容。4,常量指針(int*constp=&x;"p="的操作不成立)把const限定符放在?號的右邊,就可使指針本身成為ー個const,即常量指針。如;intx=5;int*constp=&x;式中的指針本身是常量,編譯器要求給它ー個初始化值,這個值在指針的整個生存期中都不會改變,編譯器把P看作常量地址,所以不能作為左值,即“P=”不成立,也就是說不能改變指針P所指向的地址。但這個內存地址里的內容可以使用間接引用運算符?改變其值,例如語句?P=56;將上面的x的值改變為56。4、指向常量的常量指針也可以聲明指針本身和所指向的對象都不能改變的“指向常量的常量指針”,這時必須要初始化指針。如;intx=2;constint*constp=&x;語句告訴編譯器,*p和p都是常量,都不能作為左值,即“*p="和“p=”兩操作均不成立,這種指針限制"&”和“*”運算符,在實際中很少用。六、泛型算法應用于普通數組1、數組中元素及位置的關系如inta[]={5,6,7,8);則數組中各元素分別為:a[0]=5,a[l]=6,a[2]=7,a[3]=8.a為數組的起始地址,各元素的位置分別是:a+1位置為5,a+2位置為6,a+3位置為7,a+4位置為8。對數組按元素位置進行操作時,不包括起始位置,如:語句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加上一個字節后的地址,而是a+1xd得到的地址,其中d是元素類型占用的字節數,比如C++中整型數占用4個字節,則a+1位置上元素的地址就是地址a加上4個字節后得到的地址。2、數組不能作為整體輸出,C++引入STL庫提供的泛型算法,大大簡化數組操作。所謂泛型算法,就是提供的操作與元素的類型無關。3、對數組內容進行升早、輸出、反轉和復制等操作需要包含頭文件<algorithm>;對數組內容進行降嘉和檢索等操作需要包含頭文件(functional》。4、假設ー維數組a和b的長度均為Len,數據類型為Type,則對數組內容的相關操作和語句如下:①數據內容反轉:reverse(a,a+Len); 〃數組元素反轉排列②復制數組內容:copy(a,a+Len,b);〃將數組a的內容原樣復制到數組breverse-copy(a,a+Len,b);〃逆向復制數組a中內容到數組b③數組升早排序:sort(a,a+Len); 〃默認排序方式是升嘉④數組降嘉排序:sort(b,b+Len,greater<Type>());〃數組降早排序⑤檢索查找數組內容:find(a,a+Len,value);〃查找數組a中是否存在值為value的元素find函數返回的是位置指針,一般使用判別語句輸出查找的內容,如:Type*x=find(a,a+Len,value);〃x是類型為type的指針if(x==a+Len)cout?“沒有值為value的數組元素”;elsecout?"有值為value的數組元素”;⑥輸出數組的內容copy(a,a+Len,ostream-iterator<Type>(cout,"字符串"));可將ostream-iterator簡單理解為輸出流操作符,くType)表示數組元素的數據類型,本語句將數組內容按正向送往屏幕,輸出方式是將每個元素與“字符串"的內容組合在ー起連續輸出。如果使用空格""或換行符"\n",可以按格式輸出。也可將數組內容按逆向方式送往屏幕,語句為:reverse-copy(a,a+Len,ostream.iterator<Type>(cout,"字符串"));r反轉:reverse關 復制:copy,reverse-copy(逆向復制)鍵《排序:sort(默認升嘉,尾部加greaterくType》()為降嘉)字 檢索:find、輸出:copy(尾部必須加ostream部terator〈Yvpe〉(cout,"字符串"))七、數據的簡單輸入輸出格式1、C++提供了兩種格式控制方式,ー種是使用iso-base類提供的接口,另ー種是使用一種稱為操控符的特殊函數,操控符的特點是可直接包含在輸入和輸出表達式中,因此更為方便,不帶形式參數的操控符定義在頭文件〈iostream〉中,帶形式參數的操控符定義在頭文件〈iomanip〉中。在使用操控符時,ー是要正確包含它們,二是只有與符號"くく"或”>ゾ連接時オ起作用,三是無參數的操控符函數不能帶有“()"號。2、常用操控符及其作用格式含義作用dec設置轉換基數為十進制輸入/輸出oct設置轉換基數為ハ進制輸入/輸出
hex設置轉換技術為十六進制輸入/輸出endl輸出ー個換行符并刷新流輸出Setprecision(n)設置浮點數輸出精度n輸出Setw(n)設置輸出數據字段寬度輸出Setfill('字符‘)設置ch為填充字符輸出Setiosflags(flag)設置flag指定的標志位輸出resetiosflags(flag)清除flag指定的標志位輸出上表中操控符使用時,后四個操控符必須包含頭文件〈iomanip>,其中后兩個操控符的參數flag是引用C++的類ios-base里定義的枚舉常量,要使用限定符“::”,下面的表中是幾個常用的ios_base定義的枚舉常量,另外flag可由多個常量"或"起來使用,如:setiosflags(ios_base::showpoint|ios.base::fixed)?參數flag常引用的枚舉常量及其含義常量名含義ios_base::left輸出數據按輸出域左邊對齊輸出ios_base::right輸出數據按輸出域右邊對齊輸出ios.base::showpos在正數前添加一個"+”號ios-base::showpoint浮點輸出時必須帶有一個小數點ios.base::scientific使用科學計數法表示浮點數ios-base::fixed使用定點形式表示浮點數3、操控符使用實例①使用setw設置輸出寬度#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){cout<<setfi11C*9?setw(O)?15?endl<<setw(1)?15?endl<<setw(2)<<15<<endl<<setw(3)?15?endl?setw(4)?15?endl;cout<<setw(16)<<setfi11(4*0?"”<<endl;cout<<setiosflags(ios.base::right)〃設置標志位<setw⑸?1<setw(5)?2?setw(5)<<3;cout<<resetiosflags(ios.base::right);〃清除標志位cout<<setiosflags(ios.base::left)<setw⑸<<1<setw(5)?2<<setw(5)?3?endl;}程序輸出結果為:151515*15*?15要顯示元素的位數少時,則不起作用,即不影響顯示;使用填充字符時,n比后面要顯示元素的位數大1時,オ發生填充作用;要顯示15個“*”號,必須取n=16,同時setfill后面使用“”才能全部填充為設定字符“*”,否則將全部填充為空格;如果在程序中使用了設置標志,只有在清除設置標志之后,才能進行新的設置.②使用setprecition設置浮點數輸出精度constdoublePI=3.141592;voidmain(){cout?setprecition(0)?PI?endl<<setprecition⑴<<PI<<endl<<setprecition(2)<<PI<<endl?setprecition⑶?PI?endl?setprecition(7)?PI?endl;)程序輸出結果為:3.1415941592注意使用setprecition(intn)設定顯示小數位數時,小數點本身也占1位,。等于不設,由系統決定(默認為最多輸出5位小數),1代表顯示整數數字,2ォ顯示小數點后面的一位數。因系統只輸出5位小數,所以為了將6位小數全部輸出,最后一行必須設置7位才行。③使用dec、oct、hex設置轉換基數為不同進制intb=100;
〃十進制格式輸出〃十六進制格式輸出〃八進制格式輸出coutくく''Dec:"くくdecくくb〃十進制格式輸出〃十六進制格式輸出〃八進制格式輸出くく''Hex:"くくhexくくbくくendl<<"0ct:"<<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 〃因尚未轉換基數,100仍按ハ進制輸出+100Inputb=100〃輸入100+100〃已轉換基數,將100按十進制輸出100〃清除flag指定的標志位和正數前顯示的+號如上面程序,程序執行cout?oct語句后,將保持ハ進制格式輸出,雖然輸入100,但輸出仍按ハ進制,只有使用coutくくdec語句將其恢復為十進制。使用語句cout?dec<<setiosflags(ios-base::showpos)?b?endl;除了將進制恢復為十進制,還將輸出設置為在正的數字前面顯示“十”號,直到后面的語句使用清除該設置標志的語句cout<<resetiosflags(ios_base::showpos);執行,另外如果單獨使用語句ttresetiosflags(ios.base::showpos);則不起作用。3程序的編輯、編譯和運行的基本概念1、C++程序編制過程①先使用編輯器編輯ー個C++程序mycpp.cpp,又稱其為C++的源程序;②然后使用C++編譯器對這個C++程序進行編譯,產生文件mycpp.obj;③再使用連接程序(又稱Link),將mycpp.obj變成mycpp.exe文件。2、C++程序編制環境及使用方法現在C++的編制一般都使用集成環境,如VisualC++6.0等,所謂集成環境,就是將C++語言的編輯、編譯、連接和運行程序都集成到ー個綜合環境中。利用VC編制C++程序源文件的步驟如下:①啟動VC6.0;②File菜單ーNew對話框-Project選項卡-Win32ConsoleApplication選項,在右邊的Projectname輸入框中輸入項目名稱myfile,在右邊的Location輸入框中輸入存儲目錄,然后單擊0K按鍵,進入Win32ConsoleApplication制作向導的第一步,編輯C++程序文件是選擇Anemptyproject選項,單擊Finish按鈕,完成設置;③選中FileView選項卡,進入空項目,單擊它展開樹形結構,選中myfilefiles節點;選中SourceFile標記,再從File菜單中選new命令,彈出new對話框;選中C++SourceFile選項,在右方的File輸入框中輸入C++程序文件名(mycpp),系統默認的文件擴展名為.cpp,單擊OK按鈕,返回集成環境,并在SourceFile項下面產生空文件mycpp.cpp:在右邊的源代碼編輯框中輸入源文件;④部分Build菜單項描述
菜單項描述Compile編譯源代碼窗口中的活動源文件Build查看工程中所有文件,并對最近修改過的文件進行編譯和鏈接RebuildAll對工程中的所有文件全部進行重新編譯和連接Clean刪除項目的中間文件和輸出文件StartDebug彈出級聯菜單,主要包括有關程序調試的選項Execute運行應用程序第二章從結構到類的演變1結構的演化一、結構發生質的演變1、函數與數據共存c++中首先允許結構中可以定義函數,這些函數稱為成員函數,形式如下:struct結構名{數據成員成員函數L_可以像C語言中結構變量使用結構成員的方法那樣,通過C++的結構對象使用成員函數,形式如下:結構對象.成員函數2、封裝性如果在定義結構時,將數據成員使用private關鍵字定義,則產生封裝性,沒有使用private定義的成員函數,默認為public。要注意,私有的數據成員,必須通過公有的成員函數才能使用,而不能不通過公有的成員函數直接來使用,否則就會出錯,這就稱為數據的封裝性。二、使用構造函數初始化結構的對象函數名與結構同名,稱為構造函數,專門用于初始化結構的對象,構造函數使用的一般形式為:構造函數名對象名(初始化參數);程序在運行時,會自動完成初始化任務。§2.2從結構演變ー個簡單的類1、用關鍵字class代替struct,就是ー個標準的類。實例:
#include<iostream>usingnamespacestd;classPoint{〃定義類Pointprivate:doublex,y;〃類Point的數據成員public:Point(){,〃類Point的無參數構造函數Point(doublea,doubleb){x=a;y=b;} 〃具有兩個參數的構造函數voidSetxy(doublea,doubleb){x=a;y=b;}〃成員函數,用于重新設置數據成員voidDisplay(){coutくくxくく"、t"くくyくくendl;}〃成員函數,按指定格式輸出數據成員};voidmain0{Pointa;〃定義類Point的對象aPointb(18.5,10.6)71〃定義類Point的對象b并初始化a.Setxy(10.6,18.5);〃為對象a的數據成員賦值Display。;]//顯示對象a的數據成員類名Point
具有的屬性x和y
提供的操作
構造函數Point
Setxy用來給對象賦值
Display用來輸出x和yDisplay0;類名Point
具有的屬性x和y
提供的操作
構造函數Point
Setxy用來給對象賦值
Display用來輸出x和y上例中的Point類可以看作直角坐標系中的點類,其結構示意圖如右:第一個方框中是類名;第二個方框中是坐標點的數據,稱為屬性(或稱數據成員);第三個方框中表示類所提供的具體操作方法,實際上是如何使用數據x和y,以實現預定功能的函數,這里稱為成員函數。3面向過程與面向對象1、面向過程的方法所謂面向過程,就是不必了解計算機的內部邏輯,而把精力集中在對如何求解問題的算法邏輯和過程的描述上,通過編寫程序把解決問題的步驟告訴計算機。c語言就是面向過程的結構化程序設計語言,其程序設計特點就是通過函數設計,實現程序功能的模塊化、結構化。但實際工作中,盡管結構化程序設計中的分而治之的想法非常好,但在結構化程序設計語言和結構化程序設計方法下卻難以貫徹到底,特別是在軟件規模在三四萬行以上時,開發和維護就十分困難。2、面向對象的方法為了解決面向過程的方法存在的問題,人們提出了面向對象的方法。所謂對象,就是現實世界中客觀存在的事務。相對于過程,對象是穩定的,復雜的對象可由簡單的對象組成,對象各自完成特定的功能。在面向對象程序設計中,可以將一組密切相關的函數統一封裝在ー個對象中,從而合理而又有效的避免全局變量的使用,更徹底的實現了結構化程序設計的思想。結構化程序設計使用的是功能抽象,而面向對象程序設計不僅能進行功能抽象,還能進行數據抽象,“對象”實際上是功能抽象和數據抽象的統ー。面向對象的程序設計方法不是以函數過程和數據結構為中心,而是以對象代表來求解問題的中心環節,追求的是現實問題空間與軟件系統解空間的近似和直接模擬,從而使人們對復雜系統的認識過程與系統的程序設計實現過程盡可能的一致O3、軟件開發過程及發展趨勢軟件開發者將被開發的整個業務范圍稱為問題域,軟件開發是對給定問題求解的過程,分為兩項主要內容:認識和描述。“認識”就是在所要處理的問題域范圍內,通過人的思維,對該問題域客觀存在的事務以及對所要解決的問題產生正確的認識和理解?!懊枋觥咕褪怯茅`種語言把人們對問題域中事務的認識、對問題及解決方法的認識描述出來,最終的描述必須使用一種能夠被機器讀懂的語
言,即編程語言。人們習慣使用的自然語言和計算機能夠理解并執行的編程語言之間存在很大的差距,稱為“語言的鴻溝”。由于人的認識差距,問題域和自然語言之間也有縫隙,機器語言和自然語言之間鴻溝最寬,程序設計語言的發展趨勢則是為了鴻溝變窄。C++面向對象程序設計的特點面向對象的程序設計具有抽象、封裝、繼承和多態性等關鍵要素。1、對象對象名屬性1屬性2屬性n操作1操作2操作nc++中的對象是系統中用來描述客觀事物的ー個實體,是構成系統的ー個基本單位,C++中使用對象名、屬性和操作三要素來描述對象,如右所示:對象名用來標識ー個具體對象;用數據來表示對象的屬性,一個屬性就是對象名屬性1屬性2屬性n操作1操作2操作n例:用簡單對象表示平面上的A(3.5,6.4)和B(8.5,8.9)兩個坐標點??捎萌缦碌膶ο蠼Y構圖表示A和B的對象結構:BxBx(8.5)y(8.9)Display();Setxy();Move();x(3.5)y(6.4)Display();Setxy();Move();2、抽象和類抽象是一種從一般的觀點看待事物的方法,即集中于事物的本質特征,而不是具體細節或具體實現。面向對象的方法把程序看作是由一組抽象的對象組成的,如果把ー組對象的共同特征進ー步抽象出來,就形成了“類”的概念。對于ー個具體的類,它有許多具體的個體,這些個體叫做“對象”,同一類的不同對象具有相同的行為方式。ー個對象是由一些屬性和操作構成的,對象的屬性和操作描述了對象的內部細節,類是具有相同的屬性和操作的ー組對象的集合,它為屬于該類的全部對象提供了統ー的抽象描述,其內部包括屬性和操作兩個主要部分。類的作用是定義對象,I類和對象的關系如同一個模具和其鑄造出來的鑄礪的關系,對象之間就像是同一模具鑄出的零件,模樣相同,鑄造材料可能不同。類給出了屬于該類的全部對象的抽象定義,而對象則是符合這種定義的實體。所謂ー個類的所有對象具有相同屬性和操作,是指它們的定義形式(即屬性的個數、名稱、數據類型)相同,而不是說每個對象的屬性值都相同。3、封裝為了保護類的安全,即限制使用類的屬性和操作,需要將類封裝起來。區裝就像用同一個模具鑄造零件,各零件使用的材料(數據成員)和鑄造工藝(成員函數)均不同,每ー種材料都有其對應的鑄造工藝,材料與鑄造工藝是成套使用(封裝)的,雖然鑄出零件的模樣ー樣,但如果用錯了鑄造工藝,就可能出廢品。所謂“封裝”,就是把對象的屬性和操作結合成一個獨立的系統單位,并盡可能隱蔽對象的內部細節。按照面向對象的封裝原則,ー個對象的屬性和操作是緊密結合的,對象的屬性只能由這個對象的操作來存取。對象的操作分為內部操作和外部操作,前者只供對象內部的其他操作使用,不對外提供;后者對外提供ー個信息接口,通過這個接口接受對象外部的消息并為之提供操作(服務)。對象內部數據結構的這種不可訪問性稱為信息(數據)隱藏。數據封裝給數據提供了與外界聯訊的標準接口,只有通過這些接口,使用規范的方式,才能訪問這些數據,同時程序員也只需要和接口打交道,而不必了解數據的具體細節。
由此可見,封裝要求一個對象應具備明確的功能,并具有接口以便和其他對象相互作用,同時,對象的內部實現(代碼和數據)是受保護的,外界不能訪問它們,這樣封裝一方面使得程序員在設計程序時能專注于自己的對象,同時也切斷了不同模塊之間數據的非法使用,減少了出錯。在類中,封裝是通過存取權限實現的,例如每個類的屬性和操作分為私有和公有兩種類型,對象的外部職能訪問對象的公有部分,而不能直接訪問對象的私有部分。4、繼承繼承是ー個類可以獲得另ー個類的特性的機制,支持層次概念,通過繼承,低層的類只需定義特定于它的特征,而共享高層的類中的特征。繼承具有重要的實際意義,它簡化了人們對事物的認識和描述。繼承就像鑄造中母模與子模的關系廠5、多態性不同的對象可以調用相同名稱的函數,但可導致完全不同的行為的現象稱為多態性。利用多態性,程序中只需進行一般形式的函數調用,函數的實現細節留給接受函數調用的對象,這大大提高了解決人們復雜問題的能力。多態性就像是鑄造時不同的零件、不同材料所鑄的同一款零件雖然可以使用相同的鑄造工藝,但鑄出的零件用途、使用壽命和使用方法都不一樣。使用類和對象1>使用string對象stringstrstringfindsizesubstr實際上string類很復雜,如右的string類的簡化圖中只給出了下stringstrstringfindsizesubstr由圖,類string的屬性是ー個字符串str,同名函數string是構造函數,用來初始化字符串,另外三個成員函數用來對屬性str進行操作,其中find成員函數用來在str字符串中檢索需要的子串;size成員函數計算并輸出str存儲的單詞長度;substr成員函數用來返回str字符串中的子串。在程序中可以使用string類定義存儲字符串的對象,這些對象屬于string類,因此還要使用#include〈string)來包含這個類的頭文件。因為string需要的是字符串,所以string類的對象不能用單引號括起來的單個字符常量初始化,即:stringstr='A;x //|司理stringstr('A')、x但可以使用雙引號括起來的單個字符常量初始化,即:stringstr="A";M//同理stringstr("A");M如果string的對象str的內容為“ab",則str[O]='a',str[l]='b'o例:使用string對象及初始化#include<iostream>#include<string> 〃在程序中包含string類的頭文件usingnamespacestd;voidmain(){stringstrl(HWearehere!");〃用構造函數string定義對象strl_并賦值stringstr2=nWhereareyou?”;〃用構造函數string定義對象str2并賦值(或stringstrl("Wearehere!"),stringstr2="Whereareyou?";)cout<<strl[0]<<strl[11]<<","<<strl<<endl;cout?str2[0]<<str2[13]<<","<<str2<<endl;cout?"pleaseinputaword:";cin>>strl;〃輸入goodcout?"lenghtofthe"?strl?"is"?strl.size()?"."<<endl;)程序運行結果為:W!Wearehere!W?Whereareyou?Pleaseinputaword:goodLengthofthegoodis4.程序中使用了兩種方法給string類的兩個對象初始化,也可將它們定義在一行中:stringstrl("Wearehere!"),stringstr2="Whereareyou?";string類還提供將兩個字符串連接起來組成一個新字符串的能力,用“+”號將后面的字符串連接到前ー個字符串的后面,也可以與單個字符常量連接,如:strl=strl+""+strl;|將原來的兩個strl的內容用空格連接起來。2、使用string類的典型成員函數string對象是通過調用成員函數實現操作,從而提供對象的行為或消息傳遞的,對象調用成員函數的語法為:對象名稱.成員函數(參數(可供選擇的消息內容內常用的string類成員函數:〔substr:stringnewstr=strl.substr(3,3);find: inti=strl.find(uare'\0);get1ine:get1ine(cin,InputLline,'\n');swap: strl.swap(str2);=str2.swap(strl);ヾbegin和end:copy(strl.begin(),strl.end(),str2.begin());①成員函數substr用來返回給定字符串的子串,格式為:對象名稱.substr(要截取子串的起始位置,截取的長度);如:stringstrl("Wearehere!");語句中要從對象strl中截取字符串are,可用下面的語句實現:stringnewstr=strl.substr(3,3);此時newstr的內容為are,括號中的第一個3是因為C++規定字符串的計數從。開始,所以a處于位置3;第二個3是因為are是3個字符,所以截取子串的長度為3。注意給出的要截取子串的起始位置必須位于字符串中,否則出錯.如果截取長度大于字符串長度,則是可以的,程序將自動截取到字符串末尾,如語句stringstrnew=newstr.substr(2,8);和語句stringstrnew=newstr.substr(2,1);等效,都是截取字符e。②成員函數find用來在主串中檢索所需字符串,格式為:對象名稱.find(要查找的字符串,開始查找的位置);函數返回查找到的字符串在主串中的位置,如:inti=strl.find("are",〇);表示從strl字符串的位置〇開始查找are出現的位置,結果為3。如果不給位置參數,默認位置參數為0。③string類還提供ー個輔助功能,以便使用getline從流cin中讀出輸入的ー行給string類的對象,如:stringInputLine;get1ine(cin,InputLline,An9);coutくく''yourinput:"<<InputLine<<endl;如果輸入“Iamhere如,則得到如下結果:yourinput:Iamhere!例:將美國格式的日期轉換為國際格式#include<iostream>#include<string>usingnamespacestd;voidmain(){cout?nEnterthedateinAmericanformat"くく"(例如:December25,2002):〃注意逗號后面有一個空格stringDate;get1ine(cin,Date,z\nz);〃輸入時間:May28,2002inti=Date.find(""); //i=3stringMonth=Date.substr(0,i);〃截取月份賦值給字符串Monthintk=Date,find(u,"); //k=6stringDay=Date.substr(i+1,k-i-1);〃截取日期賦值給字符串Day
stringYear=Date.substr(k+2,4);〃截取年份賦值給字符串stringYear=Date.substr(k+2,4);〃截取年份賦值給字符串YearstringNewDate=Day+["+Month+""+Year;cout?nOriginaldate:"くくDateくくend1;cout?nConverteddate:n<<NewDate<<endl;)程序運行實例:EnterthedateinAmericanformat(例如:December25,2002):May28,2002Originaldate:May28,2002Converteddate:28May20023、使用compIex對象C++標準庫提供complex類定義復數對象,在程序中包含這個類的頭文件為:#include<complex>復數(complexnumber)類需要兩個初始值:實部和虛部,complex是ー個模板類,利用構造函數初始化的格式為:comlexく數據類型)對象名(實部值,虛部值);如:complex<int>numl(2,3);〃定義復數2+3icomplex<float>num2(2.5,3.6); //定義復數2.5+3.6icomplex的real和imag成員函數用來輸出對象的實部和虛部的值,如:cout<<num2.real()<<M,,9?num2.imag()<<endl;4、使用對象小結標準庫提供的類都是經過抽象,代表了一類對象,例如string類描述的是字符串特性,具有一個用來描述對象靜態性質的字符串,字符串的值可以區分不同的對象;通過一系列的操作方法對這個字符串進行操作,用函數實現這些方法,又稱這些函數為成員函數;數據成員(屬性)和成員函數(方法)代表了字符串ー類事物的特征。String類的使用方法一般如下:stringstrl;//定義這個類的ー個對象st象strl="thisisastringM;〃給strl賦值stringstr2("thisisastr2");〃定義str2并賦值cout?strl?str2.size();可以先定義對象,然后給它賦值(如上式strl),也可以在定義對象的同時初始化對象(如上式str2),如果要使用對象的成員函數,則用“.”運算符(如最后一句).同理,復數類可以抽象為具有實部和虛部的數據成員,以及能對復數進行基本操作的成員函數,與string不同的是,定義復數類時與數據成員的類型無關,當定義復數類的對象時オ指定實部和虛部的數據類型。注意,類是抽象出一類物質的共同特征,模板則是歸納出不同類型事物的共同操作.§2.6string對象數組與泛型算法1、第1.2.6節介紹的泛型算法同樣適合string類,但要注意不要將該節介紹的find函數與string本身的find函數混淆。另外,〔string類還有一個swap成員函數,用來交換兩個對象的屬性。|假設有兩個string類的對象str!和str2,ホ面兩種調用方式是等效的:strl.swap(str2);str2.swap(strl);例:演示string對象#include<iostream>#include<string>#include<algorithm>usingnamespacestd;voidmain(){stringstrl="wearehere!”,str2=strl;reverse(&strl[0],&strl[0]+12);copy(&strl[0],&strl[0]+12,&str2[0]);cout<<strl<<str2<<endl;reverse_copy(&str2[0],&str2[0]+12,ostream_iterator<char>(cout));)程序運行結果:!ereheraew!ereheraewwearehere!該例中用strl初始化str2,是為了保證在復制時str2能有足夠的空間存儲strl,另外要注意ostream-iterator的數據類型是char,不是string。2、string類的成員函數begin和end二者都用來指示元素位置,前者指示第一個元素,后者指示最后ー個元素后面的字符串結束位置。如果begin不等于end,算法首先作用于begin所指元素,并將begin前進ー個位置,然后作用于當前的begin所指元素,如此繼續前進,直到begin等于end為止,所以它們是元素存在的半開區間[它gin,end)。在實例中,例如str2值為"wrrheeeea!",則reverse(str2.begin()+2,str2.begin()+8);執行后str2值為"wreeeehra!",這是因為begin()+2?begin+8是ー個半開區間,區間包含的元素不是7個,而是上面陰影中包含的6個,即處于begin()+8位置的元素a并不被包含在這個半開區間中。同理,上例中的&strl[0?&strl[12]也是這樣的一個半開區間,包含的元素是12個而不是13個。有了這兩個成員函數,就可以用它們表示元素存儲區間,使用string定義的字符串中不用字符,、0,為結束符,而使用char定義的字符串則自動在尾部加入,0,作為結束符。例:演示string對象使用成員函數表示存儲空間#include<iostream>#include<string>#include<algorithm>#include<functional>usingnamespacestd;voidmain(){stringstrl=,,wearehere!,\str2(strl);reverse(strl.begin(),strl.end());〃strl逆向cout?strl?endl;〃輸出strl="!ereheraew”copy(strl.begin(),strl.end(),str2.begin());sort(strl.begin(),strl.end()); 〃按默認升暴排序strlcout<<strl<<endl; //輸出strl="!aeeeehrrw”coutくくstr2くくendl; 〃輸出str2="!ereheraew”reverse.copy(strl.begin(),strl.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(strl.begin(),strl.end(),greater<char>());//strl降嘉排列cout?strl?endl; 〃輸出strl="wrrheeeea!”strl.swap(str2); 〃互換內容cout?strl?^^,,?str2?endl;〃輸出wreeeehra!(strl)wrrheeeea!(str2)cout<<(*find(strl.begin(),strl.end(),'e')=='e')くく"''(?find(strl.begin(),strl.end(),'e')=='o')?endl;} 〃輸出10,注意上面的find不是成員函數find3、雖然可以聲明string類的數組,但只能對數組分量使用這些操作,不能對整個數組使用這些操作,swap成員函數可以用來交換兩個數組分量。例:演示string對象數組#include<iostream>#include<string>#include<algorithm>usingnamespacestd;voidmain(){stringstr[]={'Vearehere!”,“whereareyou?","welcome");for(inti=0;i<3;i++){copy(str[i].begin(),str[i].end(),ostream.iterator<char>(cout));cout<<endl;}〃for循環,換行分別輸出wearehere!Whereareyou?Welcome!str[0].swap(str[2]);〃互換,str[0]="Welcome!”str[2]="wearehere!”str[0].swap(str[1]);〃互換,str[0]="Whereareyou?wstr[1]="Welcome!wfor(i=0,i<3,i++)cout?str[i]<<endl;//for循環,換行分別輸出Whereareyou?Welcome!Wearehere!)程序輸出結果為:wearehere!Whereareyou?Welcome!Whereareyou?Welcome!Wearehere!注急除非輸出部分內容,否則使用coutくくstr[i]的方法更方便。第三章函數和函數模板C語言補充資料:ー、函數的參數:函數的參數分為形參和實參兩種,形參出現在函數定義中,在整個函數體內都可以使用,離開該函數則不能使用。實參出現在主調函數中,進入被調函數后,實參變量也不能使用。形參和實參的功能是做數據傳送,發生函數調用時,主調函數把實參的值傳送給被調函數的形參,從而實現主調函數向被調函數的數據傳送。二、函數的形參和實參具有以下特點:1、形參變量只有在被調用時オ分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只有在函數內部有效,函數調用結束返回主調函數后,則不能再使用該形參變量。2、實參可是是常量、變量、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此,應預先用賦值、輸入等辦法使實參獲得確定值。3、實參和形參在數量上、類型上、順序上應嚴格一致,否則會發生“類型不匹配”的錯誤。4、函數調用中發生的數據傳送是單向的,即只能把實參的值傳送給形參,而不能把形參的值反向的傳給實參,因此在函數調用過程中,形參的值發生改變,而實參中的值不會變化。1函數的參數及其傳遞方式ー、C++的函數參數傳遞方式c語言函數參數的傳遞方式只有傳值ー種,又分為傳變量值和傳變量地址值兩種情況,而C++的函數參數傳遞方式有兩種:第一種和C語言ー樣,是傳值;第二種是傳引用,即傳對象的地址,所以也稱傳地址方式。注意傳地址值傳遞的是值,是以對象指針作為參數;而傳地址傳遞的是地址,是以對象引用作為參數。所以在設計函數參數時,可以使用“對象”、“對象指針”和“對象引用”作為參數。二、對象作為函數參數使用對象作為函數參數,是將實參對象的值傳遞給形參對象,傳遞是單向的,形參具有實參的備份,當在函數中改變形參的值時,改變的是這個備份中的值,不影響原來實參的值。例:傳對象不改變原來對象數據成員值的例子。f#include<iostream>#include<string>usingnamespacestd;?\ voidswap(string,string);! 〃定義函數swap,使用string類的對象作為函數形參voidmain(){stringstri("現在”),str2(“過去”); 〃定義對象stri和str2swap(strl,str2);|〃使用傳值方式傳遞函數實參strl和str2的數據成員值④ coutくぐ’返回后:strl="?strl?"str2="?str2?endl;)rIvoidswap(stringsi,strings2)]〃定義string類的對象si和s2作為函數形參③j stringtemp=sl;sl=s2;s2=temp;ゝ cout〈ぐ’交換為:strl="?sl?"str2="?s2?endl;)程序執行步驟:第一步:先執行①所包含的語句;第二步:執行②語句,發生函數調用,主調函數swap(strl,str2)將實參str!和str2的值分別傳遞給被調函數swap(si,s2)的形參si和s2。第三步:執行③所包含語句,即函數跳轉到被調函數的函數體執行,直至被調函數結束。第四步:執行④語句,即函數調用結束,函數返回發生調用語句的下ー個語句繼續執行。程序輸出結果:交換為:strl=過去$近2=現在返回后:$打1=現在str2=過去三、對象指針作為函數參數使用指向對象的指針作為函數參數,形參是對象指針(指針可以指向對象的地址),實參可以是對象的地址值,而不一定非得是指針」雖然參數傳遞方式仍然是傳值方式,但因為形參傳遞的就是實參本身,所以當在函數中改變形參的值時,改變的就是原來實參的值。傳對象地址值要用到對象的指針,而對于數組,因數組名就是數組的指針名,所以數組也能用傳數組地址值的方式。例:使用對象指針作為函數參數的例子。r#include<iostream>#include<string>usingnamespacestd;?\ voidswap(string*,string*):[〃定義函數swap,使用string類的指針作為函數形參voidmain(){stringstrl("現在"),str2(“過去”); 〃定義對象stri和str2swap(&Strl,&Str2); //因函數原型中參數的類型是指針,所以.ring*sl=&strl;|是完全正確的,即在主調函數中可將對象strl和str2的首地址值&strl和&str2作為實參,并傳遞給形參④ cout〈ぐ’返回后:strl="?strl?"str2="?str2?endl;voidswap(string*sl,string*s2)“string類的對象指針si和s2作為函數形參stringtemp=*sl;*sl=*s2;*s2=temp;ゝ cout〈ぐ’交換為:strl="<<*sl<<"str2="〈〈*s2〈〈endl;)因為采用的是傳地址值的方式,實參與形參的地址相同,所以改變形參的值的同時也改變了實參的值。程序輸出結果:交換為:strl=過去$近2=現在返回后:strl=過去$近2=現在在上例中,因為函數原型參數的類型是指針,可以直接指向對象地址,即string*sl=&strl;是完全正確的,所以主函數中,實參的產生并不是非先要在主程序中產生指針,然后再使用指針作為實參,而是直接使用&strl和&str2作為了實參,這是因為使用&strl和&str2標識的是取對象strl的首地址值,所以可以直接作為實參。另外在以數組作為函數參數時,因數組名即是數組指針名,指向數組首地址(例如a為數組名,則a同時也是數組指針名,a+1則指向數組a的第一個元素),所以也能采用傳地址值的方式I,當交換后,因形參的改變,實參也會同時改變。例:傳遞數組名實例。#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[l]?endl;)程序運行結果為:交換為:a=8b=3返回后:a=8b=3四、引用作為函數參數使用引用作為函數參數,函數調用時,把實參對象的地址傳給形參對象,使形參對象的地址取實參對象的地址,I從而使形參對象和實參對象共享同一個單元,(也可形象的記為實參對象名傳給形參對象名,形參對象名成為實參對象名的別名)所以改變形參對象的值就是改變實參對象的值。例:使用引用作為函數參數的例子。r#include<iostream>#include<string>usingnamespacestd;?\ voidswap(string&,string&);〃函數swap,使用string類的引用對象作為函數形參voidmain(){stringstrl(“現在”),str2(“過去’'); 〃定義對象stri和str2②swap(strl,str2);〃傳遞對象的名字strl和str2④ coutくぐ’返回后:strl="?strl?"str2="?str2?endl;)'voidswap(string&sl,string&s2)"string類的引用對象si和s2作為函數形參(③\ stringtemp=sl;sl=s2;s2=temp;ゝ cout〈ぐ'交換為:strl="?sl?"str2="?s2?endl;)程序輸出結果:交換為:strl=過去str2=現在返回后:strl=過去str2=現在在程序中調用函數swap時,實參strl和str2分別初始化引用si和s2,在函數swap中,si和s2分別是strl和str2的別名,形參對象si和s2和實參對象str!和str2共享同一個單元(系統向形參傳遞的是實參的地址而不是實參的值),對si和s2的訪問就是對strl和str2的訪問,所以函數swap改變了main函數中變量str!和str2的值。
因為引用對象不是ー個獨立的對象,不單獨占用內存單元,而對象指針要另外開辟內存單元(其內容是所指向對象的地址),所以傳引用要比傳指針更好。但要I注意,雖然系統向形參傳遞的是實參的地址而不是實參的值,但實參必須使用對象名,例如:Wswap(strl,str2);w正確,而“swap(&strl,&str像;”錯誤。五、可以通過間接引用的方法使用數組,如下例:#include<iostream>usingnamespacestd;typedefdoublearray[12]; 〃自定義數組標識符arrayvoidavecount(array&b,intn)//定義函數avecount,其形參ー個使用引用,{ ー個使用對象For(表達式1;For(表達式1;表達式2;表達式3){語句1;語句2;}語句3;語句4;上面for循環的執行步驟為:1、執行表達式1;2、執行語句1、2,并返回到表達式2:3、如表達式2值為真,執行表達式3,然后執行語句1、2,并返回到表達式2,直到表達式2值為假:4、執行語句3、4intcount(0);〃累加器初始化。for(intj=0;j<n-2;j++){ave=ave+b[j];if(b[j]<60)count)b[n-2]=ave/(n-2);〃平均成績b[n-l]=count;| 〃不及格人數voidmain(){arrayb={12,34,56,78,90,98,76,85,64,43);array&a=b;avecount(a,12);ccoutくぐ,平均成績為”くくa[10]くく’‘分,不及格人數為''くくint(a[11])くく''人。''くくendl;程序輸出結果:平均成績為63.6分,不及格人數為4人。六、默認參數默認參數就是不要求程序員設定該參數,而由編譯器在需要時給該參數賦默認值。當程序員需要傳遞特殊值時,必須顯式的指明。I默認參數必須在函數原型中說明I,默認參數可以多于1個,但必須放在參數序列的后部。例如:intSaveName(char*first,char?second^'char?third=M",char*fourth="");表明在實際調用函數SaveName時,如不給出參數second,third和fourth,則取默認值“工另外,檢果某個默認參數需要指明一個特定值,則在此之前的所有參數瓶須賦值[,如上例中,如果需要給出參數third的值,則必須同時也給first和second賦值。例:設計ー個根據參數數量輸出信息的函數#include<iostream>#include<string>usingnamespacestd;voidDisplay(stringsi,strings2-9strings3=""); //語句①voidmain(){stringstrl(“現在”),str2(“過去”),str3(“未來”);//語句②Display(strl);Display(strl,str2,str3);Display(str3,strl);Display(str2,str3);)voidDisplay(stringsi,string(if(s2==””&s3=ゴ'”)elseif(s3==""&s2!="")〃語句④,輸出結果為現在、過去、未來〃語句⑤,輸出結果為未來、現在〃語句⑥,輸出結果為過去、未來s2,strings3)cout<<sl<<endl;elsecoutくくsiくく”、"?s2?endl:cout?sl?'\"?s2?'\"?s3?endl;)上面程序主要執行
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國玄參數據監測研究報告
- 2025至2030年中國濾紙打痕機數據監測研究報告
- 2025至2030年中國模具樹脂數據監測研究報告
- 2025至2030年中國智能電子調節器數據監測研究報告
- 2025至2030年中國明式低圓桌數據監測研究報告
- 2025至2030年中國帶底座移動式噴頭數據監測研究報告
- 2025至2030年中國工業呼吸面罩數據監測研究報告
- 2025至2030年中國小家電貨架數據監測研究報告
- 2025至2030年中國奇味村威化餅干數據監測研究報告
- 2025至2030年中國可充氣半透明大寶石打火機數據監測研究報告
- 履帶吊安裝與拆卸專項監理細則
- 危險化學品安全評價報告
- 通信冬雨季施工方案
- 2025年中考化學一輪復習全冊1-12單元22個必考實驗大全(背誦+默寫)含答案
- 血透患者如何預防高血鉀
- 室外云臺攝像機施工方案
- 2025年中鐵集裝箱運輸有限責任公司招聘46人(京外地區崗位)筆試參考題庫附帶答案詳解
- 2025年甘肅華亭煤業集團有限責任公司招聘筆試參考題庫含答案解析
- 妊娠合并支氣管哮喘課件
- 2025河南中煙漯河卷煙廠招聘7人易考易錯模擬試題(共500題)試卷后附參考答案
- 三農村合作社應急管理方案
評論
0/150
提交評論