版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
面向?qū)ο蟪绦蛟O(shè)計(jì)(C++)OrientedObjectProgramming(C++)主講:嚴(yán)冬梅第2章在較小范圍內(nèi)增強(qiáng)C第2章在較小范圍內(nèi)如何將C++增強(qiáng)C2.1數(shù)據(jù)類(lèi)型2.2I/O流控制2.3運(yùn)算2.4函數(shù)2.5引用2.6程序結(jié)構(gòu)2.7其他附錄2.1基本數(shù)據(jù)類(lèi)型布爾類(lèi)型bool字符型char數(shù)據(jù)類(lèi)型整型int雙精度型double浮點(diǎn)型(單精度型)float基本數(shù)據(jù)類(lèi)型聯(lián)合體union構(gòu)造數(shù)據(jù)類(lèi)型數(shù)組結(jié)構(gòu)體struct枚舉特殊類(lèi)型
2.1.1
數(shù)據(jù)類(lèi)型的分類(lèi)空值類(lèi)型void引用類(lèi)型:reference指針類(lèi)型:pointer雙字符型wchar_t類(lèi)class2.1數(shù)據(jù)類(lèi)型2.1.2常用基本數(shù)據(jù)類(lèi)型的取值范圍類(lèi)型長(zhǎng)度取值范圍char8位(1字節(jié))-128~127unsignedchar8位(1字節(jié))0~255short16位(2字節(jié))-32768~32767unsignedshort16位(2字節(jié))0~65535int(long)32位(4字節(jié))-2147483648~2147483647unsignedint(long)32位(4字節(jié))0~4294967295float32位(4字節(jié))-3.4×1038~3.4×1038double64位(8字節(jié))-1.8×10308~1.8×10308longdouble80位(10字節(jié))-1.2×104932~1.2×1043922.1數(shù)據(jù)類(lèi)型2.1.3
布爾型bool表示范圍僅含整數(shù)0和1,也可以表示成true和false,相當(dāng)于:
enumbool{false,true};因?yàn)闂l件表達(dá)式、邏輯運(yùn)算的結(jié)果都是0或1,所以,相當(dāng)大數(shù)量的表達(dá)式的值與布爾型對(duì)應(yīng)。用任何非0整數(shù)給bool型變量賦值時(shí),其值都是1,甚至非整數(shù)的其它類(lèi)型,只要非0,其值也都是1。
boola=3,b=1;//a=1,b=1boolc=a+b,d=a-b;//c=1,d=02.1數(shù)據(jù)類(lèi)型2.2.4const說(shuō)明符在說(shuō)明中根據(jù)不同情況,const的位置略有不同。使用const定義的常量,用來(lái)替代符號(hào)常量?jī)?yōu)點(diǎn):不再是字符串,具有數(shù)據(jù)類(lèi)型;在內(nèi)存中占有空間;在執(zhí)行語(yǔ)句中使用同變量一樣,只是不能做左值。定義const[數(shù)據(jù)類(lèi)型]常量名=初值;constdoublePI=3.1415926;constintSIZE=100;注意常量必須初始化;數(shù)據(jù)類(lèi)型與變量的含義相同,缺省時(shí)為int。常量同樣有全局和局部之分。常量可以定義在頭文件中。2.2.1數(shù)據(jù)類(lèi)型
指向常量的指針
const數(shù)據(jù)類(lèi)型*指針名;
指針類(lèi)型前加const,constint*p;
p是指針,是指向整型常量的指針,意味著*p不能改變,但是p可以改變。
即p=##;√*p=##;×
0067:f600100067:fd66變量p常量i,0067:f600constinti=10,j=20;constint*p=&i;p=&j;0067:f70020常量j0067:f7002.2.1數(shù)據(jù)類(lèi)型指針常量數(shù)據(jù)類(lèi)型*const指針名;
指針名前加const,int*constp;p是常量,是指向整型數(shù)據(jù)的指針常量,意味著p不能改變,但是*p可以改變。即p=##;×*p=##;√定義指針常量時(shí)必須初始化,初始化值是字符串常量的地址。0067:f60010變量i0067:f6000067:fd66常量pinti=10,j=20;int*constp=&i;*p=j;2020變量j0067:f7002.2.1數(shù)據(jù)類(lèi)型
指向常量的指針常量
const數(shù)據(jù)類(lèi)型*const指針名;
指針類(lèi)型和指針名前均加const
constint*constp;
p是指針常量,是指向整型常量的指針常量,意味著p不能改變,*p也不能改變。即p=##;×*p=##;×0067:f600100067:f6000067:fd66常量p常量iconstinti=10;constint*constp=&i;2.2.1數(shù)據(jù)類(lèi)型
用const修飾形式參數(shù)
voidfunc(conststructstudent*s){}
雖然以指針?lè)绞絺鬟f一個(gè)結(jié)構(gòu)體指針,但對(duì)源數(shù)據(jù)不能做修改。用const修飾成員函數(shù)表示該成員函數(shù)不可以改變對(duì)象屬性值。
intgetAge()const;2.2.2I/O流控制標(biāo)準(zhǔn)輸入輸出流C++中輸入/輸出流(一般叫iostreams或streams)提供了C的stdio.h庫(kù)中的所有功能。輸入/輸出流用作將具有類(lèi)型的對(duì)象轉(zhuǎn)換成可讀的正文,反之亦然。流能讀寫(xiě)二進(jìn)制數(shù)據(jù)。C++程序以四個(gè)預(yù)定義的流開(kāi)始,它們是:
cin標(biāo)準(zhǔn)輸入
cout標(biāo)準(zhǔn)輸出
cerr標(biāo)準(zhǔn)錯(cuò)
clog緩沖的cerr2.2.2I/O流控制標(biāo)準(zhǔn)輸入輸出流標(biāo)準(zhǔn)輸出流cout格式:cout<<輸出序列<<輸出序列<<……;輸出序列有以下幾種:
字符串原樣輸出
格式控制用來(lái)說(shuō)明后面的輸出數(shù)據(jù)的格式
變量或表達(dá)式輸出變量或表達(dá)式值
cout<<“a=“<<a<<“,b=“<<b<<“,sum=“<<a+b;
輸出結(jié)果:a=10,b=20,sum=302.2.2I/O流控制標(biāo)準(zhǔn)輸入輸出流標(biāo)準(zhǔn)輸入流cin格式:cin>>變量1>>變量2>>……;
輸入的數(shù)據(jù)以回車(chē)鍵結(jié)束
當(dāng)連續(xù)輸入多個(gè)變量時(shí),輸入數(shù)據(jù)可以用空白字符隔開(kāi),例如:cin>>a>>b;
輸入的數(shù)據(jù)可以是1020↙輸入的數(shù)據(jù)可以是10 20↙輸入的數(shù)據(jù)可以是10↙20↙2.2.2I/O流控制注意1.輸入一般不要求格式2.輸入流能自動(dòng)跳過(guò)空白字符chara,b,c;cin>>a>>b>>c;3.字符串輸入避免溢出,可采取以下方法:
chararray[SIZE];cin.width(sizeof(array));cin>>array;//自動(dòng)讀取SIZE-1個(gè)字符
2.2.2I/O流控制使用控制符#include<iomanip>控制符描述dec置基數(shù)為10hex置基數(shù)為16oct置基數(shù)為8setfill(c)設(shè)填充字符為csetprecision(n)設(shè)顯示小數(shù)精度為nsetw(n)設(shè)域?qū)挒閚個(gè)字符setiosflags(ios::fixed)固定的浮點(diǎn)表示setiosflags(ios::scientific)指數(shù)表示setiosflags(ios::left)左對(duì)齊setiosflags(ios::right)右對(duì)齊setiosflags(ios::skipws)忽略前導(dǎo)空白setiosflags(ios::showpoint)強(qiáng)制顯示小數(shù)部分setiosflags(ios::showpos)強(qiáng)制顯示正數(shù)的符號(hào)2.2.2I/O流控制2.4.2
使用控制符常用的格式控制通用的輸出數(shù)據(jù)寬度setw(n)填充字符setfill(c)對(duì)齊方式setiosflags(ios::left)setiosflags(ios::right)整數(shù)進(jìn)制dechexoct實(shí)數(shù)小數(shù)位數(shù)setprecision(n)setiosflags(ios::fixed)指數(shù)表示法setiosflags(ios::scientific)必須顯示小數(shù)位setiosflags(ios::showpoint)字符串忽略前導(dǎo)空白setiosflags(ios::skipws)【例2.1】I/O流格式#include<iomanip>#include<iostream>usingnamespacestd;intmain(){inta=21;cout<<"dec:"<<a<<endl;//默認(rèn)以十進(jìn)制形式輸出acout<<"hex:"<<hex<<a<<endl;//以十六進(jìn)制形式輸出acout<<"oct:"<<oct<<a<<endl;//以八進(jìn)制形式輸出achar*pt="China";//pt指向字符串”china”cout<<setw(10)<<pt<<endl;//輸出字符串
cout<<setfill('*')<<setw(10)<<pt<<endl;//輸出字符串
doublepi=22.0/7.0*100;//計(jì)算100pi值
cout<<setprecision(2)<<setiosflags(ios::scientific)<<setw(16)<<pi<<endl;cout<<setprecision(6)<<setw(16)<<pi<<endl;cout<<setiosflags(ios::fixed)<<setiosflags(ios::showpos)<<setprecision(6)<<setw(16)<<pi<<endl;return0;}2.2.3運(yùn)算2.3.1new和delete
在任何一個(gè)變量使用前,都必須完成關(guān)于存儲(chǔ)方面的有關(guān)安排:存放位置、占據(jù)多少存儲(chǔ)單元。這個(gè)工作叫內(nèi)存分配。編譯時(shí)分配內(nèi)存是靜態(tài)內(nèi)存分配運(yùn)行時(shí)分配內(nèi)存是動(dòng)態(tài)內(nèi)存分配堆內(nèi)存——?jiǎng)討B(tài)內(nèi)存(在運(yùn)行時(shí)申請(qǐng)內(nèi)存)用戶(hù)內(nèi)存:代碼區(qū)、全局?jǐn)?shù)據(jù)區(qū)、棧區(qū)、堆。2.2.3運(yùn)算2.3.1new和delete創(chuàng)建、銷(xiāo)毀一變量
new
數(shù)據(jù)類(lèi)型(初始值);
delete
指針名;int*p;p=newint;deletep;創(chuàng)建、銷(xiāo)毀一數(shù)組
new
數(shù)據(jù)類(lèi)型[長(zhǎng)度];
delete[]指針名;int*p;p=newint[30];delete[]p;2.2.3運(yùn)算說(shuō)明
new分配堆內(nèi)存,比malloc()更簡(jiǎn)練。
new的操作數(shù)為數(shù)據(jù)類(lèi)型,它可以帶初始化值表或單元個(gè)數(shù)。new返回一個(gè)具有操作數(shù)的數(shù)據(jù)類(lèi)型的指針。
new和delete是C++專(zhuān)有的操作符,它們不用頭文件聲明。
delete類(lèi)似于free(),釋放堆內(nèi)存。
由于堆對(duì)象的生存期是從創(chuàng)建對(duì)象到銷(xiāo)毀或程序結(jié)束,因此,刪除不再需要的堆對(duì)象是一個(gè)必須進(jìn)行的工作。
(最重要的)new和delete在創(chuàng)建/釋放類(lèi)對(duì)象時(shí)可以自動(dòng)進(jìn)行對(duì)象的構(gòu)造和銷(xiāo)毀2.2.3運(yùn)算【例2.2】創(chuàng)建、銷(xiāo)毀一維數(shù)組#include<iostream>usingnamespacestd;intmain(){inti,n,*data;floatsum=0,avg;cout<<"請(qǐng)輸入元素個(gè)數(shù):";cin>>n;
data=newint[n];cout<<"請(qǐng)輸入"<<n<<"個(gè)整數(shù):";for(i=0;i<n;i++){cin>>data[i];sum+=data[i];}avg=sum/n;cout<<"元素總和為"<<sum<<",平均值為:"<<avg<<endl;delete[]data;return0;}2.2.3運(yùn)算#include<iostream>usingnamespacestd;intmain(){int**p,i,j,m,n;cin>>m>>n;
p=newint*[m];for(i=0;i<m;i++){
p[i]=newint[n]; for(j=0;j<n;j++)cin>>p[i][j];}for(i=0;i<m;i++){for(j=0;j<n;j++)cout<<setw(5)<<*(*(p+i)+j);cout<<"\n";}
delete[]p;return0;}【例2.3】創(chuàng)建、銷(xiāo)毀二維數(shù)組2.2.3運(yùn)算
2.3.2
作用域限定運(yùn)算符
::——表示全局變量
inti=10;intmain(){inti=5;::i+=10;cout<<”i=”<<i<<endl;……}i=202.2.4函數(shù)
2.4.1
內(nèi)聯(lián)函數(shù)什么是內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)函數(shù)也稱(chēng)內(nèi)嵌函數(shù)
使用關(guān)鍵字inline說(shuō)明的函數(shù)是內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)函數(shù)的作用相當(dāng)于帶參數(shù)的宏,就是將“函數(shù)調(diào)用”變成代碼替換。
程序編譯前,系統(tǒng)自動(dòng)將內(nèi)聯(lián)函數(shù)進(jìn)行代碼替換(系統(tǒng)會(huì)自動(dòng)優(yōu)化代碼)2.2.4函數(shù)使用內(nèi)聯(lián)函數(shù)的意義凡是有內(nèi)聯(lián)函數(shù)調(diào)用的地方就會(huì)有代碼替換,即內(nèi)聯(lián)函數(shù)增加了代碼空間,增加了編譯時(shí)間采用一般函數(shù)調(diào)用,需要建立環(huán)境棧存儲(chǔ)參數(shù)、返回地址等,并且產(chǎn)生程序執(zhí)行轉(zhuǎn)移,需要時(shí)間開(kāi)銷(xiāo),因此,調(diào)用n次就會(huì)增加n次時(shí)間開(kāi)銷(xiāo)。編譯只進(jìn)行一次,但可運(yùn)行多次,因此使用內(nèi)聯(lián)函數(shù)雖增加了編譯時(shí)間,但減少了程序執(zhí)行時(shí)間(函數(shù)調(diào)用開(kāi)銷(xiāo))。2.2.4函數(shù)intmain(){charc;intisnumber(char);cout<<"Enteracharacter:";cin>>c;if(isnumber(c))cout<<"Youenteredadigit.";elsecout<<"Youenteredanon-digit.";return0;}intisnumber(charc){return(c>='0'&&c<='9')?1:0;}
對(duì)于isnumber這樣簡(jiǎn)單的函數(shù),使用函數(shù)調(diào)用的方法(特別是多次調(diào)用)將大大降低運(yùn)行效率,可以采用if(c>='0'&&c<='9')表達(dá)式替換的方法。但是,手工替換很煩瑣,最好讓編譯程序去做。內(nèi)聯(lián)函數(shù)是程序行的擴(kuò)展,主要是解決程序的運(yùn)行效率。2.2.4函數(shù)
內(nèi)聯(lián)函數(shù)的使用(1)在函數(shù)聲明和定義的最前面加關(guān)鍵字inline
在函數(shù)聲明時(shí)必須有inline,定義時(shí)可有可無(wú)。intmain(){charc;
inlineintisnumber(char);……}inlineintisnumber(charc)//或用intisnumber(charc){return(c>='0'&&c<='9')?1:0;}2.2.4函數(shù)
內(nèi)聯(lián)函數(shù)的使用(2)內(nèi)聯(lián)函數(shù)必須在調(diào)用之前聲明或定義。因?yàn)閮?nèi)聯(lián)函數(shù)的代碼必須在被替換之前已經(jīng)生成被替換的代碼。inlineintisnumber(charc)
{return(c>='0'&&c<='9')?1:0;}
intmain()
{charc;
//inlineintisnumber(char);
……
}2.2.4函數(shù)內(nèi)聯(lián)函數(shù)的函數(shù)體限制內(nèi)聯(lián)函數(shù)中不能含有復(fù)雜的結(jié)構(gòu)控制語(yǔ)句,否則,編譯時(shí)將該函數(shù)視同普通函數(shù)那樣產(chǎn)生函數(shù)調(diào)用代碼。遞歸函數(shù)是不能被用來(lái)做內(nèi)聯(lián)函數(shù)的。內(nèi)聯(lián)函數(shù)只適合于只有1~5行的小函數(shù)。最適合使用內(nèi)聯(lián)函數(shù):小函數(shù)、頻繁調(diào)用2.2.4函數(shù)2.函數(shù)重載
使用重載函數(shù)的必要性
在不同類(lèi)型上作相同運(yùn)算而又用相同名字的情況,稱(chēng)為重載。intadd(intx,inty)
{inttemp;temp=x+y;returntemp;
}
doubleadd(doublex,doubley)
{doubletemp;temp=x+y;returntemp;
}
intmain()
{inta=4,b=5;doublex=12.5,y=75.75;
cout<<add(a,b)<<"\t"<<add(x,y)<<endl;return0;
}運(yùn)行結(jié)果為:
9 88.252.2.4函數(shù)
使用重載函數(shù)的必要性使用不同數(shù)目的參數(shù)#include<iostream>usingnamespacestd;
intmul(intx,inty)
{inttemp;temp=x*y;returntemp;}
intmul(intx,inty,intz)
{inttemp;temp=x*y*z;returntemp;}
intmain()
{inta=5,b=10,c=20;
cout<<mul(a,b)<<"\n"<<mul(a,b,c)<<endl;return0;
}運(yùn)行結(jié)果為:
50
10002.2.4函數(shù)使用說(shuō)明(1)重載函數(shù)僅僅是返回類(lèi)型不同是不夠的
重載函數(shù)至少在參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型或參數(shù)順序上有所不同(2)不能用typedef定義的類(lèi)型名來(lái)區(qū)分重載函數(shù)聲明中的參數(shù)(3)重載函數(shù)應(yīng)該具有相同的功能
通過(guò)名字粉碎來(lái)區(qū)分重載函數(shù)2.2.4函數(shù)
匹配重載函數(shù)的順序只要參數(shù)表互不相同,C++就會(huì)根據(jù)所給參數(shù)調(diào)用正確的函數(shù)。(1)尋找一個(gè)嚴(yán)格的匹配(2)通過(guò)內(nèi)部轉(zhuǎn)換尋求一個(gè)匹配(3)通過(guò)用戶(hù)定義的轉(zhuǎn)換尋求一個(gè)匹配2.2.4函數(shù)3.默認(rèn)參數(shù)默認(rèn)參數(shù)的目的調(diào)用某函數(shù)時(shí)傳遞的參數(shù)經(jīng)常是同一值,則可使用默認(rèn)參數(shù),即調(diào)用函數(shù)時(shí)不給出實(shí)參,而是直接取默認(rèn)值。默認(rèn)參數(shù)的聲明若有函數(shù)聲明,則在聲明中默認(rèn)參數(shù),不能寫(xiě)在定義中;若無(wú)函數(shù)聲明,則在定義中默認(rèn)參數(shù)。2.2.4函數(shù)
默認(rèn)參數(shù)的順序規(guī)定默認(rèn)參數(shù)應(yīng)從右至左逐漸定義。
voidfun(inta=1,intb,intc=3);×voidfun(inta,intb=1,intc=3);√當(dāng)調(diào)用參數(shù)時(shí)只能向左匹配參數(shù)(靠右面的默認(rèn)參數(shù)先有效)。
voidfun(inta=1,intb=2,intc=3);
fun(5,10);->a=5,b=10,c=32.2.4函數(shù)默認(rèn)參數(shù)與函數(shù)重載默認(rèn)參數(shù)可以將一系列重載函數(shù)合成一個(gè)為函數(shù),但由于必須從右至左定義,并向左匹配參數(shù),因此它沒(méi)有重載函數(shù)靈活,而且數(shù)據(jù)類(lèi)型也有限制。intInitDate(inty=1972,intm=3,intd=26);默認(rèn)值的限定默認(rèn)值可為全局變量、全局常量和函數(shù),即不能是局部變量。2.2.5引用1.引用概念的導(dǎo)入2.引用的定義3.用引用傳遞函數(shù)參數(shù)4.返回引用與返回值5.函數(shù)調(diào)用作為左值6.用const限定引用7.堆中變量的引用1.引用概念的導(dǎo)入?yún)?shù)傳遞的傳值方式在函數(shù)域中為參數(shù)重新分配內(nèi)存,而把實(shí)參的數(shù)值傳遞到新分配的內(nèi)存中。它的優(yōu)點(diǎn)是有效避免函數(shù)的副作用。問(wèn)題如果要求改變實(shí)參的值,怎么辦呢?如果實(shí)參是一個(gè)復(fù)雜的對(duì)象,重新分配內(nèi)存會(huì)引起程序執(zhí)行效率大大下降,怎么辦呢?有一種導(dǎo)出型數(shù)據(jù)類(lèi)型—引用(reference)。引用就是給另一個(gè)變量或?qū)ο笃鹨粋€(gè)別名(alias)。2.引用的定義數(shù)據(jù)類(lèi)型&引用名=初始值;引用在聲明時(shí)必須初始化inti;int&j=i;對(duì)引用的改變就是對(duì)引用變量的改變。intmain(){intintOne;int&rInt=intOne;intOne=5;cout<<"intOne:"<<intOne<<endl;cout<<"rInt:"<<rInt<<endl;rInt=7;cout<<"intOne:"<<intOne<<endl;cout<<"rInt:"<<rInt<<endl;return0;}intOne:5rInt:5intOne:7rInt:72.引用的定義數(shù)據(jù)類(lèi)型&引用名=初始值;int&j=i;
引用不是值,不占內(nèi)存。對(duì)引用取地址,返回的是引用目標(biāo)變量的地址。intmain(){intintOne;int&rInt=intOne;intOne=5;cout<<"intOne:"<<intOne<<endl;cout<<"rInt:"<<rInt<<endl;cout<<"&intOne:"<<&intOne<<endl;cout<<"&rInt:"<<&rInt<<endl;return0;}intOne:5rInt:5&intOne:0018FF44&rInt:0018FF442.引用的定義數(shù)據(jù)類(lèi)型&引用名=初始值;int&j=i;引用永遠(yuǎn)維系在一個(gè)目標(biāo)上intmain(){intintOne;int&rInt=intOne;intOne=5;cout<<"intOne:"<<intOne<<endl;cout<<"rInt:"<<rInt<<endl;cout<<"&intOne:"<<&intOne<<endl;cout<<"&rInt:"<<&rInt<<endl;intintTwo=8;rInt=intTwo;cout<<"intOne:"<<intOne<<endl;cout<<"intTwo:"<<intTwo<<endl;cout<<"rInt:"<<rInt<<endl;cout<<"&intOne:"<<&intOne<<endl;cout<<"&intTwo:"<<&intTwo<<endl;cout<<"&rInt:"<<&rInt<<endl;}intOne:5rInt:5&intOne:0018FF44&rInt:0018FF44intOne:8intTwo:8rInt:8&intOne:0018FF44&intTwo:0018FF3C&rInt:0018FF442.引用的定義數(shù)據(jù)類(lèi)型&引用名=初始值;int&j=i;初始化目標(biāo)類(lèi)型必須與引用的數(shù)據(jù)類(lèi)型一致或可以轉(zhuǎn)化成引用的數(shù)據(jù)類(lèi)型。inti;int&j=i;int&j=1;double&rr=1;doubletemp;temp=double(1);double&rr=temp;
指針變量的引用int*a;int*&p=a;//p是int*的引用,p是a的別名p=&i;a=&i;2.引用的定義數(shù)據(jù)類(lèi)型&引用名=初始值;int&j=i;不能引用void型(包括指針)void&i;×void*&p=q;×不能建立引用數(shù)組inta[10];int&b[10]=a;×
數(shù)組占用連續(xù)的內(nèi)存空間,而引用不占內(nèi)存沒(méi)有引用的引用,也沒(méi)有引用的指針inta;int&ra=a;int&rr=ra;×int*p=ra;×
引用不占內(nèi)存,不屬于數(shù)據(jù)類(lèi)型,所以無(wú)法引用,也無(wú)法被指向3.用引用傳遞函數(shù)參數(shù)用引用可以實(shí)現(xiàn)C中地址傳送的功能,而且比地址(指針)傳遞更簡(jiǎn)單和易于理解。intmain(){inta=5,b=10;voidswap(int&,int&);swap(a,b);printf(“a=%d,b=%d\n”,a,b);return0;}voidswap(int&x,int&y){intt;t=x;x=y;y=t;}main()swap()5a:10b:t:5105x:a:y:b:a:b:3.用引用傳遞函數(shù)參數(shù)注意重載函數(shù)voidfn(int){…}voidfn(int&){…}intmain(){inta=10;fn(a);//產(chǎn)生歧義,系統(tǒng)無(wú)法確定調(diào)用哪個(gè)fn()}3.用引用傳遞函數(shù)參數(shù)引用與指針一樣,可以返回多個(gè)值boolFactor(intn,int&rSquared,int&rCubed){if(n>20||n<0)returnfalse;rSquared=n*n;rCubed=n*n*n;returntrue;}intmain(){intnumber,squared,cubed;boolerror;cout<<"Enteranumber(0~20):";cin>>number;error=Factor(number,squared,cubed);if(!error)cout<<"Errorencountered!\n";else{cout<<"Number:"<<number<<endl;cout<<"Squared:"<<squared<<endl;cout<<"Cubed:"<<cubed<<endl;}return0;}Enteranumber(0~20):15Number:15Squared:225Cubed:3375Enteranumber(0~20):45Errorencountered!4.返回引用與返回值函數(shù)返回值,生成一個(gè)副本函數(shù)返回引用,不生成副本floattemp;floatfn1(floatr){temp=r*r*3.14;returntemp;}float&fn2(floatr){temp=r*r*3.14;returntemp;}intmain(){floata=fn1(5.0);//1:變量接收返回值float&b=fn1(5.0);//2:引用接收返回值
floatc=fn2(5.0);//3:變量接收返回引用float&d=fn2(5.0);//4:引用接收返引用cout<<a<<endl;cout<<b<<endl;cout<<c<<endl;cout<<d<<endl;return0;}4.返回引用與返回值1:變量接收返回值(正確,產(chǎn)生副本)floatfn1(floatr){temp=r*r*3.14;returntemp;}floata=fn1(5.0);main()fn1()78.5a:5.0r:78.5temp:78.5棧全局?jǐn)?shù)據(jù)臨時(shí):4.返回引用與返回值2:引用接收返回值(隱含錯(cuò)誤)floatfn1(floatr){temp=r*r*3.14;returntemp;}float&b=fn1(5.0);main()fn1()b:5.0r:78.5temp:78.5棧全局?jǐn)?shù)據(jù)臨時(shí):4.返回引用與返回值3:變量接收返回引用(正確,不產(chǎn)生副本)float&fn2(floatr){temp=r*r*3.14;returntemp;}floatc=fn2(5.0);main()fn2()78.5c:5.0r:temp:78.5棧全局?jǐn)?shù)據(jù)4.返回引用與返回值4:引用接收返引用(不產(chǎn)生副本,容易錯(cuò)誤,temp為自動(dòng)變量時(shí)出錯(cuò))float&fn2(floatr){temp=r*r*3.14;returntemp;}float&d=fn2(5.0);main()fn2()b:5.0r:temp:78.5棧全局?jǐn)?shù)據(jù)5.函數(shù)調(diào)用作為左值函數(shù)返回值是引用可以使函數(shù)成為左值float&fun(intindex,floata[]){float&r=a[index];returnr;}floattest[]={3.5,5.4,5.5};fun(1,test)=4.5;<=>test[1]=4.5與指針一樣,當(dāng)函數(shù)返回引用時(shí),注意避免產(chǎn)生懸掛引用。5.函數(shù)調(diào)用作為左值普通寫(xiě)法intarray[6][4]={{60,80,90,75},{75,85,65,77},{80,88,90,98},{89,100,78,81},{62,68,69,75},{85,85,77,91}};intgetLevel(intgrade[],intsize){intsum=0;for(inti=0;i<size;i++)sum+=grade[i];sum/=size;//平均分
if(sum>=80)return1;//typeAstudentelsereturn0;//typeBstudent}intmain(){inttypeA=0,typeB=0;intstudent=6;intgradesize=4;for(inti=0;i<student;i++)//處理所有的學(xué)生
if(getLevel(array[i],gradesize))typeA++;elsetypeB++;cout<<"numberoftypeAis"<<typeA<<endl;cout<<"numberoftypeBis"<<typeB<<endl;return0;}5.函數(shù)調(diào)用作為左值函數(shù)成為左值intarray[6][4]={{60,80,90,75},{75,85,65,77},{80,88,90,98},{89,100,78,81},{62,68,69,75},{85,85,77,91}};int&level(intgrade[],intsize,int&tA,int&tB){intsum=0;for(inti=0;i<size;i++)sum+=grade[i];sum/=size;//平均分
if(sum>=80)returntA;//typeAstudentelsereturntB;//typeBstudent}intmain(){inttypeA=0,typeB=0;intstudent=6;intgradesize=4;for(inti=0;i<student;i++)//處理所有的學(xué)生
level(array[i],gradesize,typeA,typeB)++;//函數(shù)作左值cout<<"numberoftypeAis"<<typeA<<endl;cout<<"numberoftypeBis"<<typeB<<endl;return0;}6.用const限定引用當(dāng)函數(shù)需傳遞的實(shí)參是很大的數(shù)據(jù)類(lèi)型時(shí)(數(shù)組、結(jié)構(gòu)體),參數(shù)傳遞采用指針或引用。但是,采用指針和引用就存在修改實(shí)參的風(fēng)險(xiǎn)。因此,用const來(lái)限定引用或指針作為函數(shù)的形參,以保證實(shí)參不被修改。voidfn(constint&a);voidfn(constint*p);6.用const限定引用C++不區(qū)分變量的const引用還是常量的const引用,因?yàn)橐每偸莄onst的,不允許對(duì)引用賦值不需要constdoubleconst&a=1;只需constdouble&a=1;a=2;×對(duì)比constdoubleconst*p=&i;p=&j;×7.堆中變量的引用不能直接引用堆空間,必須借助指針int*p=newint;if(p==NUULL){cout<<"Nomemory!\n";return1;}int&r=*p;int*p=newint[30];if(p==NUULL){cout<<"Nomemory!\n";return1;}int*&r=p;用堆空間初始化引用,既可以用指針釋放,也可以用引用釋放堆空間。deletep;<==>delete&r;2.2.6程序結(jié)構(gòu)程序=算法+數(shù)據(jù)結(jié)構(gòu)—算法與數(shù)據(jù)結(jié)構(gòu)是一個(gè)整體
封裝和信息隱藏是面向?qū)ο蟮幕疽亍K惴偸请x不開(kāi)數(shù)據(jù)結(jié)構(gòu),算法含有對(duì)數(shù)據(jù)結(jié)構(gòu)的訪問(wèn),算法只能適用于特定數(shù)據(jù)結(jié)構(gòu)。程序={(類(lèi))}={(算法+數(shù)據(jù)結(jié)構(gòu))}—數(shù)據(jù)結(jié)構(gòu)與算法分離。
軟件系統(tǒng)的規(guī)模越來(lái)越大,復(fù)雜性不斷增長(zhǎng),以致不得不對(duì)“關(guān)鍵數(shù)據(jù)結(jié)構(gòu)”重新評(píng)價(jià)。
數(shù)據(jù)結(jié)構(gòu)的主要欠缺是應(yīng)用
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 有關(guān)管理專(zhuān)業(yè)實(shí)習(xí)報(bào)告
- 綠教學(xué)反思15篇
- 感恩節(jié)大學(xué)活動(dòng)策劃6篇
- 在人間八年級(jí)品讀心得(3篇)
- 五年級(jí)下冊(cè)16課課件
- 嚴(yán)蔚敏版數(shù)據(jù)結(jié)構(gòu)課后習(xí)題答案-完整版
- 《大雁南飛》教學(xué)設(shè)計(jì)(小學(xué)環(huán)境教育)
- 2021中小學(xué)節(jié)約糧食反對(duì)浪費(fèi)工作實(shí)施方案(完整版)
- 全國(guó)2015年10月自學(xué)考試03298創(chuàng)新思維理論與方法試題答案
- 新入員工安全培訓(xùn)試題及答案培優(yōu)A卷
- 小學(xué)數(shù)學(xué)《比的認(rèn)識(shí)單元復(fù)習(xí)課》教學(xué)設(shè)計(jì)(課例)
- 影視培訓(xùn)網(wǎng)上課程設(shè)計(jì)
- “小金庫(kù)”專(zhuān)項(xiàng)治理工作實(shí)施方案
- 新辦藥品零售企業(yè)質(zhì)量管理制度
- 投資策略及風(fēng)險(xiǎn)評(píng)估指南
- 代理過(guò)賬合作協(xié)議書(shū)范文
- 2024年國(guó)家二級(jí)注冊(cè)消防工程師資格考試專(zhuān)業(yè)基礎(chǔ)知識(shí)復(fù)習(xí)題庫(kù)及答案(共312題)
- 2023-2024學(xué)年山東名??荚嚶?lián)盟高三下學(xué)期二模英語(yǔ)試題(解析版)
- (正式版)SHT 3225-2024 石油化工安全儀表系統(tǒng)安全完整性等級(jí)設(shè)計(jì)規(guī)范
- 八年級(jí)上冊(cè)美術(shù)-5《中國(guó)山水畫(huà)》【課件】
- 浙江省基礎(chǔ)教育地方課程(通用內(nèi)容)標(biāo)準(zhǔn)1-9年級(jí)
評(píng)論
0/150
提交評(píng)論