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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

面向?qū)ο蟪绦蛟O(shè)計(C++)OrientedObjectProgramming(C++)主講:嚴冬梅第2章在較小范圍內(nèi)增強C第2章在較小范圍內(nèi)如何將C++增強C2.1數(shù)據(jù)類型2.2I/O流控制2.3運算2.4函數(shù)2.5引用2.6程序結(jié)構(gòu)2.7其他附錄2.1基本數(shù)據(jù)類型布爾類型bool字符型char數(shù)據(jù)類型整型int雙精度型double浮點型(單精度型)float基本數(shù)據(jù)類型聯(lián)合體union構(gòu)造數(shù)據(jù)類型數(shù)組結(jié)構(gòu)體struct枚舉特殊類型

2.1.1

數(shù)據(jù)類型的分類空值類型void引用類型:reference指針類型:pointer雙字符型wchar_t類class2.1數(shù)據(jù)類型2.1.2常用基本數(shù)據(jù)類型的取值范圍類型長度取值范圍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ù)類型2.1.3

布爾型bool表示范圍僅含整數(shù)0和1,也可以表示成true和false,相當(dāng)于:

enumbool{false,true};因為條件表達式、邏輯運算的結(jié)果都是0或1,所以,相當(dāng)大數(shù)量的表達式的值與布爾型對應(yīng)。用任何非0整數(shù)給bool型變量賦值時,其值都是1,甚至非整數(shù)的其它類型,只要非0,其值也都是1。

boola=3,b=1;//a=1,b=1boolc=a+b,d=a-b;//c=1,d=02.1數(shù)據(jù)類型2.2.4const說明符在說明中根據(jù)不同情況,const的位置略有不同。使用const定義的常量,用來替代符號常量優(yōu)點:不再是字符串,具有數(shù)據(jù)類型;在內(nèi)存中占有空間;在執(zhí)行語句中使用同變量一樣,只是不能做左值。定義const[數(shù)據(jù)類型]常量名=初值;constdoublePI=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.2I/O流控制標(biāo)準輸入輸出流C++中輸入/輸出流(一般叫iostreams或streams)提供了C的stdio.h庫中的所有功能。輸入/輸出流用作將具有類型的對象轉(zhuǎn)換成可讀的正文,反之亦然。流能讀寫二進制數(shù)據(jù)。C++程序以四個預(yù)定義的流開始,它們是:

cin標(biāo)準輸入

cout標(biāo)準輸出

cerr標(biāo)準錯

clog緩沖的cerr2.2.2I/O流控制標(biāo)準輸入輸出流標(biāo)準輸出流cout格式:cout<<輸出序列<<輸出序列<<……;輸出序列有以下幾種:

字符串原樣輸出

格式控制用來說明后面的輸出數(shù)據(jù)的格式

變量或表達式輸出變量或表達式值

cout<<“a=“<<a<<“,b=“<<b<<“,sum=“<<a+b;

輸出結(jié)果:a=10,b=20,sum=302.2.2I/O流控制標(biāo)準輸入輸出流標(biāo)準輸入流cin格式: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.2I/O流控制注意1.輸入一般不要求格式2.輸入流能自動跳過空白字符chara,b,c;cin>>a>>b>>c;3.字符串輸入避免溢出,可采取以下方法:

chararray[SIZE];cin.width(sizeof(array));cin>>array;//自動讀取SIZE-1個字符

2.2.2I/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.2I/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)【例2.1】I/O流格式#include<iomanip>#include<iostream>usingnamespacestd;intmain(){inta=21;cout<<"dec:"<<a<<endl;//默認以十進制形式輸出acout<<"hex:"<<hex<<a<<endl;//以十六進制形式輸出acout<<"oct:"<<oct<<a<<endl;//以八進制形式輸出achar*pt="China";//pt指向字符串”china”cout<<setw(10)<<pt<<endl;//輸出字符串

cout<<setfill('*')<<setw(10)<<pt<<endl;//輸出字符串

doublepi=22.0/7.0*100;//計算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運算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.2】創(chuàng)建、銷毀一維數(shù)組#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運算#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)建、銷毀二維數(shù)組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;

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)用之前聲明或定義。因為內(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;

}

intmain()

{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>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;

}運行結(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=1,intc=3);√當(dāng)調(diào)用參數(shù)時只能向左匹配參數(shù)(靠右面的默認參數(shù)先有效)。

voidfun(inta=1,intb=2,intc=3);

fun(5,10);->a=5,b=10,c=32.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)。引用就是給另一個變量或?qū)ο笃鹨粋€別名(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.引用的定義數(shù)據(jù)類型&引用名=初始值;int&j=i;

引用不是值,不占內(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.引用的定義數(shù)據(jù)類型&引用名=初始值;int&j=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;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ù)類型&引用名=初始值;int&j=i;初始化目標(biāo)類型必須與引用的數(shù)據(jù)類型一致或可以轉(zhuǎn)化成引用的數(shù)據(jù)類型。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ù)類型&引用名=初始值;int&j=i;不能引用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;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ù)返回值,生成一個副本函數(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棧全局數(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)用作為左值普通寫法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ù)據(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ū)ο蟮幕疽亍K惴偸请x不開數(shù)據(jù)結(jié)構(gòu),算法含有對數(shù)據(jù)結(jié)構(gòu)的訪問,算法只能適用于特定數(shù)據(jù)結(jié)構(gòu)。程序={(類)}={(算法+數(shù)據(jù)結(jié)構(gòu))}—數(shù)據(jù)結(jié)構(gòu)與算法分離。

軟件系統(tǒng)的規(guī)模越來越大,復(fù)雜性不斷增長,以致不得不對“關(guān)鍵數(shù)據(jù)結(jié)構(gòu)”重新評價。

數(shù)據(jù)結(jié)構(gòu)的主要欠缺是應(yīng)用

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論