版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第1章 C+的初步知識(shí)上學(xué)期是以C為藍(lán)本來(lái)講解,這學(xué)期需要增加一些C+的內(nèi)容,這是進(jìn)入C/C+程序設(shè)計(jì)II學(xué)習(xí)的前期準(zhǔn)備。1.1 從C到C+C語(yǔ)言是結(jié)構(gòu)化和模塊化的語(yǔ)言,它是面向過(guò)程的。能處理小規(guī)模的程序。但當(dāng)規(guī)模較大時(shí)會(huì)顯示出它的不足。為了解決這個(gè)軟件危機(jī),提出了面向?qū)ο蟮某绦蛟O(shè)計(jì)(object oriented programming,OOP)思想。C+保留了C語(yǔ)言原有的所有優(yōu)點(diǎn),增加了面向?qū)ο髾C(jī)制。所以C+也稱為“帶類的C”。C+對(duì)C的“增強(qiáng)”,表現(xiàn)在以下兩個(gè)方面:1、在原來(lái)面向過(guò)程的機(jī)制基礎(chǔ)上,對(duì)C語(yǔ)言的功能作了擴(kuò)充。(本章將介紹充分部分)2、增加了面向?qū)ο蟮臋C(jī)制。在面向?qū)ο蟮某绦蛟O(shè)計(jì)
2、中仍然要用到結(jié)構(gòu)化程序設(shè)計(jì)的知識(shí)。下面介紹C+對(duì)C的擴(kuò)充,及與C的差別所在。1.2 最簡(jiǎn)單的C+程序 C+程序在結(jié)構(gòu)上與C的差別如下: 1、 標(biāo)準(zhǔn)C+規(guī)定main函數(shù)聲明為int型,即此主函數(shù)帶回一個(gè)整型的函數(shù)值。程序如果正常執(zhí)行,則操作系統(tǒng)返回?cái)?shù)值0,否則返回?cái)?shù)值-1。2、 系統(tǒng)頭文件不帶后綴.h,如:#include3、 使用系統(tǒng)庫(kù)時(shí)要使用命名空間std。即使用using namespace std;,這句話的意思是使用命名空間std。C+標(biāo)準(zhǔn)庫(kù)中的類和函數(shù)是在命名空間std中聲明的,因此程序中如果需要用到C+標(biāo)準(zhǔn)庫(kù),就需要用using namespace std;來(lái)聲明,表示要用命名空間
3、std中的內(nèi)容。例1.1 最簡(jiǎn)單的只有輸出的程序#includeusing namespace std;int main()coutThis is a C+ programm.n; /cout是對(duì)象名,稱為輸出流對(duì)象?!啊笔遣迦脒\(yùn)算符return 0; /沒(méi)有此句會(huì)有警告。最好加上此句例1.2 最簡(jiǎn)單的有輸入的程序#includeusing namespace std;int main()int a,b,sum;cinab; /cin是輸入流對(duì)象?!啊笔翘崛∵\(yùn)算符sum=a+b;couta+b=sumendl;return 0; /沒(méi)有此句會(huì)有警告。最好加上此句例1.3 輸入二個(gè)數(shù)x和y,求兩
4、個(gè)數(shù)中的大者。(要求用函數(shù)實(shí)現(xiàn),學(xué)生練習(xí))例1.4 對(duì)學(xué)生信息進(jìn)行輸入也輸出。1)用結(jié)構(gòu)體實(shí)現(xiàn)#includeusing namespace std;struct Studentint num;int score;void input(struct Student *ps)cinps-num;cinps-score;void output(struct Student s)couts.numendl;couts.scorenum;cinscore;void output()coutnumendl;coutscoreendl;int main()struct Student s;s.input(
5、);s.output(); 數(shù)據(jù)與對(duì)數(shù)據(jù)的操作(函數(shù))是一個(gè)整體。類中的函數(shù)也是一個(gè)成員,叫著成員函數(shù)。數(shù)據(jù)成員被說(shuō)明為私有的,在類外是不能使用的。1.3 C+對(duì)C 的擴(kuò)充1.3.1 C+的輸入輸出在C+中是通過(guò)調(diào)用輸入輸出流庫(kù)中的流對(duì)象cin和cout實(shí)現(xiàn)的。流指的是來(lái)自設(shè)備或傳給設(shè)備的一個(gè)數(shù)據(jù)流。cout是輸出流對(duì)象的名字,cin是輸入流對(duì)象的名字。一、 輸入流與輸出流的基本操作cout語(yǔ)句的一般格式為:cout表達(dá)式1表達(dá)式2變量1變量2變量n;當(dāng)程序需要在屏幕上顯示輸出時(shí),可以使用插入操作符,向cout輸出流中插入字符。例如:cout,從cin輸人流中抽取字符。例如:int a;cin
6、a;。不管把什么基本數(shù)據(jù)類型的名字或值傳給流,它都能懂。例如,下面的程序是輸出字符串和整數(shù):#include using namespace std;int main() coutThis is a C+ program.endl; coutThis is a C+ program. endl; coutThis is ; couta C+ program. ; coutendl; cout2; coutabc;,也可以寫成:cina;cinb;cinccin能夠知道抽取的變量的類型,它將對(duì)a,b,c分別給出一個(gè)整型、浮點(diǎn)型和字符型數(shù)。二、輸入流與輸出流中使用控制符(第七章中詳細(xì)介紹,這里了解
7、就可以了)流的默認(rèn)格式輸出有時(shí)不能滿足特殊要求,如: double average=9.;coutaverageendl;希望顯示的是9.40,即保留兩位小數(shù),可是卻顯示了9.40007,默認(rèn)顯示6位有效位。 用控制符(manipulators)可以對(duì)I/O流的格式進(jìn)行控制??刂品窃陬^文件iomanip.h中定義的對(duì)象??梢灾苯訉⒖刂品迦肓髦小3S每刂品缦卤硭?。表1 IO流的常用控制符 控制符描 述DecHexOctsetfill(c)setprecision(n) setw(n) setiosflags(ios:fixed) setiosflags(ios:scientific) s
8、etiosflags(ios:left) setiosflags(ios:right) setiosflags(ios:skipws) setiosflags(ios:uppercase) setiosflags(ios:lowercase)置基數(shù)為10 置基數(shù)為16 置基數(shù)為8 設(shè)填充字符為c 設(shè)顯示小數(shù)精度為n位 設(shè)域?qū)挒閚個(gè)字符固定的浮點(diǎn)顯示 指數(shù)表示左對(duì)齊右對(duì)齊 忽略前導(dǎo)空白16進(jìn)制數(shù)大寫輸出 16進(jìn)制數(shù)小寫輸出使用控制符時(shí),要在程序的頭上加頭文件iomanip.h。#include#includeusing namespace std;int main()int i=100;cout
9、iendl;couthexiendl; double d=123.56;coutdendl; coutsetprecision(9)dendl;return 0;1.3.2 用const定義常變量在C語(yǔ)言中常用#define命令來(lái)定義符號(hào)常量,實(shí)際上,只是進(jìn)行字符置換,容易誤解。#includeusing namespace std;#define R 2+3int main()coutR*Rendl; /輸出結(jié)果是11,并不是25return 0; /沒(méi)有此句會(huì)有警告。最好加上此句下面看C+提供的const定義常變量的方法就避免這個(gè)問(wèn)題。#includeusing namespace std
10、;const int R=2+3;int main()coutR*Rendl; /輸出結(jié)果是25return 0; /沒(méi)有此句會(huì)有警告。最好加上此句1.3.3 函數(shù)原型聲明在C+中,如果函數(shù)調(diào)用的位置在函數(shù)定義之前,則要求在函數(shù)調(diào)用之前必須對(duì)所調(diào)用的函數(shù)作函數(shù)原型聲明,這是強(qiáng)制性的。如有定義:int max(int a,int b)return a+b;聲明時(shí)必須寫成: int max(int a,int b);或 int max(int x,int y);或 int max(int ,int);1.3.4 函數(shù)的重載1、為什么要用重載函數(shù)在C中,在同一作用域中不能有同名的函數(shù),每個(gè)函數(shù)必須有
11、其唯一的名字,這樣有時(shí)會(huì)令人生厭。例如,求一個(gè)數(shù)的絕對(duì)值,由于要求命名唯一,所以對(duì)于不同的類型需要不同名字的函數(shù):int abs(int);float fabs(float);long labs(long);double labs(double);極其相似操作函數(shù)我們卻起三個(gè)不同的名字,這樣子不是很好管理,所以C+為了方便程序員編寫程序特別引入了函數(shù)重載的概念來(lái)解決此問(wèn)題。C+允許在同一作用域用同一函數(shù)名定義多個(gè)函數(shù),這些函數(shù)的參數(shù)個(gè)數(shù)和參數(shù)類型不相同,這些同名的函數(shù)用來(lái)實(shí)現(xiàn)不同的功能。這就是函數(shù)的重載。重載是用來(lái)描述同名函數(shù)具有相同或者相似功能,但數(shù)據(jù)類型或者是參數(shù)不同的函數(shù)管理操作的稱呼。
12、同一個(gè)函數(shù)名可以用來(lái)代表不同功能的函數(shù),也就是一名多用。這幾個(gè)函數(shù)所做的事情是一樣的都是求絕對(duì)值。因此,使用三個(gè)不同的函數(shù)名,看上去很笨拙,若給以同樣的名字就會(huì)方便得多。這就是重載技術(shù)。這種技術(shù)在C+中早已用于基本數(shù)據(jù)類型運(yùn)算,如加法只有一個(gè)名字+, 但它可以用來(lái)加整數(shù)值、浮點(diǎn)值和指針值。插入運(yùn)算符“”既可以左移和右移也可以是輸入輸出運(yùn)算符。例如,上述4個(gè)函數(shù)的聲明可以改為:int abs(int); float abs(float);long abs(1ong);double abs(double);C+用一種函數(shù)命名技術(shù)可以準(zhǔn)確判斷出應(yīng)該使用哪個(gè)abs()函數(shù)。例如:abs(-10); /
13、調(diào)用int abs(int); abs(-); /調(diào)用longabs(1ong);abs(-12.23); /調(diào)用double abs(double);2、匹配重載函數(shù)的順序在調(diào)用一個(gè)重載函數(shù)f()時(shí),編譯器必須搞清函數(shù)名f究竟是指哪個(gè)函數(shù)。這是靠將實(shí)參類型和所有被調(diào)用的f()函數(shù)的形參類型一一比較來(lái)判定的。 按下述3個(gè)步驟的先后順序找到并調(diào)用那個(gè)函數(shù):(1)尋找一個(gè)嚴(yán)格的匹配,如果找到了,就用那個(gè)函數(shù)。(2)通過(guò)內(nèi)部轉(zhuǎn)換尋求一個(gè)匹配,只要找到了,就用那個(gè)函數(shù)。(3)通過(guò)用戶定義的轉(zhuǎn)換尋求一個(gè)匹配, 若能查出有唯一的一組轉(zhuǎn)換,就用那個(gè)函數(shù)例如,重載函數(shù)print()的匹配:void print
14、(double);void print(int);void func()print(1); /匹配void print(int);print(1.0); /匹配void print(double);print(a); /匹配void print(int);print(3.1415f); /匹配void print(double);例如,對(duì)于重載函數(shù)print()聲明,其下面的函數(shù)調(diào)用將引起錯(cuò)誤:void print(1ong);void print(double);void func(int a)print(a); /error:因?yàn)橛卸x性3、使用說(shuō)明(1)C+的函數(shù)如果在返回類型、參數(shù)類型
15、、參數(shù)個(gè)數(shù)、參數(shù)順序上有所不同,則認(rèn)為是不同的。但重載函數(shù)如果僅僅是返回類型不同,則是不夠的。例如,下面的聲明是錯(cuò)誤的:void func(int);int func(int);編譯器無(wú)法區(qū)分函數(shù)調(diào)用func(3)”是指上述哪一個(gè)重載函數(shù)。因此重載函數(shù)至少在參數(shù)個(gè)數(shù)、參數(shù)類型或參數(shù)順序上有所不同。(2)typedef定義的類型只能使之相同于一個(gè)已存在的類型,而不能建立新的類型,所以不能用typedef定義的類型名來(lái)區(qū)分重載函數(shù)聲明中的參數(shù)。例如,下面的代碼實(shí)際上是同一個(gè)函數(shù):typedef INT int;void func(int x)/.void func(INTx)/.) /error:
16、函數(shù)重復(fù)定義編譯器不能區(qū)分這兩個(gè)函數(shù)的差別,INT只不過(guò)是int的另一種稱呼而已;(3)讓重載執(zhí)行不同的功能, 是不好的編程風(fēng)格。同名函數(shù)應(yīng)該具有相同的功能。如果定義一個(gè)abs()函數(shù)而返回的卻是一個(gè)數(shù)的平方根, 該程序的可讀性受到破壞。P13例1.7 用一個(gè)函數(shù)求2個(gè)正整數(shù)或3個(gè)正整數(shù)的最大者。#includeusing namespace std;int max(int a,int b)return ab?a:b;int max(int a,int b,int c)return (ab?a:b)c?(ab?a:b):c;int main()int a,b,c;cinabc;coutmax(
17、a,b,c) max(a,b)endl;1.3.5 函數(shù)模板函數(shù)的重載可以實(shí)現(xiàn)一個(gè)函數(shù)名多用,將功能相同或類似的函數(shù)用同一個(gè)函數(shù)名來(lái)定義。這樣使編程者在調(diào)用同類函數(shù)時(shí)感到含義清楚,方法簡(jiǎn)單。但是在程序中仍然要分別定義每一個(gè)函數(shù)。例如:求3個(gè)數(shù)中最大的數(shù)(分別考慮整數(shù)、雙精度數(shù)、浮點(diǎn)數(shù)的情況)#includeusing namespace std;int main()int max(int a,int b,int c); double max(double a,double b,double c);float max(float a,float b,float c);int i1,i2,i3,i
18、;i1=10;i2=23;i3=13;i=max(i1,i2,i3);couti_max iendl;double d1,d2,d3,d;d1=23,5;d2=45;d3=56.4;d=max(d1,d2,d3);coutd_max dendl;float f1,f2,f3,f; f1=34.3;f2=65.4;f3=56.4;f=max(f1,f2,f3);coutf_max fendl;int max(int a,int b,int c)if(ab)a=b;if(ac)a=c;return a;double max(double a,double b,double c)if(ab)a=b;
19、if(ac)a=c;return a;float max(float a,float b,float c)if(ab)a=b;if(ac)a=c;return a;從上面的程序中可以看出,有3個(gè)max函數(shù)的函數(shù)體是完全相同的,只是形參的類型不同,也要分別定義,能否對(duì)此進(jìn)行簡(jiǎn)化呢?為了解決這個(gè)問(wèn)題,C+提供了函數(shù)模板。所謂函數(shù)模板就是建立一個(gè)通用函數(shù),其函數(shù)類型和形參類型不具體指定,用一個(gè)虛擬的類型來(lái)代表。這個(gè)通用函數(shù)就稱為函數(shù)模板。凡是函數(shù)體相同的函數(shù)都可以用這個(gè)模板來(lái)代替,不必定義多個(gè)函數(shù),只需在模板中定義一次即可。在調(diào)用函數(shù)時(shí)系統(tǒng)會(huì)根據(jù)實(shí)參的類型來(lái)取代模板中的虛擬類型,從而實(shí)現(xiàn)了不同函數(shù)的
20、功能。我們將上面的例子用函數(shù)模板來(lái)實(shí)現(xiàn)#includeusing namespace std;template /模板聲明,其中T為類型參數(shù),會(huì)有不同數(shù)據(jù)類型的地方, /以設(shè)定類型的變量替代。T max(T a,T b,T c) /定義一個(gè)通用函數(shù),用T作虛擬的類型名 if(ab) a=b; if(ac) a=c; return a;int main() int i1,i2,i3,i;i1=10;i2=23;i3=13;i=max(i1,i2,i3);couti_max iendl;double d1,d2,d3,d;d1=23,5;d2=45;d3=56.4;d=max(d1,d2,d3);
21、coutd_max dendl;float f1,f2,f3,f; f1=34.3;f2=65.4;f3=56.4;f=max(f1,f2,f3);coutf_max fendl;從上例可以看出,用函數(shù)模板比函數(shù)重載更為方便,程序簡(jiǎn)潔多了。但應(yīng)注意它只適用于函數(shù)體相同、函數(shù)的參數(shù)個(gè)數(shù)相同而類型不同的情況,如果參數(shù)的個(gè)數(shù)不同,則不能用函數(shù)模板。例:定義一個(gè)交換兩變量值的模板函數(shù),利用它來(lái)實(shí)現(xiàn)整數(shù)、浮點(diǎn)數(shù)、雙精度數(shù)、字符串的交換。(學(xué)生練習(xí))#include#includeusing namespace std;template /模板聲明,其中T為類型參數(shù)void swap(T* a,T* b)
22、 /定義一個(gè)通用函數(shù),用T作虛擬的類型名 T* temp; *temp=*a;*a=*b;*b=*temp;int main()int i1,i2;i1=10;i2=23;swap(i1,i2);couti1=i1 i2=i2endl;double d1,d2;d1=23,5;d2=45;swap(d1,d2);coutd1=d1 d2=d2endl;float f1,f2; f1=34.3;f2=65.4;swap(f1,f2);coutf1=f1 f2=f2endl;string s1,s2;s1=good;s2=better;swap(s1,s2);couts1=s1 s2=s2endl
23、;模板函數(shù)調(diào)用時(shí),類型實(shí)參與類型形參的匹配要求很苛刻。下面來(lái)看一個(gè)實(shí)例。#include#includeusing namespace std;template /模板聲明,其中T為類型參數(shù)void swap(T* a,T* b) /定義一個(gè)通用函數(shù),用T作虛擬的類型名 T* temp; *temp=*a;*a=*b;*b=*temp;void f(double a,double b)return;int main()int ia=3;double db=5.0; f(ia,db); /ok ia的類型與double不同,但可以隱式轉(zhuǎn)換為double,實(shí)現(xiàn)合法調(diào)用swap(ia,db); /e
24、rror ia與db的類型不同,不能統(tǒng)一到同一個(gè)類型上。 /模板類型參數(shù)沒(méi)有隱式轉(zhuǎn)換的說(shuō)法,必須精確匹配,所以編譯錯(cuò)誤1.3.6 有默認(rèn)參數(shù)的函數(shù)1、默認(rèn)參數(shù)的目的C+可以給函數(shù)定義默認(rèn)參數(shù)值。通常,調(diào)用函數(shù)時(shí),要為函數(shù)的每個(gè)參數(shù)給定對(duì)應(yīng)的實(shí)參。例如:void delay(int loops); /函數(shù)聲明 void delay(int loops) /函數(shù)定義 if(1oops=0)return;for(int i=0;iloops,i+);/為了延時(shí)無(wú)論何時(shí)調(diào)用delay()函數(shù),都必須給loops傳一個(gè)值以確定時(shí)間。但有時(shí)需要用相同的實(shí)參反復(fù)調(diào)用delay()函數(shù)。C+可以給參數(shù)定義默認(rèn)
25、值。如果將delay( )函數(shù)中的loops定義成默認(rèn)值1000, 只需簡(jiǎn)單地把函數(shù)聲明改為:void delay(int loops=1000);這樣,無(wú)論何時(shí)調(diào)用delay()函數(shù),都不用給loops賦值,程序會(huì)自動(dòng)將它當(dāng)作值1000進(jìn)行處理。例如,調(diào)用:delay(2500); /loops設(shè)置為2500delay(); /ok:loops采用默認(rèn)值1000調(diào)用中,若不給出參數(shù),則按指定的默認(rèn)值進(jìn)行工作。允許函數(shù)默認(rèn)參數(shù)值,是為了讓編程簡(jiǎn)單,讓編譯器做更多的檢查錯(cuò)誤工作。2、默認(rèn)參數(shù)的聲明默認(rèn)參數(shù)在函數(shù)聲明中提供,當(dāng)又有聲明又有定義時(shí),定義中不允許默認(rèn)參數(shù)。如果函數(shù)只有定義,則默認(rèn)參數(shù)才
26、可出現(xiàn)在函數(shù)定義中。例如:void point(int=3,int=4); /聲明中給出默認(rèn)值void point(intx,inty) /定義中不允許再給出默認(rèn)值 cout xendl;cout yendl;3、默認(rèn)參數(shù)的順序規(guī)定如果一個(gè)函數(shù)中有多個(gè)默認(rèn)參數(shù),則形參分布中,默認(rèn)參數(shù)應(yīng)從右至左逐漸定義。當(dāng)調(diào)用函數(shù)時(shí),只能向左匹配參數(shù)。例如:void func(int a=1,int b,int c=3, int d=4); /errorvoid func(int a, int b=2,int c=3,int d=4); /ok void func(int a,int b,int c=3,int
27、 d=4);/ok void func(int a,int b,int c,int d=4);/ok請(qǐng)看下例:#include#includeusing namespace std;void f1(int a,int b=2,int c=3,int d=4);void f2(int a,int b,int c=3,int d=4);int main()f1(30);f1(30,40);f1(30,40,50);f1(30,40,50,60);f2(300,400);f2(300,400,500);f2(300,400,500,600); return 0;void f1(int a,int b
28、,int c,int d)coutsetw(5)asetw(5)bsetw(5)csetw(5)dendl;void f2(int a,int b,int c,int d)coutsetw(5)asetw(5)bsetw(5)csetw(5)dendl;運(yùn)行結(jié)果如下: 30 2 3 4 30 40 3 4 30 40 50 4 30 40 50 60 300 400 3 4 300 400 500 4 300 400 500 6004、默認(rèn)參數(shù)與函數(shù)重載默認(rèn)參數(shù)可將一系列簡(jiǎn)單的重載函數(shù)合成為一個(gè)。例如, 下面3個(gè)重載函數(shù):void point(int,int)/.void point(int
29、a)return point(a,4);void point()return point(3,4);可以用下面的默認(rèn)參數(shù)的函數(shù)來(lái)替代:void point(int=3,int=4);當(dāng)調(diào)用“point();”時(shí),即調(diào)用“point(3,4);” 它是第3個(gè)聲明的重載函數(shù)。當(dāng)調(diào)用“point(6);”時(shí),即調(diào)用“point(6,4);”,它是第2個(gè)聲明的重載函數(shù)。當(dāng)調(diào)用“point(7,8);”時(shí),即調(diào)用第1個(gè)聲明的重載函數(shù)如果一組重載函數(shù)(可能帶有默認(rèn)參數(shù))都允許相同實(shí)參個(gè)數(shù)的調(diào)用,將會(huì)引起調(diào)用的二義性。例如:void func(int); /重載函數(shù)之一void func(int,int=4
30、); /重載函數(shù)之二,帶有默認(rèn)參數(shù)void func(int=3,int=4); /重載函數(shù)之三,帶有默認(rèn)參數(shù)func(7); /error: 到底調(diào)用3個(gè)重載函數(shù)中的哪個(gè)?func(20,30) /error:到底調(diào)用后面2個(gè)重載函數(shù)的哪個(gè)?學(xué)生練習(xí):將P13例1.7不用重載,改用帶有默認(rèn)參數(shù)的函數(shù)。#includeusing namespace std;int max(int a,int b,int c=0)return (ab?a:b)c?(ab?a:b):c;int main()int a,b,c;cinabc;coutmax(a,b,c) max(a,b)endl;1.3.7 變量的
31、引用引用是C+引入的新語(yǔ)言特性,是C+常用的一個(gè)重要內(nèi)容之一,正確、靈活地使用引用,可以使程序簡(jiǎn)潔、高效。許多人使用它僅僅是想當(dāng)然,在某些微妙的場(chǎng)合,很容易出錯(cuò),究其原由,大多因?yàn)闆](méi)有搞清本源。一、引用的概念引用是個(gè)別名,就是某一個(gè)變量或?qū)ο?目標(biāo))的別名。從那時(shí)起,引用作為目標(biāo)的別名而使用。對(duì)引用的改動(dòng)實(shí)際就是對(duì)目標(biāo)的改動(dòng),對(duì)引用的操作與對(duì)變量直接操作完全一樣。引用的聲明方法:類型標(biāo)識(shí)符 &引用名=目標(biāo)變量名;如:int a; int &ra=a; /定義引用ra,它是變量a的引用,即別名。說(shuō)明:(1)&在此不是求地址運(yùn)算,而是起標(biāo)識(shí)作用。在看到&ra形式時(shí),當(dāng)&ra前有類型符時(shí)(如int
32、&ra),它就是對(duì)引用的聲明;如果前面沒(méi)有類型符(如p=&ra),則&是取地址運(yùn)算符。(2)類型標(biāo)識(shí)符是指目標(biāo)變量的類型。(3)聲明引用時(shí),必須同時(shí)對(duì)其進(jìn)行初始化。(4)引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個(gè)名稱,即該目標(biāo)原名稱和引用名,且不能再把該引用名作為其他變量名的別名。ra=1; 等價(jià)于 a=1; (5)聲明一個(gè)引用,不是新定義了一個(gè)變量,它只表示該引用名是目標(biāo)變量名的一個(gè)別名,它本身不是一種數(shù)據(jù)類型,因此引用本身不占存儲(chǔ)單元,系統(tǒng)也不給引用分配存儲(chǔ)單元。故:對(duì)引用求地址,就是對(duì)目標(biāo)變量求地址。&ra與&a相等。(6)不能對(duì)void進(jìn)行引用。(7)不能建立數(shù)組的引用。因?yàn)閿?shù)組是一個(gè)由若
33、干個(gè)元素所組成的集合,所以無(wú)法建立一個(gè)數(shù)組的別名。(8)由于指針也是變量,所以可以有指針變量的引用。引用本身不是一種數(shù)據(jù)類型,所以沒(méi)有引用的引用,也沒(méi)有引用的指針。二、引用的簡(jiǎn)單使用通過(guò)下面的例子來(lái)了解引用的簡(jiǎn)單使用。/自編例,閱讀程序#include void main()int intOne;int& rInt=intOne;intOne=5;cout intOne: intOne endl;cout rInt: rInt endl;rInt=7;cout intOne: intOne endl;cout rInt: rInt endl;cout &intOne: &intOne endl
34、;cout &rInt: &rInt endl;運(yùn)行結(jié)果為:intOne:5rInt:5intOne:7rInt:7&intOne:0x0012FF7C&rInt:0x0012FF7C三、引用作為函數(shù)參數(shù)引用的一個(gè)重要作用就是作為函數(shù)的參數(shù)。以前的C語(yǔ)言中函數(shù)參數(shù)傳遞是值傳遞,如果有大塊數(shù)據(jù)作為參數(shù)傳遞的時(shí)候,采用的方案往往是指針,因?yàn)檫@樣可以避免將整塊數(shù)據(jù)全部壓棧,可以提高程序的效率。但是現(xiàn)在(C+中)又增加了一種同樣有效率的選擇(在某些特殊情況下又是必須的選擇),就是引用。例 :實(shí)現(xiàn)兩個(gè)變量值的交換首先來(lái)看一下利用指針傳遞方式來(lái)實(shí)現(xiàn)/例1.11 使用指針變量作形參,實(shí)現(xiàn)兩個(gè)變量的互換#in
35、cludevoid swap(int *p1, int *p2) /此處函數(shù)的形參p1, p2都是指針 int p; p=*p1; *p1=*p2; *p2=p; /此處需要用*p1、*p2,容易出錯(cuò),難于閱讀 void main( )int a,b;cinab; /輸入a,b兩變量的值swap(&a,&b); /變量a和b的地址作為實(shí)參調(diào)用swap函數(shù) couta b; /輸出結(jié)果 傳遞指針給用戶增加了編程和理解的負(fù)擔(dān),下面我們用引用來(lái)實(shí)現(xiàn)。/例1.12 使用引用作形參,實(shí)現(xiàn)兩個(gè)變量的互換#includevoid swap(int &p1, int &p2) /此處函數(shù)的形參p1, p2都是
36、引用 int p; p=p1; p1=p2; p2=p; /這里直接用p1、p2 /*為了在程序中調(diào)用該函數(shù),則相應(yīng)的主調(diào)函數(shù)的調(diào)用點(diǎn)處,直接以變量作為實(shí)參進(jìn)行調(diào)用即可而不需要實(shí)參變量有任何的特殊要求。如:對(duì)應(yīng)上面定義的swap函數(shù),相應(yīng)的主調(diào)函數(shù)可寫為:*/void main( )int a,b;cinab; /輸入a,b兩變量的值swap(a,b); /直接以變量a和b作為實(shí)參調(diào)用swap函數(shù) couta b; /輸出結(jié)果 上述程序運(yùn)行時(shí),如果輸入數(shù)據(jù)10 20并回車后,則輸出結(jié)果為20 10。由上例可看出:(1)傳遞引用給函數(shù)與傳遞指針的效果是一樣的。這時(shí),被調(diào)函數(shù)的形參就成為原來(lái)主調(diào)函
37、數(shù)中的實(shí)參變量或?qū)ο蟮囊粋€(gè)別名來(lái)使用,所以在被調(diào)函數(shù)中對(duì)形參變量的操作就是對(duì)其相應(yīng)的目標(biāo)對(duì)象(在主調(diào)函數(shù)中)的操作。(2)使用引用傳遞函數(shù)的參數(shù),在內(nèi)存中并沒(méi)有產(chǎn)生實(shí)參的副本,它是直接對(duì)實(shí)參操作;而使用一般變量傳遞函數(shù)的參數(shù),當(dāng)發(fā)生函數(shù)調(diào)用時(shí),需要給形參分配存儲(chǔ)單元,形參變量是實(shí)參變量的副本。因此,當(dāng)參數(shù)傳遞的數(shù)據(jù)較大時(shí),用引用比用一般變量傳遞參數(shù)的效率和所占空間都好。(3)使用指針作為函數(shù)的參數(shù)雖然也能達(dá)到與使用引用的效果,但是,在被調(diào)函數(shù)中同樣要給形參分配存儲(chǔ)單元,且需要重復(fù)使用*指針變量名的形式進(jìn)行運(yùn)算,這很容易產(chǎn)生錯(cuò)誤且程序的閱讀性較差;另一方面,在主調(diào)函數(shù)的調(diào)用點(diǎn)處,必須用變量的地址
38、作為實(shí)參。而引用更容易使用,更清晰。如果既要利用引用提高程序的效率,又要保護(hù)傳遞給函數(shù)的數(shù)據(jù)不在函數(shù)中被改變,就應(yīng)使用常引用。四、返回多個(gè)值(增加內(nèi)容) 函數(shù)只能返回一個(gè)值。如果程序需要從函數(shù)返回兩個(gè)值怎么辦?解決這一問(wèn)題的辦法之一是用引用給函數(shù)傳遞兩個(gè)參數(shù),然后由函數(shù)往目標(biāo)中填入正確的值。因?yàn)橛靡脗鬟f允許函數(shù)改變?cè)瓉?lái)的目標(biāo),這一方法實(shí)際上讓函數(shù)返回兩個(gè)信息。引用和指針都可以用來(lái)實(shí)現(xiàn)這一過(guò)程。/自編例:用指針來(lái)實(shí)現(xiàn)的返回多個(gè)值#include void f(int,int *,int *);void main()int x1,x2,x3;x1=20;f(x1,&x2,&x3);coutx1x
39、2x3endl;void f(int n,int *n2,int *n3)*n2=n+10;*n3=n-10;下面是用引來(lái)實(shí)現(xiàn)的,顯然簡(jiǎn)單得多。/自編例:用引用實(shí)現(xiàn)返回多個(gè)值#include void f(int,int &,int &);void main()int x1,x2,x3;x1=20;f(x1,x2,x3);coutx1x2x3endl;void f(int n,int &n2,int &n3)n2=n+10;n3=n-10;五、常引用常引用聲明方式:const 類型標(biāo)識(shí)符 &引用名=目標(biāo)變量名;用這種方式聲明的引用,不能通過(guò)引用對(duì)目標(biāo)變量的值進(jìn)行修改,從而使引用的目標(biāo)成為con
40、st,達(dá)到了引用的安全性。如:int a ;const int &ra=a;ra=1; /錯(cuò)誤,不允許改變引用的值a=1; /正確 ,可以改變引用所代表的變量的值??梢杂贸A炕虮磉_(dá)式對(duì)引用進(jìn)行初始化,但此時(shí)必須用const作聲明。如:int i=5; const &a=i+3;1.3.8 內(nèi)置函數(shù)或內(nèi)聯(lián)函數(shù)或內(nèi)嵌函數(shù)(inline)在C+中,為了解決一些頻繁調(diào)用的小函數(shù)大量消耗??臻g或者是叫棧內(nèi)存的問(wèn)題,特別的引入了inline修飾符,表示為內(nèi)置函數(shù)。 下面我們來(lái)看一個(gè)例子:#include #include using namespace std; inline string dbtest(
41、int a); /函數(shù)原形聲明為inline即:內(nèi)置函數(shù) void main() for(int i=1;i=10;i+)couti:dbtest(i)0)?奇:偶;上面的例子就是標(biāo)準(zhǔn)的內(nèi)置函數(shù)的用法,使用inline修飾帶來(lái)的好處我們表面看不出來(lái),其實(shí)在內(nèi)部的工作就是在每個(gè)for循環(huán)的內(nèi)部所有調(diào)用dbtest(i)的地方都換成了(i%20)?奇:偶這樣就避免了頻繁調(diào)用函數(shù)對(duì)棧內(nèi)存重復(fù)開(kāi)辟所帶來(lái)的消耗。 說(shuō)到這里很多人可能會(huì)問(wèn),既然inline這么好,還不如把所有的函數(shù)都聲明成inline,嗯,這個(gè)問(wèn)題是要注意的,inline的使用是有所限制的,inline只適合函數(shù)體內(nèi)代碼簡(jiǎn)單(一般為5語(yǔ)句
42、以下)的函數(shù)使用,不能包含復(fù)雜的結(jié)構(gòu)控制語(yǔ)句例如while switch,并且內(nèi)置函數(shù)本身不能是直接遞歸函數(shù)(自己內(nèi)部還調(diào)用自己的函數(shù))。 1.3.9 作用域運(yùn)算符 每一個(gè)變量都有其有效的作用域,只能在變量的作用域內(nèi)作用該變量,不能直接使用其它作用域中的變量。/例1.16 局部變量和全局變量同名#includeusing namespace std;int a=2;int main()int a=5;couta:aendl; /:a指的是全局變量a,不能用:來(lái)訪問(wèn)函數(shù)的局部變量return 0; /沒(méi)有此句會(huì)有警告。最好加上此句1.3.10 字符串變量與布爾變量一、布爾類型(bool)(增加)布爾類型可以被賦予文字值true或者false,所對(duì)應(yīng)的關(guān)系就是真與假的概念。我們通常使用的方法是利用它來(lái)判斷條件的真與假,例如下面的代碼:/自編例#includeusing namespace st
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度無(wú)人機(jī)OEM研發(fā)與市場(chǎng)推廣合同3篇
- 年度制冷空調(diào)機(jī)械競(jìng)爭(zhēng)策略分析報(bào)告
- 二零二五版淀粉行業(yè)綠色生產(chǎn)與循環(huán)利用合同3篇
- 年度記憶綿枕市場(chǎng)分析及競(jìng)爭(zhēng)策略分析報(bào)告
- 二零二五年度谷殼供應(yīng)鏈金融服務(wù)合同3篇
- 2025年新型建筑裝修工程施工企業(yè)信用擔(dān)保合同范本3篇
- 鐵礦粉購(gòu)銷合同模板2025年度2篇
- 二零二五年智能硬件研發(fā)項(xiàng)目技術(shù)合同登記管理細(xì)則3篇
- 2025年度鉆井工程地質(zhì)勘察合同3篇
- 2025年度盆景植物租賃與藝術(shù)展覽合作合同范本
- 2025年生產(chǎn)主管年度工作計(jì)劃
- 2025年急診科護(hù)理工作計(jì)劃
- 高中家長(zhǎng)會(huì) 高二寒假線上家長(zhǎng)會(huì)課件
- 違規(guī)行為與處罰管理制度
- 個(gè)人教師述職報(bào)告錦集10篇
- 四川省等八省2025年普通高中學(xué)業(yè)水平選擇性考試適應(yīng)性演練歷史試題(含答案)
- 《內(nèi)部培訓(xùn)師培訓(xùn)》課件
- 《雷達(dá)原理》課件-3.3.3教學(xué)課件:相控陣?yán)走_(dá)
- 西方史學(xué)史課件3教學(xué)
- 2024年中國(guó)醫(yī)藥研發(fā)藍(lán)皮書
- 紅色中國(guó)風(fēng)蛇年年會(huì)邀請(qǐng)函
評(píng)論
0/150
提交評(píng)論