第1章C+的初步知識_第1頁
第1章C+的初步知識_第2頁
第1章C+的初步知識_第3頁
第1章C+的初步知識_第4頁
第1章C+的初步知識_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第1章 C+的初步知識上學期是以C為藍本來講解,這學期需要增加一些C+的內容,這是進入C/C+程序設計II學習的前期準備。1.1 從C到C+C語言是結構化和模塊化的語言,它是面向過程的。能處理小規(guī)模的程序。但當規(guī)模較大時會顯示出它的不足。為了解決這個軟件危機,提出了面向對象的程序設計(object oriented programming,OOP)思想。C+保留了C語言原有的所有優(yōu)點,增加了面向對象機制。所以C+也稱為“帶類的C”。C+對C的“增強”,表現(xiàn)在以下兩個方面:1、在原來面向過程的機制基礎上,對C語言的功能作了擴充。(本章將介紹充分部分)2、增加了面向對象的機制。在面向對象的程序設計

2、中仍然要用到結構化程序設計的知識。下面介紹C+對C的擴充,及與C的差別所在。1.2 最簡單的C+程序 C+程序在結構上與C的差別如下: 1、 標準C+規(guī)定main函數(shù)聲明為int型,即此主函數(shù)帶回一個整型的函數(shù)值。程序如果正常執(zhí)行,則操作系統(tǒng)返回數(shù)值0,否則返回數(shù)值-1。2、 系統(tǒng)頭文件不帶后綴.h,如:#include3、 使用系統(tǒng)庫時要使用命名空間std。即使用using namespace std;,這句話的意思是使用命名空間std。C+標準庫中的類和函數(shù)是在命名空間std中聲明的,因此程序中如果需要用到C+標準庫,就需要用using namespace std;來聲明,表示要用命名空間

3、std中的內容。例1.1 最簡單的只有輸出的程序#includeusing namespace std;int main()coutThis is a C+ programm.n; /cout是對象名,稱為輸出流對象。“”是插入運算符return 0; /沒有此句會有警告。最好加上此句例1.2 最簡單的有輸入的程序#includeusing namespace std;int main()int a,b,sum;cinab; /cin是輸入流對象?!啊笔翘崛∵\算符sum=a+b;couta+b=sumendl;return 0; /沒有此句會有警告。最好加上此句例1.3 輸入二個數(shù)x和y,求兩

4、個數(shù)中的大者。(要求用函數(shù)實現(xiàn),學生練習)例1.4 對學生信息進行輸入也輸出。1)用結構體實現(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ù)與對數(shù)據(jù)的操作(函數(shù))是一個整體。類中的函數(shù)也是一個成員,叫著成員函數(shù)。數(shù)據(jù)成員被說明為私有的,在類外是不能使用的。1.3 C+對C 的擴充1.3.1 C+的輸入輸出在C+中是通過調用輸入輸出流庫中的流對象cin和cout實現(xiàn)的。流指的是來自設備或傳給設備的一個數(shù)據(jù)流。cout是輸出流對象的名字,cin是輸入流對象的名字。一、 輸入流與輸出流的基本操作cout語句的一般格式為:cout表達式1表達式2變量1變量2變量n;當程序需要在屏幕上顯示輸出時,可以使用插入操作符,向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能夠知道抽取的變量的類型,它將對a,b,c分別給出一個整型、浮點型和字符型數(shù)。二、輸入流與輸出流中使用控制符(第七章中詳細介紹,這里了解

7、就可以了)流的默認格式輸出有時不能滿足特殊要求,如: double average=9.;coutaverageendl;希望顯示的是9.40,即保留兩位小數(shù),可是卻顯示了9.40007,默認顯示6位有效位。 用控制符(manipulators)可以對I/O流的格式進行控制。控制符是在頭文件iomanip.h中定義的對象。可以直接將控制符插入流中。常用控制符如下表所列。表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 設填充字符為c 設顯示小數(shù)精度為n位 設域寬為n個字符固定的浮點顯示 指數(shù)表示左對齊右對齊 忽略前導空白16進制數(shù)大寫輸出 16進制數(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語言中常用#define命令來定義符號常量,實際上,只是進行字符置換,容易誤解。#includeusing namespace std;#define R 2+3int main()coutR*Rendl; /輸出結果是11,并不是25return 0; /沒有此句會有警告。最好加上此句下面看C+提供的const定義常變量的方法就避免這個問題。#includeusing namespace std

10、;const int R=2+3;int main()coutR*Rendl; /輸出結果是25return 0; /沒有此句會有警告。最好加上此句1.3.3 函數(shù)原型聲明在C+中,如果函數(shù)調用的位置在函數(shù)定義之前,則要求在函數(shù)調用之前必須對所調用的函數(shù)作函數(shù)原型聲明,這是強制性的。如有定義:int max(int a,int b)return a+b;聲明時必須寫成: int max(int a,int b);或 int max(int x,int y);或 int max(int ,int);1.3.4 函數(shù)的重載1、為什么要用重載函數(shù)在C中,在同一作用域中不能有同名的函數(shù),每個函數(shù)必須有

11、其唯一的名字,這樣有時會令人生厭。例如,求一個數(shù)的絕對值,由于要求命名唯一,所以對于不同的類型需要不同名字的函數(shù):int abs(int);float fabs(float);long labs(long);double labs(double);極其相似操作函數(shù)我們卻起三個不同的名字,這樣子不是很好管理,所以C+為了方便程序員編寫程序特別引入了函數(shù)重載的概念來解決此問題。C+允許在同一作用域用同一函數(shù)名定義多個函數(shù),這些函數(shù)的參數(shù)個數(shù)和參數(shù)類型不相同,這些同名的函數(shù)用來實現(xiàn)不同的功能。這就是函數(shù)的重載。重載是用來描述同名函數(shù)具有相同或者相似功能,但數(shù)據(jù)類型或者是參數(shù)不同的函數(shù)管理操作的稱呼。

12、同一個函數(shù)名可以用來代表不同功能的函數(shù),也就是一名多用。這幾個函數(shù)所做的事情是一樣的都是求絕對值。因此,使用三個不同的函數(shù)名,看上去很笨拙,若給以同樣的名字就會方便得多。這就是重載技術。這種技術在C+中早已用于基本數(shù)據(jù)類型運算,如加法只有一個名字+, 但它可以用來加整數(shù)值、浮點值和指針值。插入運算符“”既可以左移和右移也可以是輸入輸出運算符。例如,上述4個函數(shù)的聲明可以改為:int abs(int); float abs(float);long abs(1ong);double abs(double);C+用一種函數(shù)命名技術可以準確判斷出應該使用哪個abs()函數(shù)。例如:abs(-10); /

13、調用int abs(int); abs(-); /調用longabs(1ong);abs(-12.23); /調用double abs(double);2、匹配重載函數(shù)的順序在調用一個重載函數(shù)f()時,編譯器必須搞清函數(shù)名f究竟是指哪個函數(shù)。這是靠將實參類型和所有被調用的f()函數(shù)的形參類型一一比較來判定的。 按下述3個步驟的先后順序找到并調用那個函數(shù):(1)尋找一個嚴格的匹配,如果找到了,就用那個函數(shù)。(2)通過內部轉換尋求一個匹配,只要找到了,就用那個函數(shù)。(3)通過用戶定義的轉換尋求一個匹配, 若能查出有唯一的一組轉換,就用那個函數(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);例如,對于重載函數(shù)print()聲明,其下面的函數(shù)調用將引起錯誤:void print(1ong);void print(double);void func(int a)print(a); /error:因為有二義性3、使用說明(1)C+的函數(shù)如果在返回類型、參數(shù)類型

15、、參數(shù)個數(shù)、參數(shù)順序上有所不同,則認為是不同的。但重載函數(shù)如果僅僅是返回類型不同,則是不夠的。例如,下面的聲明是錯誤的:void func(int);int func(int);編譯器無法區(qū)分函數(shù)調用func(3)”是指上述哪一個重載函數(shù)。因此重載函數(shù)至少在參數(shù)個數(shù)、參數(shù)類型或參數(shù)順序上有所不同。(2)typedef定義的類型只能使之相同于一個已存在的類型,而不能建立新的類型,所以不能用typedef定義的類型名來區(qū)分重載函數(shù)聲明中的參數(shù)。例如,下面的代碼實際上是同一個函數(shù):typedef INT int;void func(int x)/.void func(INTx)/.) /error:

16、函數(shù)重復定義編譯器不能區(qū)分這兩個函數(shù)的差別,INT只不過是int的另一種稱呼而已;(3)讓重載執(zhí)行不同的功能, 是不好的編程風格。同名函數(shù)應該具有相同的功能。如果定義一個abs()函數(shù)而返回的卻是一個數(shù)的平方根, 該程序的可讀性受到破壞。P13例1.7 用一個函數(shù)求2個正整數(shù)或3個正整數(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ù)的重載可以實現(xiàn)一個函數(shù)名多用,將功能相同或類似的函數(shù)用同一個函數(shù)名來定義。這樣使編程者在調用同類函數(shù)時感到含義清楚,方法簡單。但是在程序中仍然要分別定義每一個函數(shù)。例如:求3個數(shù)中最大的數(shù)(分別考慮整數(shù)、雙精度數(shù)、浮點數(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個max函數(shù)的函數(shù)體是完全相同的,只是形參的類型不同,也要分別定義,能否對此進行簡化呢?為了解決這個問題,C+提供了函數(shù)模板。所謂函數(shù)模板就是建立一個通用函數(shù),其函數(shù)類型和形參類型不具體指定,用一個虛擬的類型來代表。這個通用函數(shù)就稱為函數(shù)模板。凡是函數(shù)體相同的函數(shù)都可以用這個模板來代替,不必定義多個函數(shù),只需在模板中定義一次即可。在調用函數(shù)時系統(tǒng)會根據(jù)實參的類型來取代模板中的虛擬類型,從而實現(xiàn)了不同函數(shù)的

20、功能。我們將上面的例子用函數(shù)模板來實現(xiàn)#includeusing namespace std;template /模板聲明,其中T為類型參數(shù),會有不同數(shù)據(jù)類型的地方, /以設定類型的變量替代。T max(T a,T b,T c) /定義一個通用函數(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ù)重載更為方便,程序簡潔多了。但應注意它只適用于函數(shù)體相同、函數(shù)的參數(shù)個數(shù)相同而類型不同的情況,如果參數(shù)的個數(shù)不同,則不能用函數(shù)模板。例:定義一個交換兩變量值的模板函數(shù),利用它來實現(xiàn)整數(shù)、浮點數(shù)、雙精度數(shù)、字符串的交換。(學生練習)#include#includeusing namespace std;template /模板聲明,其中T為類型參數(shù)void swap(T* a,T* b)

22、 /定義一個通用函數(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ù)調用時,類型實參與類型形參的匹配要求很苛刻。下面來看一個實例。#include#includeusing namespace std;template /模板聲明,其中T為類型參數(shù)void swap(T* a,T* b) /定義一個通用函數(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不同,但可以隱式轉換為double,實現(xiàn)合法調用swap(ia,db); /e

24、rror ia與db的類型不同,不能統(tǒng)一到同一個類型上。 /模板類型參數(shù)沒有隱式轉換的說法,必須精確匹配,所以編譯錯誤1.3.6 有默認參數(shù)的函數(shù)1、默認參數(shù)的目的C+可以給函數(shù)定義默認參數(shù)值。通常,調用函數(shù)時,要為函數(shù)的每個參數(shù)給定對應的實參。例如:void delay(int loops); /函數(shù)聲明 void delay(int loops) /函數(shù)定義 if(1oops=0)return;for(int i=0;iloops,i+);/為了延時無論何時調用delay()函數(shù),都必須給loops傳一個值以確定時間。但有時需要用相同的實參反復調用delay()函數(shù)。C+可以給參數(shù)定義默認

25、值。如果將delay( )函數(shù)中的loops定義成默認值1000, 只需簡單地把函數(shù)聲明改為:void delay(int loops=1000);這樣,無論何時調用delay()函數(shù),都不用給loops賦值,程序會自動將它當作值1000進行處理。例如,調用:delay(2500); /loops設置為2500delay(); /ok:loops采用默認值1000調用中,若不給出參數(shù),則按指定的默認值進行工作。允許函數(shù)默認參數(shù)值,是為了讓編程簡單,讓編譯器做更多的檢查錯誤工作。2、默認參數(shù)的聲明默認參數(shù)在函數(shù)聲明中提供,當又有聲明又有定義時,定義中不允許默認參數(shù)。如果函數(shù)只有定義,則默認參數(shù)才

26、可出現(xiàn)在函數(shù)定義中。例如:void point(int=3,int=4); /聲明中給出默認值void point(intx,inty) /定義中不允許再給出默認值 cout xendl;cout yendl;3、默認參數(shù)的順序規(guī)定如果一個函數(shù)中有多個默認參數(shù),則形參分布中,默認參數(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請看下例:#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;運行結果如下: 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、默認參數(shù)與函數(shù)重載默認參數(shù)可將一系列簡單的重載函數(shù)合成為一個。例如, 下面3個重載函數(shù):void point(int,int)/.void point(int

29、a)return point(a,4);void point()return point(3,4);可以用下面的默認參數(shù)的函數(shù)來替代:void point(int=3,int=4);當調用“point();”時,即調用“point(3,4);” 它是第3個聲明的重載函數(shù)。當調用“point(6);”時,即調用“point(6,4);”,它是第2個聲明的重載函數(shù)。當調用“point(7,8);”時,即調用第1個聲明的重載函數(shù)如果一組重載函數(shù)(可能帶有默認參數(shù))都允許相同實參個數(shù)的調用,將會引起調用的二義性。例如:void func(int); /重載函數(shù)之一void func(int,int=4

30、); /重載函數(shù)之二,帶有默認參數(shù)void func(int=3,int=4); /重載函數(shù)之三,帶有默認參數(shù)func(7); /error: 到底調用3個重載函數(shù)中的哪個?func(20,30) /error:到底調用后面2個重載函數(shù)的哪個?學生練習:將P13例1.7不用重載,改用帶有默認參數(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+引入的新語言特性,是C+常用的一個重要內容之一,正確、靈活地使用引用,可以使程序簡潔、高效。許多人使用它僅僅是想當然,在某些微妙的場合,很容易出錯,究其原由,大多因為沒有搞清本源。一、引用的概念引用是個別名,就是某一個變量或對象(目標)的別名。從那時起,引用作為目標的別名而使用。對引用的改動實際就是對目標的改動,對引用的操作與對變量直接操作完全一樣。引用的聲明方法:類型標識符 &引用名=目標變量名;如:int a; int &ra=a; /定義引用ra,它是變量a的引用,即別名。說明:(1)&在此不是求地址運算,而是起標識作用。在看到&ra形式時,當&ra前有類型符時(如int

32、&ra),它就是對引用的聲明;如果前面沒有類型符(如p=&ra),則&是取地址運算符。(2)類型標識符是指目標變量的類型。(3)聲明引用時,必須同時對其進行初始化。(4)引用聲明完畢后,相當于目標變量名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變量名的別名。ra=1; 等價于 a=1; (5)聲明一個引用,不是新定義了一個變量,它只表示該引用名是目標變量名的一個別名,它本身不是一種數(shù)據(jù)類型,因此引用本身不占存儲單元,系統(tǒng)也不給引用分配存儲單元。故:對引用求地址,就是對目標變量求地址。&ra與&a相等。(6)不能對void進行引用。(7)不能建立數(shù)組的引用。因為數(shù)組是一個由若

33、干個元素所組成的集合,所以無法建立一個數(shù)組的別名。(8)由于指針也是變量,所以可以有指針變量的引用。引用本身不是一種數(shù)據(jù)類型,所以沒有引用的引用,也沒有引用的指針。二、引用的簡單使用通過下面的例子來了解引用的簡單使用。/自編例,閱讀程序#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;運行結果為:intOne:5rInt:5intOne:7rInt:7&intOne:0x0012FF7C&rInt:0x0012FF7C三、引用作為函數(shù)參數(shù)引用的一個重要作用就是作為函數(shù)的參數(shù)。以前的C語言中函數(shù)參數(shù)傳遞是值傳遞,如果有大塊數(shù)據(jù)作為參數(shù)傳遞的時候,采用的方案往往是指針,因為這樣可以避免將整塊數(shù)據(jù)全部壓棧,可以提高程序的效率。但是現(xiàn)在(C+中)又增加了一種同樣有效率的選擇(在某些特殊情況下又是必須的選擇),就是引用。例 :實現(xiàn)兩個變量值的交換首先來看一下利用指針傳遞方式來實現(xiàn)/例1.11 使用指針變量作形參,實現(xiàn)兩個變量的互換#in

35、cludevoid swap(int *p1, int *p2) /此處函數(shù)的形參p1, p2都是指針 int p; p=*p1; *p1=*p2; *p2=p; /此處需要用*p1、*p2,容易出錯,難于閱讀 void main( )int a,b;cinab; /輸入a,b兩變量的值swap(&a,&b); /變量a和b的地址作為實參調用swap函數(shù) couta b; /輸出結果 傳遞指針給用戶增加了編程和理解的負擔,下面我們用引用來實現(xiàn)。/例1.12 使用引用作形參,實現(xiàn)兩個變量的互換#includevoid swap(int &p1, int &p2) /此處函數(shù)的形參p1, p2都是

36、引用 int p; p=p1; p1=p2; p2=p; /這里直接用p1、p2 /*為了在程序中調用該函數(shù),則相應的主調函數(shù)的調用點處,直接以變量作為實參進行調用即可而不需要實參變量有任何的特殊要求。如:對應上面定義的swap函數(shù),相應的主調函數(shù)可寫為:*/void main( )int a,b;cinab; /輸入a,b兩變量的值swap(a,b); /直接以變量a和b作為實參調用swap函數(shù) couta b; /輸出結果 上述程序運行時,如果輸入數(shù)據(jù)10 20并回車后,則輸出結果為20 10。由上例可看出:(1)傳遞引用給函數(shù)與傳遞指針的效果是一樣的。這時,被調函數(shù)的形參就成為原來主調函

37、數(shù)中的實參變量或對象的一個別名來使用,所以在被調函數(shù)中對形參變量的操作就是對其相應的目標對象(在主調函數(shù)中)的操作。(2)使用引用傳遞函數(shù)的參數(shù),在內存中并沒有產生實參的副本,它是直接對實參操作;而使用一般變量傳遞函數(shù)的參數(shù),當發(fā)生函數(shù)調用時,需要給形參分配存儲單元,形參變量是實參變量的副本。因此,當參數(shù)傳遞的數(shù)據(jù)較大時,用引用比用一般變量傳遞參數(shù)的效率和所占空間都好。(3)使用指針作為函數(shù)的參數(shù)雖然也能達到與使用引用的效果,但是,在被調函數(shù)中同樣要給形參分配存儲單元,且需要重復使用*指針變量名的形式進行運算,這很容易產生錯誤且程序的閱讀性較差;另一方面,在主調函數(shù)的調用點處,必須用變量的地址

38、作為實參。而引用更容易使用,更清晰。如果既要利用引用提高程序的效率,又要保護傳遞給函數(shù)的數(shù)據(jù)不在函數(shù)中被改變,就應使用常引用。四、返回多個值(增加內容) 函數(shù)只能返回一個值。如果程序需要從函數(shù)返回兩個值怎么辦?解決這一問題的辦法之一是用引用給函數(shù)傳遞兩個參數(shù),然后由函數(shù)往目標中填入正確的值。因為用引用傳遞允許函數(shù)改變原來的目標,這一方法實際上讓函數(shù)返回兩個信息。引用和指針都可以用來實現(xiàn)這一過程。/自編例:用指針來實現(xiàn)的返回多個值#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;下面是用引來實現(xiàn)的,顯然簡單得多。/自編例:用引用實現(xiàn)返回多個值#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 類型標識符 &引用名=目標變量名;用這種方式聲明的引用,不能通過引用對目標變量的值進行修改,從而使引用的目標成為con

40、st,達到了引用的安全性。如:int a ;const int &ra=a;ra=1; /錯誤,不允許改變引用的值a=1; /正確 ,可以改變引用所代表的變量的值??梢杂贸A炕虮磉_式對引用進行初始化,但此時必須用const作聲明。如:int i=5; const &a=i+3;1.3.8 內置函數(shù)或內聯(lián)函數(shù)或內嵌函數(shù)(inline)在C+中,為了解決一些頻繁調用的小函數(shù)大量消耗??臻g或者是叫棧內存的問題,特別的引入了inline修飾符,表示為內置函數(shù)。 下面我們來看一個例子:#include #include using namespace std; inline string dbtest(

41、int a); /函數(shù)原形聲明為inline即:內置函數(shù) void main() for(int i=1;i=10;i+)couti:dbtest(i)0)?奇:偶;上面的例子就是標準的內置函數(shù)的用法,使用inline修飾帶來的好處我們表面看不出來,其實在內部的工作就是在每個for循環(huán)的內部所有調用dbtest(i)的地方都換成了(i%20)?奇:偶這樣就避免了頻繁調用函數(shù)對棧內存重復開辟所帶來的消耗。 說到這里很多人可能會問,既然inline這么好,還不如把所有的函數(shù)都聲明成inline,嗯,這個問題是要注意的,inline的使用是有所限制的,inline只適合函數(shù)體內代碼簡單(一般為5語句

42、以下)的函數(shù)使用,不能包含復雜的結構控制語句例如while switch,并且內置函數(shù)本身不能是直接遞歸函數(shù)(自己內部還調用自己的函數(shù))。 1.3.9 作用域運算符 每一個變量都有其有效的作用域,只能在變量的作用域內作用該變量,不能直接使用其它作用域中的變量。/例1.16 局部變量和全局變量同名#includeusing namespace std;int a=2;int main()int a=5;couta:aendl; /:a指的是全局變量a,不能用:來訪問函數(shù)的局部變量return 0; /沒有此句會有警告。最好加上此句1.3.10 字符串變量與布爾變量一、布爾類型(bool)(增加)布爾類型可以被賦予文字值true或者false,所對應的關系就是真與假的概念。我們通常使用的方法是利用它來判斷條件的真與假,例如下面的代碼:/自編例#includeusing namespace st

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論