




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
主講:嚴冬梅第2章在較小范圍內(nèi)增強C面向?qū)ο蟪绦蛟O(shè)計(C++)OrientedObjectProgramming(C++)第2章在較小范圍內(nèi)增強C2.1數(shù)據(jù)類型2.2標(biāo)準(zhǔn)I/O流2.3運算2.4函數(shù)2.5引用2.6程序結(jié)構(gòu)2.7其他附錄2.1數(shù)據(jù)類型空值類型void字符型數(shù)據(jù)類型整型int雙精度型double單精度型float基本數(shù)據(jù)類型聯(lián)合體union構(gòu)造數(shù)據(jù)類型數(shù)組結(jié)構(gòu)體struct枚舉
C++數(shù)據(jù)類型特殊類型——指針(pointer)
*單字符型char雙字符型wchar_t布爾型bool實型類class非基本數(shù)據(jù)類型2.1數(shù)據(jù)類型2.1.2常用基本數(shù)據(jù)類型的取值范圍類型長度取值范圍bool1字節(jié)false、truechar8位(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~float32位(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ù)類型2.1.3
布爾型bool表示范圍僅含整數(shù)0和1,也可以表示成false和true,相當(dāng)于:
enumbool{false,true};因為關(guān)系運算、邏輯運算的結(jié)果都是0或1,所以,所以布爾型多用來進行條件判斷。boolfound=false;……if(!found){……}boolisPrime(intn);……if(isPrime(n)){……}2.1數(shù)據(jù)類型2.1.3
布爾型bool用任何非0整數(shù)給bool型變量賦值時,其值都是1甚至非整數(shù)的其它類型,只要非0,其值也都是1。
boola=3,b=1;//a=1,b=1
boolc=a+b,d=a-b;//c=1,d=0
boola=3.5;需要注意窄化類型轉(zhuǎn)換,可以這樣避免
boola{3.5};//某些編譯器Error
boola={3.5};//某些編譯器Error這些都盡量少用!2.1數(shù)據(jù)類型2.2.4const說明符在說明中根據(jù)不同情況,const的位置略有不同。使用const定義的常量,用來替代符號常量優(yōu)點:不再是字符串,具有數(shù)據(jù)類型;在內(nèi)存中占有空間;在執(zhí)行語句中使用同變量一樣,只是不能做左值。定義
const[數(shù)據(jù)類型]常量名=初值;const
doublePI=3.1415926;constintSIZE=100;注意常量必須初始化;數(shù)據(jù)類型與變量的含義相同,缺省時為int。常量同樣有全局和局部之分。常量可以定義在頭文件中。2.2.1數(shù)據(jù)類型
指向常量的指針
const
數(shù)據(jù)類型*指針名;
指針類型前加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ù)類型指針常量數(shù)據(jù)類型*const
指針名;
指針名前加const,int*constp;p是常量,是指向整型數(shù)據(jù)的指針常量,意味著p不能改變,但是*p可以改變。即p=##;×*p=##;√定義指針常量時必須初始化,初始化值是字符串常量的地址。0067:f60010變量i0067:f6000067:fd66常量pinti=10,j=20;int*constp=&i;*p=j;2020變量j0067:f7002.2.1數(shù)據(jù)類型
指向常量的指針常量
const
數(shù)據(jù)類型*const
指針名;
指針類型和指針名前均加const
constint*constp;
p是指針常量,是指向整型常量的指針常量,意味著p不能改變,*p也不能改變。即p=##;×*p=##;×0067:f600100067:f6000067:fd66常量p常量iconstinti=10;constint*constp=&i;2.2.1數(shù)據(jù)類型
用const修飾形式參數(shù)
voidfunc(conststructstudent*s){}
雖然以指針方式傳遞一個結(jié)構(gòu)體指針,但對源數(shù)據(jù)不能做修改。用const修飾成員函數(shù)表示該成員函數(shù)不可以改變對象屬性值。
intgetAge()const;2.2.2標(biāo)準(zhǔn)I/O流標(biāo)準(zhǔn)輸入輸出流C++中輸入/輸出流(一般為iostreams或streams)提供了類似C的stdio.h庫中的所有功能。C++編譯系統(tǒng)提供的頭文件標(biāo)準(zhǔn)C++庫文件#include<iostream>標(biāo)準(zhǔn)C庫頭文件#include<cmath>2.2.2標(biāo)準(zhǔn)I/O流標(biāo)準(zhǔn)輸入輸出流名空間一個軟件往往由多個模塊組合而成,其中包括由不同的程序員開發(fā)的組件及類庫提供的組件,這樣不同模塊間在對標(biāo)識符命名時就有可能發(fā)生命名沖突,簡單地說,就是在不同的模塊中使用相同名字表示不同的事物,這樣當(dāng)然會引起程序出錯。C++提供名字空間來防止命名的沖突。#include<iostream>usingnamespacestd;2.2.2標(biāo)準(zhǔn)I/O流【例2.1】關(guān)于名空間#include<iostream>usingnamespace
std;//usingstd::cout;namespacens1{intnum=10;}namespacens2{intnum=20;}usingnamespacens1;//usingnamespacens2;intmain(){ cout<<num;
return0;}2.2.2標(biāo)準(zhǔn)I/O流標(biāo)準(zhǔn)輸入輸出流輸入/輸出流用作將具有類型的對象轉(zhuǎn)換成可讀的正文,反之亦然。流能讀寫二進制數(shù)據(jù)。C++程序以四個預(yù)定義的流開始,它們是:
cin標(biāo)準(zhǔn)輸入
cout標(biāo)準(zhǔn)輸出
cerr標(biāo)準(zhǔn)錯
clog緩沖的cerr2.2.2標(biāo)準(zhǔn)I/O流標(biāo)準(zhǔn)輸入輸出流標(biāo)準(zhǔn)輸出流cout功能:將數(shù)據(jù)插入到輸出流對象(裝配流水線)中格式:cout<<表達式1<<表達式2
<<……;輸出序列有以下幾種:
字符串原樣輸出
格式控制用來說明后面的輸出數(shù)據(jù)的格式
變量或表達式輸出變量或表達式值cout<<"a="<<a<<",b="<<b<<",sum="<<a+b;
輸出結(jié)果:a=10,b=20,sum=302.2.2標(biāo)準(zhǔn)I/O流標(biāo)準(zhǔn)輸入輸出流標(biāo)準(zhǔn)輸入流cin從輸入流對象(生產(chǎn)流水線)中提取數(shù)據(jù)
格式:cin>>變量1>>變量2>>……;
輸入的數(shù)據(jù)以回車鍵結(jié)束
當(dāng)連續(xù)輸入多個變量時,輸入數(shù)據(jù)可以用空白字符隔開,例如:cin>>a>>b;
輸入的數(shù)據(jù)可以是1020↙輸入的數(shù)據(jù)可以是10 20↙輸入的數(shù)據(jù)可以是10↙20↙2.2.2標(biāo)準(zhǔn)I/O流注意1.輸入一般不要求格式2.輸入流能自動跳過空白字符chara,b,c;cin>>a>>b>>c;3.字符串輸入避免溢出,可采取以下方法:
chararray[SIZE];cin.width(sizeof(array));cin>>array;//自動讀取SIZE-1個字符
2.2.2標(biāo)準(zhǔn)I/O流使用控制符#include<iomanip>控制符描述dec置基數(shù)為10hex置基數(shù)為16oct置基數(shù)為8setfill(c)設(shè)填充字符為csetprecision(n)設(shè)顯示小數(shù)精度為nsetw(n)設(shè)域?qū)挒閚個字符setiosflags(ios::fixed)固定的浮點表示setiosflags(ios::scientific)指數(shù)表示setiosflags(ios::left)左對齊setiosflags(ios::right)右對齊setiosflags(ios::skipws)忽略前導(dǎo)空白setiosflags(ios::showpoint)強制顯示小數(shù)部分setiosflags(ios::showpos)強制顯示正數(shù)的符號2.2.2標(biāo)準(zhǔn)I/O流2.4.2
使用控制符常用的格式控制通用的輸出數(shù)據(jù)寬度setw(n)填充字符setfill(c)對齊方式setiosflags(ios::left)setiosflags(ios::right)整數(shù)進制dechexoct實數(shù)小數(shù)位數(shù)setprecision(n)setiosflags(ios::fixed)指數(shù)表示法setiosflags(ios::scientific)必須顯示小數(shù)位setiosflags(ios::showpoint)字符串忽略前導(dǎo)空白setiosflags(ios::skipws)#include<iomanip>#include<iostream>usingnamespacestd;intmain(){intn=21;cout<<"dec:"<<n<<endl;//默認以十進制形式輸出ncout<<"hex:"<<hex<<n<<endl;//以十六進制形式輸出ncout<<"oct:"<<oct<<n<<endl;//以八進制形式輸出nchar*pt="China";//pt指向字符串"china"cout<<setw(10)<<pt<<endl;//輸出字符串
cout<<setfill('*')<<setw(10)<<pt<<endl;//填充*輸出字符串
doublea=22.0/7.0*100;cout<<setprecision(2)<<setiosflags(ios::scientific)<<setw(16)<<a<<endl;//指數(shù)形式輸出acout<<setprecision(6)<<setw(16)<<a<<endl;cout<<setiosflags(ios::fixed)<<setiosflags(ios::showpos)<<setprecision(6)<<setw(16)<<a<<endl;
return0;}【例2.2】標(biāo)準(zhǔn)I/O流格式2.2.3運算2.3.1new和delete
在任何一個變量使用前,都必須完成關(guān)于存儲方面的有關(guān)安排:存放位置、占據(jù)多少存儲單元。這個工作叫內(nèi)存分配。編譯時分配內(nèi)存是靜態(tài)內(nèi)存分配運行時分配內(nèi)存是動態(tài)內(nèi)存分配堆內(nèi)存——動態(tài)內(nèi)存(在運行時申請內(nèi)存)用戶內(nèi)存:代碼區(qū)、全局數(shù)據(jù)區(qū)、棧區(qū)、堆。2.2.3運算2.3.1new和delete創(chuàng)建、銷毀一變量
new
數(shù)據(jù)類型(初始值);
delete
指針名;int*p;p=newint;deletep;創(chuàng)建、銷毀一數(shù)組
new
數(shù)據(jù)類型[長度];
delete[]指針名;int*p;p=newint[30];delete[]p;2.2.3運算說明
new分配堆內(nèi)存,比malloc()更簡練。
new的操作數(shù)為數(shù)據(jù)類型,它可以帶初始化值表或單元個數(shù)。new返回一個具有操作數(shù)的數(shù)據(jù)類型的指針。
new和delete是C++專有的操作符,它們不用頭文件聲明。
delete類似于free(),釋放堆內(nèi)存。
由于堆對象的生存期是從創(chuàng)建對象到銷毀或程序結(jié)束,因此,刪除不再需要的堆對象是一個必須進行的工作。
(最重要的)new和delete在創(chuàng)建/釋放類對象時可以自動進行對象的構(gòu)造和銷毀2.2.3運算【例2.3】創(chuàng)建、銷毀一維數(shù)組#include<iomanip>#include<iostream>usingnamespacestd;intmain(){inti,n,*data;floatsum=0,avg;cout<<"請輸入元素個數(shù):";cin>>n;
data=newint[n];cout<<"請輸入"<<n<<"個整數(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運算【例2.4】創(chuàng)建、銷毀二維數(shù)組#include<iomanip>#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";}for(i=0;i<m;i++)delete[]p[i];delete[]p;return0;}2.2.3運算
2.3.2
作用域限定運算符
::——表示全局變量
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ù)也稱內(nèi)嵌函數(shù)
使用關(guān)鍵字inline說明的函數(shù)是內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)函數(shù)的作用相當(dāng)于帶參數(shù)的宏,就是將“函數(shù)調(diào)用”變成代碼替換。
程序編譯前,系統(tǒng)自動將內(nèi)聯(lián)函數(shù)進行代碼替換(系統(tǒng)會自動優(yōu)化代碼)2.2.4函數(shù)使用內(nèi)聯(lián)函數(shù)的意義凡是有內(nèi)聯(lián)函數(shù)調(diào)用的地方就會有代碼替換,即內(nèi)聯(lián)函數(shù)增加了代碼空間,增加了編譯時間采用一般函數(shù)調(diào)用,需要建立環(huán)境棧存儲參數(shù)、返回地址等,并且產(chǎn)生程序執(zhí)行轉(zhuǎn)移,需要時間開銷,因此,調(diào)用n次就會增加n次時間開銷。編譯只進行一次,但可運行多次,因此使用內(nèi)聯(lián)函數(shù)雖增加了編譯時間,但減少了程序執(zhí)行時間(函數(shù)調(dià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;}
對于isnumber這樣簡單的函數(shù),使用函數(shù)調(diào)用的方法(特別是多次調(diào)用)將大大降低運行效率,可以采用if(c>='0'&&c<='9')表達式替換的方法。但是,手工替換很煩瑣,最好讓編譯程序去做。內(nèi)聯(lián)函數(shù)是程序行的擴展,主要是解決程序的運行效率。2.2.4函數(shù)
內(nèi)聯(lián)函數(shù)的使用(1)在函數(shù)聲明和定義的最前面加關(guān)鍵字inline
在函數(shù)聲明時必須有inline,定義時可有可無。intmain(){charc;
inline
intisnumber(char);……}inline
intisnumber(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)用之前聲明或定義。因為內(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)控制語句,否則,編譯時將該函數(shù)視同普通函數(shù)那樣產(chǎn)生函數(shù)調(diào)用代碼。遞歸函數(shù)是不能被用來做內(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ù)的必要性
在不同類型上作相同運算而又用相同名字的情況,稱為重載。intadd(intx,
inty)
{inttemp;temp=x+y;returntemp;
}
doubleadd(doublex,
doubley)
{doubletemp;temp=x+y;returntemp;
}
int
main()
{inta=4,b=5;doublex=12.5,y=75.75;
cout<<add(a,b)<<"\t"<<add(x,y)<<endl;
return0;
}運行結(jié)果為:
9 88.252.2.4函數(shù)
使用重載函數(shù)的必要性使用不同數(shù)目的參數(shù)#include<iostream>using
namespacestd;
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;
}運行結(jié)果為:
50
10002.2.4函數(shù)使用說明(1)重載函數(shù)僅僅是返回類型不同是不夠的
重載函數(shù)至少在參數(shù)個數(shù)、參數(shù)類型或參數(shù)順序上有所不同(2)不能用typedef定義的類型名來區(qū)分重載函數(shù)聲明中的參數(shù)(3)重載函數(shù)應(yīng)該具有相同的功能
通過名字粉碎來區(qū)分重載函數(shù)2.2.4函數(shù)
匹配重載函數(shù)的順序只要參數(shù)表互不相同,C++就會根據(jù)所給參數(shù)調(diào)用正確的函數(shù)。(1)尋找一個嚴格的匹配(2)通過內(nèi)部轉(zhuǎn)換尋求一個匹配(3)通過用戶定義的轉(zhuǎn)換尋求一個匹配2.2.4函數(shù)3.默認參數(shù)默認參數(shù)的目的調(diào)用某函數(shù)時傳遞的參數(shù)經(jīng)常是同一值,則可使用默認參數(shù),即調(diào)用函數(shù)時不給出實參,而是直接取默認值。默認參數(shù)的聲明若有函數(shù)聲明,則在聲明中默認參數(shù),不能寫在定義中;若無函數(shù)聲明,則在定義中默認參數(shù)。2.2.4函數(shù)默認參數(shù)的順序規(guī)定默認參數(shù)應(yīng)從右至左逐漸定義。
voidfun(inta=1,intb,intc=3);×
voidfun(inta,intb=2,intc=3);√當(dāng)調(diào)用函數(shù)時,實參從左匹配參數(shù)(默認參數(shù)靠右面的先有效)。
voidfun(inta=1,intb=2,intc=3);fun();=>a=1,b=2,c=3fun(5);=>a=5,b=2,c=3
fun(5,10);=>a=5,b=10,c=3fun(5,10,15);=>a=5,b=10,c=152.2.4函數(shù)默認參數(shù)與函數(shù)重載默認參數(shù)可以將一系列重載函數(shù)合成一個為函數(shù),但由于必須從右至左定義,并向左匹配參數(shù),因此它沒有重載函數(shù)靈活,而且數(shù)據(jù)類型也有限制。intInitDate(inty=1972,intm=3,intd=26);默認值的限定默認值可為全局變量、全局常量和函數(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ù)值傳遞到新分配的內(nèi)存中。它的優(yōu)點是有效避免函數(shù)的副作用。問題如果要求改變實參的值,怎么辦呢?如果實參是一個復(fù)雜的對象,重新分配內(nèi)存會引起程序執(zhí)行效率大大下降,怎么辦呢?有一種導(dǎo)出型數(shù)據(jù)類型—引用(reference)。引用就是給另一個變量(對象、數(shù)組等)起一個別名(alias)。2.引用的定義數(shù)據(jù)類型&
引用名=初始值;引用在聲明時必須初始化inti;int&j=i;對引用的改變就是對引用變量的改變。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.引用的定義引用不是值,不占內(nèi)存。對引用取地址,返回的是引用目標(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.引用的定義引用永遠維系在一個目標(biāo)上【例2.5】引用的永遠維系#include<iostream>usingnamespacestd;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;
return0;}2.引用的定義初始化目標(biāo)類型必須與引用的數(shù)據(jù)類型一致或可以轉(zhuǎn)化成引用的數(shù)據(jù)類型。inti;int&j=i;在C++中,允許int&j=10;
inttemp;temp=int(10);int&j=temp;但是,在Devc++中,必須用constdouble&rr=10;
指針變量的引用int*a;int*&p=a;//p是int*的引用,p是a的別名p=&i;a=&i;2.引用的定義不能引用void型(包括指針)void&i;×void*&p=q;×不能建立引用數(shù)組inta[10];int&b[10]=a;×
數(shù)組占用連續(xù)的內(nèi)存空間,而引用不占內(nèi)存沒有引用的引用,也沒有引用的指針inta;int&ra=a;int&rr=ra;×int*p=ra;×
引用不占內(nèi)存,不屬于數(shù)據(jù)類型,所以無法引用,也無法被指向3.用引用傳遞函數(shù)參數(shù)用引用可以實現(xiàn)C中地址傳送的功能,而且比地址(指針)傳遞更簡單和易于理解。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)無法確定調(diào)用哪個fn()}3.用引用傳遞函數(shù)參數(shù)引用與指針一樣,可以返回多個值boolFactor(intn,int&rSquared,int&rCubed){if(n>20||n<0)returnfalse;rSquared=n*n;rCubed=n*n*n;returntrue;}intmain(){intnumber,squared,cubed;boolcorrect;cout<<"Inputanumber(0~20):";cin>>number;correct=Factor(number,squared,cubed);if(!correct)cout<<"Errorencountered!\n";else{cout<<"Number:"<<number<<endl;cout<<"Squared:"<<squared<<endl;cout<<"Cubed:"<<cubed<<endl;}return0;}Inputanumber(0~20):15Number:15Squared:225Cubed:3375Inputanumber(0~20):45Errorencountered!4.返回引用與返回值函數(shù)返回值,生成一個副本;函數(shù)返回引用,不生成副本【例2.6】函數(shù)返回值與返回引用#include<iostream>usingnamespacestd;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棧全局數(shù)據(jù)臨時:4.返回引用與返回值2:引用接收返回值(隱含錯誤)floatfn1(floatr){temp=r*r*3.14;returntemp;}float&b=fn1(5.0);main()fn1()b:5.0r:78.5temp:78.5棧全局數(shù)據(jù)臨時: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棧全局數(shù)據(jù)4.返回引用與返回值4:引用接收返引用(不產(chǎn)生副本,容易錯誤,temp為自動變量時出錯)float&fn2(floatr){temp=r*r*3.14;returntemp;}float&d=fn2(5.0);main()fn2()b:5.0r:temp:78.5棧全局數(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ù)返回引用時,注意避免產(chǎn)生懸掛引用。5.函數(shù)調(diào)用作為左值【例2.7】統(tǒng)計分數(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}};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)用作為左值【例2.8】統(tǒng)計分數(shù)普通寫法(函數(shù)調(diào)用成為左值)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ù)據(jù)類型時(數(shù)組、結(jié)構(gòu)體),參數(shù)傳遞采用指針或引用。但是,采用指針和引用就存在修改實參的風(fēng)險。因此,用const來限定引用或指針作為函數(shù)的形參,以保證實參不被修改。voidfn(constint&a);voidfn(constint*p);6.用const限定引用C++不區(qū)分變量的const引用還是常量的const引用,因為引用總是const的,不允許對引用賦值不需要constdoubleconst&a=1;只需constdouble&a=1;a=2;×對比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)是一個整體
封裝和信息隱藏是面向?qū)ο蟮幕疽?。算法總是離不開數(shù)據(jù)結(jié)構(gòu),算法含有對數(shù)據(jù)結(jié)構(gòu)的訪問,算法只能適用于特定數(shù)據(jù)結(jié)構(gòu)。程序={(類)、(函
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度股東向公司借款及還款計劃合同范本
- 廣東省2025年度勞動合同模板設(shè)計及印刷合同
- 二零二五年度反賄賂合規(guī)物語廉潔合作協(xié)議(金融科技)
- 旅行社與旅行社經(jīng)理2025年度經(jīng)營管理聘用合同
- 二零二五年度總經(jīng)理任期管理與考核協(xié)議合同
- 2025年度金融產(chǎn)品居間服務(wù)合作協(xié)議
- 2025年度短視頻演員跨界合作演藝活動合同
- 二零二五年度電子信息營業(yè)執(zhí)照及產(chǎn)品分銷權(quán)轉(zhuǎn)讓合同
- 2025年度駕校學(xué)員培訓(xùn)費分期支付合同
- 二零二五年度物業(yè)公司物業(yè)服務(wù)質(zhì)量監(jiān)督協(xié)議
- 中國女排演講ppt
- GB/T 12928-2008船用中低壓活塞空氣壓縮機
- 沖壓工藝及沖壓質(zhì)量
- PS 第7章-路徑和矢量圖形課件
- 立體構(gòu)成-線立體課件
- 住院總崗位職責(zé)
- 眼科常用藥課件
- 中藥封包療法課件
- 初中體育與健康人教7~9年級第7章 球類正面雙手墊球教學(xué)設(shè)計及教案
- 展示空間設(shè)計(案例)
- 急癥手術(shù)預(yù)見性護理
評論
0/150
提交評論