第2章在較小范圍內(nèi)如何將C++增強(qiáng)C_第1頁(yè)
第2章在較小范圍內(nèi)如何將C++增強(qiáng)C_第2頁(yè)
第2章在較小范圍內(nèi)如何將C++增強(qiáng)C_第3頁(yè)
第2章在較小范圍內(nèi)如何將C++增強(qiáng)C_第4頁(yè)
第2章在較小范圍內(nèi)如何將C++增強(qiáng)C_第5頁(yè)
已閱讀5頁(yè),還剩58頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論