第2章C對C的擴(kuò)充課件_第1頁
第2章C對C的擴(kuò)充課件_第2頁
第2章C對C的擴(kuò)充課件_第3頁
第2章C對C的擴(kuò)充課件_第4頁
第2章C對C的擴(kuò)充課件_第5頁
已閱讀5頁,還剩104頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第2章 C+對C的擴(kuò)充第2章 基本內(nèi)容掌握C+語言在結(jié)構(gòu)化程序設(shè)計(jì)(非面向?qū)ο?方面對C語言擴(kuò)充的性能,為編寫面向?qū)ο蟮腃+程序打下基礎(chǔ)。第2章 C+對C的擴(kuò)充2.1 C+的特點(diǎn)2.2 C+語言的文件擴(kuò)展名2.3 注釋符2.4 名字空間2.5 C+語言的輸入輸出2.6 變量的定義2.7 強(qiáng)制類型轉(zhuǎn)換2.8 動(dòng)態(tài)內(nèi)存的分配與釋放2.9 作用域運(yùn)算符:2.10 引用2.11 const修飾符2.12 字符串2.13 C+語言中函數(shù)的新特性習(xí)題2.1 C+的發(fā)明人 Bjarne Stroustrup(本賈尼斯特勞斯特盧普)博士,C+語言之父,1950年出生于丹麥,1979年在英國劍橋大學(xué)獲得計(jì)算機(jī)科

2、學(xué)博士學(xué)位,AT&T、貝爾實(shí)驗(yàn)室和ACM成員。1979年,B. S開始開發(fā)一種語言,當(dāng)時(shí)稱為“C with Class”,1983年演化為C+。1998年,ANSI/ISO C+標(biāo)準(zhǔn)建立,同年,B. S推出了其經(jīng)典著作The C+ Programming Language的第三版。 Stroustrup博士是C+語言的設(shè)計(jì)者和第一位實(shí)現(xiàn)者,該語言業(yè)已成為世界上最通用的支持面向?qū)ο蠹夹g(shù)的程序設(shè)計(jì)語言。Ken Thompson和Dennis Ritchie 美國科學(xué)家,1983年圖靈獎(jiǎng)獲得者,UNIX和C語言的發(fā)明者。2.1 C+開發(fā)工具的歷史90年代初的Turbo C+2.1 C+開發(fā)工具的歷史

3、90年代中期的Borland C+ for dos 2.1 C+開發(fā)工具的歷史90年代中期的Borland C+ Builder for Win 2.1 C+開發(fā)工具的歷史21世紀(jì)的visual C+ 6.0 2.1 C+開發(fā)工具的歷史visual studio 2010 2.1 C+的特點(diǎn) C+語言既保留了C語言的有效性、靈活性、便于移植等全部精華和特點(diǎn),又添加了面向?qū)ο缶幊痰闹С?,具有?qiáng)大的編程功能,可方便地構(gòu)造出模擬現(xiàn)實(shí)問題的實(shí)體和操作;編寫出的程序具有結(jié)構(gòu)清晰、易于擴(kuò)充等優(yōu)良特性,適合于各種應(yīng)用軟件、系統(tǒng)軟件的程序設(shè)計(jì)。用C+編寫的程序可讀性好,生成的代碼質(zhì)量高,運(yùn)行效率僅比匯編語言慢

4、10%20%。2.2 C+語言的文件擴(kuò)展名 為了使編譯器能夠區(qū)別是C語言還是C+語言,C+語言體系規(guī)定用“.cpp”(意即C Plus-Plus)作為C+語言源文件的擴(kuò)展名以區(qū)別于C語言用的“.C”文件擴(kuò)展名。雖然僅差兩個(gè)字母,但編譯時(shí)的處理卻相差甚遠(yuǎn)。 “cpp”的文件擴(kuò)展名與操作系統(tǒng)無關(guān)。與C+語言源文件相關(guān)的頭文件擴(kuò)展名一般仍用“.h”,但有些操作系統(tǒng)也有規(guī)定使用“.hpp”充當(dāng)頭文件擴(kuò)展名的。2.3 注釋符 1. 段注釋: /*/ 2. 單行注釋:/ 當(dāng)只做單行注釋時(shí)便可用“/”符號表示從此符號起至行尾均為行注釋內(nèi)容。 3. 程序編譯時(shí)將忽略所有的注釋內(nèi)容。2.4 名字空間(名空間na

5、mespace) 名字空間域是隨標(biāo)準(zhǔn)C+而引入的。它相當(dāng)于一個(gè)更加靈活的文件域(全局域),可以用花括號把文件的一部分括起來,并以關(guān)鍵字namespace開頭給它起一個(gè)名字:namespace ns1 float a,b,c; fun1() 花括號括起來的部分稱聲明塊。聲明塊中可以包括:類、變量(帶有初始化)、函數(shù)(帶有定義)等。在域外使用域內(nèi)的成員時(shí),需加上名字空間名作為前綴,后面加上域操作符“:” 。這里添加了名字空間名稱的成員名被稱為限定修飾名。如:ns1:a,ns1:fun1()等等。 最外層的名字空間域稱為全局名字空間域(global namespace scope),即文件域。名字空

6、間域可分層嵌套,同樣有分層屏蔽作用。例如:namespace n1 namespace n2 / 名字空間嵌套 class matrix/ 名字空間類成員matrix 訪問matrix,可寫:n1:n2:matrix 。使用using聲明可只寫一次限定修飾名。using聲明以關(guān)鍵字using開頭,后面是被限定修飾的(qualified)名字空間成員名,例如:using n1:n2:matrix;/ 名字空間類成員matrix的using聲明以后在程序中使用matrix時(shí),就可以直接使用成員名,而不必使用限定修飾名。使用using指示符可以一次性地使名字空間中所有成員都可以直接被使用,比usin

7、g聲明方便。using指示符以關(guān)鍵字using開頭,后面是關(guān)鍵字namespace,然后是名字空間名。 標(biāo)準(zhǔn)C+庫中的所有組件都是在一個(gè)被稱為std的名字空間中聲明和定義的。在采用標(biāo)準(zhǔn)C+的平臺上使用標(biāo)準(zhǔn)C+庫中的組件,只要寫一個(gè)using指示符: using namespace std; 就可以直接使用標(biāo)準(zhǔn)C+庫中的所有成員。 注意:如果使用了名空間std,則在使用#include編譯預(yù)處理命令包含頭文件時(shí),必須去掉頭文件的擴(kuò)展名.h,否則會(huì)出錯(cuò)。2.5 C+語言的輸入輸出C+語言另外定義了一套流對象與運(yùn)算符來替代C語言中對標(biāo)準(zhǔn)輸入輸出函數(shù)scanf和printf的引用。C+語言的保留字為:

8、cout“輸出內(nèi)容”“輸入內(nèi)容”;/cin為標(biāo)準(zhǔn)輸入流對象(默認(rèn)從鍵盤輸入)#include 輸入重定向【例2.1】C+的輸入輸出舉例。#include / 使用名空間std,則必須去掉.h擴(kuò)展名using namespace std; void main() char name10; int age; coutname; coutage; coutname is nameendl; coutage is ageendl;補(bǔ)充(寫出程序執(zhí)行結(jié)果,假定輸入1和2)#include / 使用名空間std,則必須去掉.h擴(kuò)展名using namespace std; void main() char

9、 ch1,ch2;int n1,n2;cinch1ch2;n1=ch1-0;n2=n1*10+(ch2-0);coutn2;補(bǔ)充(寫出程序執(zhí)行結(jié)果)#include / 使用名空間std,則必須去掉.h擴(kuò)展名#includeusing namespace std; void main() int n,count=0;for(n=1;n=100;+n)coutsetfill(*)setw(10)n;count+;if(count%5=0) coutendl;程序執(zhí)行結(jié)果2.6 變量的定義 在C語言中,局部變量說明必須置于可執(zhí)行代碼段之前,不允許局部變量聲明和可執(zhí)行代碼混合在一起。但C+在變量的定

10、義上作了兩種較大的改變,一是允許變量的定義語句可以出現(xiàn)在程序的任何位置,使得局部變量的定義點(diǎn)與使用點(diǎn)不至于離得太遠(yuǎn),增強(qiáng)程序的可讀性,而且也不必在編寫某一程序塊的開始時(shí)就考慮要用到哪些變量;二是允許直接使用結(jié)構(gòu)體名定義變量,這種擴(kuò)展為程序員在編程中提供了不少方便。類似地在C+語言中聯(lián)合名、枚舉名也可在定義后獨(dú)立地作為類型名使用?!纠?.2】C+的變量定義舉例。#includeusing namespace std;void main() struct studentint no;float math; ;int n;cinn;student wang; wang.no=n;cinwang.ma

11、th;coutwang.no wang.mathendl;2.7 強(qiáng)制類型轉(zhuǎn)換格式:(數(shù)據(jù)類型) (表達(dá)式)數(shù)據(jù)類型 (表達(dá)式)(1) 通過強(qiáng)制類型轉(zhuǎn)換,得到一個(gè)所需類型的中間值,該中間值被引用后即自動(dòng)釋放。原來表達(dá)式的值類型并未改變。如下列代碼段:int b;float f;f=float(b);/ 此時(shí)變量b仍然為int類型。(2) 強(qiáng)制類型轉(zhuǎn)換符優(yōu)先級較高,只對緊隨其后的表達(dá)式起作用,而對其他部分不起作用。如表達(dá)式float(i)*f的含義是先將變量i強(qiáng)制類型轉(zhuǎn)換為float類型,然后與變量f運(yùn)算。(3) 強(qiáng)制類型轉(zhuǎn)換應(yīng)當(dāng)用在不做轉(zhuǎn)換將影響表達(dá)式結(jié)果的正確性或精度,或不能完成相應(yīng)運(yùn)算的場

12、合。而對于系統(tǒng)可以自動(dòng)轉(zhuǎn)換類型的場合,則沒有必要使用。說明:2.8 動(dòng)態(tài)內(nèi)存的分配與釋放棧內(nèi)存與堆內(nèi)存??臻g是編譯時(shí)分配的固定大小的內(nèi)存。用于存放函數(shù)調(diào)用者的地址、返回值、保存的機(jī)器狀態(tài)(用于返回)、函數(shù)參數(shù)、局部變量和臨時(shí)變量等堆內(nèi)存是程序運(yùn)行時(shí)分配的大小可變的內(nèi)存,也稱為動(dòng)態(tài)內(nèi)存C+提供了兩種方法進(jìn)行內(nèi)存動(dòng)態(tài)分配和釋放malloc()和free()(從C標(biāo)準(zhǔn)庫中繼承包含malloc.h)new和delete2.8 動(dòng)態(tài)內(nèi)存的分配與釋放1.new運(yùn)算符 指針變量 = new 數(shù)據(jù)類型; new從堆內(nèi)存中為程序分配可以保存某種類型數(shù)據(jù)的一塊內(nèi)存空間,并返回指向該內(nèi)存的首地址,該地址存放于指針變

13、量中。 堆內(nèi)存可以按照要求進(jìn)行分配,程序?qū)?nèi)存的需求量隨時(shí)會(huì)發(fā)生變化,有時(shí)程序在運(yùn)行中可能會(huì)不再需要由new分配的內(nèi)存空間,而且程序還未運(yùn)行結(jié)束,這時(shí)就需要把先前占用的內(nèi)存空間釋放給堆內(nèi)存,以后重新分配,供程序的其它部分使用。2.delete運(yùn)算符運(yùn)算符delete用于釋放new分配的內(nèi)存空間,它的使用形式為:delete 指針變量;其中的指針變量保存著new動(dòng)態(tài)分配的內(nèi)存的首地址。3. 注意:(1) 用new獲取的內(nèi)存空間,必須用delete進(jìn)行釋放;(2) 對一個(gè)指針只能調(diào)用一次delete;(3) 用delete運(yùn)算符作用的對象必須是用new分配的內(nèi)存空間的首地址。#include us

14、ing namespace std;void main()int *p;p=new int; / 分配內(nèi)存空間*p=5;cout*p;delete p; / 釋放內(nèi)存空間【例2.3】new與delete應(yīng)用舉例。(分析運(yùn)行結(jié)果)在用new分配內(nèi)存的同時(shí)進(jìn)行初始化。使用形式為:指針變量 = new 數(shù)據(jù)類型(初始值);例如上例中的:p=new int;*p=5;也可寫成:p=new int(5); 指針變量 = new 數(shù)據(jù)類型數(shù)組大?。淮藭r(shí)指針變量指向第一個(gè)數(shù)組元素的地址。使用new分配數(shù)組時(shí),不能提供初始值。使用new建立的數(shù)組變量也由delete釋放。其形式為:delete 指針變量;或d

15、elete 指針變量;同樣,也可以用new來為多維數(shù)組分配空間,但是除第一維可以為變量外,其它維數(shù)都必須是常量。4用new建立數(shù)組類型的變量 注意在使用delete時(shí),不用考慮數(shù)組的維數(shù)。有時(shí),并不能保證一定可以從堆內(nèi)存中獲得所需空間,當(dāng)不能成功地分配到所需要的內(nèi)存時(shí),new返回0,即空指針。因此我們可以通過判斷new的返回值是否為0,來得知系統(tǒng)中是否有足夠的空閑內(nèi)存來供程序使用。例如:int *p= new int100;if(p=0)cout cant allocate more memory,terminating. endl;exit(1);其中exit函數(shù)的作用是終止程序運(yùn)行。#in

16、clude using namespace std;void main() int n; / 定義數(shù)組元素的個(gè)數(shù) int *p; coutn; if(p=new intn)=0) cout cant allocate more memory,terminating. endl; exit(1); / 分配內(nèi)存空間 for( int i=0;in;i+) pi= i *2; coutNow output the array : endl; for( i=0;in;i+) coutpi ; coutendl; delete p; / 釋放內(nèi)存空間【例2.4】從堆內(nèi)存中獲取一個(gè)整型數(shù)組,賦值后并打印

17、出來。2.9 作用域運(yùn)算符: 通常情況下,如果全局變量與局部變量同名,那么局部變量在其作用域內(nèi)具有較高的優(yōu)先權(quán)。C語言規(guī)定只能在變量的作用域內(nèi)使用該變量,不能使用其他作用域中的變量,可采用C+中提供的作用域運(yùn)算符:,它能指定所需要的作用域。 注意:不能用:訪問函數(shù)中的局部變量。在C+語言中作用域運(yùn)算符:還用來限定類的成員, #include using namespace std;float a=2.4; / 全局變量void main() int a=8; / 局部變量coutaendl;cout:aendl; / :a表示全局作用域中的變量a 數(shù)組程序設(shè)計(jì)舉例1 (要求:分析運(yùn)行結(jié)果?)#

18、include void main() int x10,i,j; j=0; /計(jì)數(shù)器初值賦0 coutinput 10 numbers:endl; for(i=0;ixi; for(i=0;i0) j+; coutj=j;數(shù)組程序設(shè)計(jì)舉例1 從鍵盤上輸入10個(gè)整數(shù),統(tǒng)計(jì)其中的正整數(shù)的個(gè)數(shù) 程序運(yùn)行結(jié)果:(從鍵盤輸入:-2 3 4 -5 -3 9 -23 0 -1 21)輸出:j=4 數(shù)組程序設(shè)計(jì)舉例2 用冒泡排序法對10個(gè)數(shù)按從小到大的順序輸出思想:冒泡法的基本思想是對數(shù)組元素做若干次的遍歷調(diào)整,每次遍歷都是對相鄰的兩個(gè)數(shù)兩兩比較并調(diào)整,將小的調(diào)到前頭,大的調(diào)到后面。4739147391437

19、914379143719第一趟循環(huán)4次43719347193471934179第二趟循環(huán)3次341793417931479第三趟循環(huán)2次3147913479第四趟循環(huán)1次5個(gè)數(shù)數(shù)組程序設(shè)計(jì)舉例2 #include void main()int a11; int i,n,t; /i表示數(shù)組下標(biāo),n表示遍歷次數(shù),t用來交換數(shù)據(jù) coutinput 10 numbers:endl; for(i=1;iai; coutendl; for(n=1;n=9;n+) for(i=1;iai+1) t=ai;ai=ai+1;ai+1=t; coutthe sorted numbers:endl; for(i=

20、1;i11;i+) coutai ; coutendl;程序運(yùn)行結(jié)果:input 10 numbers:1 32 13 0 23 9 45 8 19 -7 the sorted numbers:-7 0 1 8 9 13 19 23 32 45字符數(shù)組程序設(shè)計(jì)舉例1(要求:分析運(yùn)行結(jié)果) #include #include void main() char str20; int i,j; cin.get(str,20); j=strlen(str);for(i=j-1;i=0;i-)cout.put(stri); 字符數(shù)組程序設(shè)計(jì)舉例1 從鍵盤上輸入一個(gè)字符串,然后將其逆序輸出運(yùn)行的結(jié)果是:(

21、從鍵盤輸入:abcdefg) gfedcba使用字符串常量來對字符數(shù)組初始化。例如char str10=student;或者直接將花括號省略,寫成如下的形式char str10=student;注意: 字符串常量所占的空間一定不能超過字符數(shù)組的長度。如果字符串常量占用的空間小于數(shù)組的長度,則后面的元素自動(dòng)的賦值為0 字符數(shù)組字符數(shù)組的輸出 用cout輸出。格式為:cout字符串或字符數(shù)組名;用cout流對象的put。格式為:cout.put(字符或字符變量);這種方法,每次只能輸出一個(gè)字符;要輸出整個(gè)字符串,應(yīng)采用循環(huán)的方法 #include void main()char s20=This

22、is a string.;int i=0;while(si!=0)cout.put(si);i+;字符數(shù)組的輸出 用cout流對象的write方法。格式為:cout.write(字符串或字符數(shù)組名,個(gè)數(shù)n);其作用是輸出字符數(shù)串中的前n個(gè)字符。 #include void main()char s20=This is a string.;cout.write(s,4);分析該程序的輸出結(jié)果字符數(shù)組的輸入 利用cin直接輸入。格式為:cin字符數(shù)組名;用這種方法輸入字符串時(shí),cin只能接收空格之前的部分。也就是說,當(dāng)字符串中有空格時(shí),用這種方法無法接收全部的字符串。利用cin流對象的getlin

23、e方法。格式為:cin.getline(字符數(shù)組名,輸入字符串的最大長度n);參數(shù)“字符數(shù)組名”是存放字符串的數(shù)組名稱參數(shù)“輸入字符串的最大長度n”包括了字符串結(jié)束標(biāo)記0在內(nèi) 字符串處理函數(shù) 字符串的連接函數(shù)(strcat)調(diào)用的一般形式:strcat(char ,const char );#include #include void main() char st120=qing,st2=huadaxue; strcat(st1,st2); cout字符串2,返回值0; 字符串1字符串2,返回值0 字符串、字符串2可以是字符數(shù)組也可以是字符串常量。 字符串的比較不能使用以下的形式: if(s1

24、=s2) coutyes; 只能使用該函數(shù)來進(jìn)行比較。所以應(yīng)該寫成: if(strcmp(s1,s2)=0) coutyes;字符數(shù)組程序設(shè)計(jì)舉例(功能?)#include #include void main()char str120,str220,str350; cin.getline(str1,20); cin.getline(str2,20); if (strcmp(str1,str2)0)strcpy(str3,str1); strcat(str3,str2); else strcpy(str3,str2); strcat(str3,str1); coutstr3; 字符數(shù)組程序設(shè)計(jì)

25、舉例功能程序運(yùn)行結(jié)果:(從鍵盤輸入:China Beijing)則輸出:BeijingChina從鍵盤上輸入兩個(gè)字符串,按照由小到大的順序?qū)⑵溥B接在一起二維數(shù)組定義的一般形式為類型說明符 數(shù)組名常量表達(dá)式1常量表達(dá)式2 例:int a53; 表示a為整型二維數(shù)組,其中第一維有5個(gè)下標(biāo)(04),第二維有3個(gè)下標(biāo)(02),數(shù)組的元素個(gè)數(shù)為15,可以用于存放5行3列的整型數(shù)據(jù)表格。二維數(shù)組的存儲 C+語言中,二維數(shù)組在內(nèi)存中默認(rèn)情況下采用行優(yōu)先存儲(對float a23畫存儲示意圖) 二維數(shù)組的初始化 分行對二維數(shù)組賦初值。如 int a23=1,2,3,4,5,6; 對所有數(shù)據(jù)一起賦值,放在一個(gè)花

26、括號中。如: int a23=1,2,3,4,5,6;部分元素賦值 ,如: int a23=1,2,4; 數(shù)組的元素全部賦值時(shí),可以省略數(shù)組的第一維長度 二維數(shù)組元素輸入輸出例子#include void main() int i,j,a23=3,0,1,10,-4,9; for(i=0;i=1;i+) for(j=0;j=2;j+) coutendlaij=aij;程序運(yùn)行結(jié)果:a00=3a01=0a02=1a10=10a11=-4a12=9數(shù)組程序設(shè)計(jì)舉例3 編寫程序,將一個(gè)二維數(shù)組中行和列元素互換,存到另一個(gè)二維數(shù)組中。設(shè)數(shù)組:思想:需要定義兩個(gè)數(shù)組行列交換實(shí)質(zhì)上是將數(shù)組元素的行列下標(biāo)相

27、互交換二維數(shù)組,必須要逐個(gè)的進(jìn)行交換,所以要用到了雙重循環(huán)語句 a= b=數(shù)組程序設(shè)計(jì)舉例3 #include void main() int a23=1,5,9,2,6,8; int b32,i,j; coutArray a: endl; /輸出原來數(shù)組的數(shù)據(jù) for(i=0;i2;i+) for(j=0;j3;j+) coutaij ; bji=aij; /將兩個(gè)數(shù)組元素相互交換 coutendl; coutArray b:endl; /輸出交換后的數(shù)據(jù)元素 for(i=0;i3;i+) for(j=0;j2;j+) coutbij ; coutendl; 程序運(yùn)行結(jié)果:Array a:1

28、 5 92 6 8Array b:1 25 69 8綜合程序設(shè)計(jì)舉例 #include void main() int i,j; float a1010,sum=0,x; coutinput n*n Matrix:endl; for(i=0;i10;i+) for(j=0;jx;aij=x; for(i=0;i10;i+) sum=sum+aii+ai9-i; coutthe sum is:sumendl;綜合程序設(shè)計(jì)舉例結(jié)果 一條對角線元素的下標(biāo)特點(diǎn)是:行列下標(biāo)相等。另一條對角線下標(biāo)特點(diǎn)是:行列下標(biāo)之和等于9。在每一行的每一列中找出這樣的元素然后把它加到變量sum中去。程序運(yùn)行結(jié)果:inpu

29、t 3*3 Matrix:1 3 52 4 6 7 8 9the sum is: 30思考題 從鍵盤輸入一個(gè)字符串判斷是否為“回文”比如:ABCBA從鍵盤輸入一個(gè)字符串判斷是否為“回文” #include #include void main()char str60;int i,j;cin.get(str,60);i=0;j=strlen(str)-1;while(stri=) i+; /尋找前面第一個(gè)不是空格的字符 while(strj=) j-; /尋找后面第一個(gè)不是空格的字符 while(ij & stri=strj)/前后對應(yīng)逐個(gè)的比較 i+;j-;if(ij) coutNoendl;

30、elsecoutYesendl;程序運(yùn)行結(jié)果:從鍵盤輸入:studeduts輸出的結(jié)果:Yesj從字符串的最后一個(gè)元素開始,所以初值為strlen(str)-1 開始比較時(shí),將字符串前后的空格過濾掉2.10 引用 引用是C+語言的一個(gè)特殊的數(shù)據(jù)類型描述,用于在程序的不同部分使用兩個(gè)以上的變量名指向同一地址,使得對其中任一個(gè)變量的操作實(shí)際上都是對同一地址單元進(jìn)行的。在這種兩個(gè)以上變量名的關(guān)系上,被聲明為引用類型的變量名則是實(shí)際變量名的別名。引用運(yùn)算符為&,聲明引用的一般形式為:數(shù)據(jù)類型 &引用變量名 = 變量名;或 數(shù)據(jù)類型& 引用變量名 = 變量名;或 數(shù)據(jù)類型 & 引用變量名 = 變量名;

31、對引用進(jìn)行操作,實(shí)際上就是對被引用的變量進(jìn)行操作。引用不是值,不占存儲空間,聲明引用時(shí),目標(biāo)的存儲狀態(tài)不會(huì)改變。引用一旦被初始化,就不能再重新賦值。 【例2.5】引用舉例。(圖示變量及其引用并分析運(yùn)行結(jié)果)#include void main() int num=50;int &ref=num;ref+=10;coutnum=numendl;cout ref=refendl; num+=40;cout num=numendl;coutref=refendl;說明:(1) 在一行上聲明多個(gè)引用型變量(函數(shù))名時(shí),要在每個(gè)變量(函數(shù))名前都冠以“&”符號。(2) 引用不是變量,所以引用本身不能被修

32、改,在程序中對引用的存取都是對它所引用的變量的存取。(3) 一個(gè)變量被聲明為引用時(shí)必須進(jìn)行初始化,除非這個(gè)引用是用作函數(shù)的參數(shù)或返回值,為引用提供的初始值應(yīng)為變量(包括對象)。引用一旦被初始化,就不能再重新賦值。如ref=&j;但ref=j是允許的。(4) 由于引用不是變量,所以,不能說明引用的引用,也不能說明數(shù)組元素的類型為引用數(shù)組,或指向引用的指針。例如:int &a5; / 錯(cuò)誤int &*p;/ 錯(cuò)誤由于指針也是變量,因此可以說明對指針變量的引用。例如:int *a; int *&p=a; int b; p=&b; / a指向變量b(5) 引用與指針不同。指針的內(nèi)容或值是某一變量的內(nèi)存

33、單元地址,而引用則與初始化它的變量具有相同的內(nèi)存單元地址。指針是個(gè)變量,可以把它再賦值成其它的地址,然而,建立引用時(shí)必須進(jìn)行初始化并且決不會(huì)再指向其它不同的變量。地址(6) 要注意區(qū)分引用運(yùn)算符和地址運(yùn)算符的區(qū)別。例如:int num=50;int &ref=num;int *p=&ref; /&在賦值號右邊為地址運(yùn)算符(7) 可以用一個(gè)引用初始化另一個(gè)引用。例如:int num=50;int &ref1=num;int &ref2=ref1;ref2=100;/ num被修改為100其中ref2也是對num的引用。(8)可以把函數(shù)的參數(shù)說明成引用以建立函數(shù)參數(shù)的引用傳遞方式好處:C+的引用傳

34、遞方式的實(shí)參和形參指向同一內(nèi)存地址,減少值傳遞引起的數(shù)據(jù)堆棧復(fù)制避免地址傳遞引起的地址溢出錯(cuò)誤C+提供引用的主要用途就是建立函數(shù)參數(shù)的引用傳遞方式C語言的函數(shù)參數(shù)傳遞只能采用值傳遞和地址傳遞三種傳遞方式比較的例子交換兩個(gè)數(shù)用一般變量作為參數(shù)交換兩個(gè)數(shù)采用傳值方式#include void swap(int x,int y) int t; t = x; x = y; y = t;void main() int a = 1,b = 2; cout交換前,a=a,b=bendl; swap(a,b); cout交換后,a=a,b=bendl;運(yùn)行結(jié)果:交換前,a=1,b=2交換后,a=1,b=2交換

35、功能未實(shí)現(xiàn)。說明采用傳值方式時(shí),實(shí)參不受影響 用指針變量作為參數(shù)交換兩個(gè)數(shù)采用傳址方式#include void swap(int * x,int * y) int t; t = *x; *x = *y; *y = t;void main() int a = 1,b = 2; cout交換前,a=a,b=bendl; swap(&a,&b); cout交換后,a=a,b=bendl;運(yùn)行結(jié)果:交換前,a=1,b=2交換后,a=2,b=1采用傳地址方式傳遞參數(shù)。在函數(shù)中改變了形參,就是改變了實(shí)參,因?yàn)樗麄兪侵赶蛲坏刂返闹羔樧兞?。因此交換功能實(shí)現(xiàn)用引用作為參數(shù)交換兩個(gè)數(shù)采用傳引用方式#inclu

36、de void swap(int & x,int & y) int t; t = x; x = y; y = t;void main() int a = 1,b = 2; cout交換前,a=a,b=bendl; swap(a,b); cout交換后,a=a,b=bendl;運(yùn)行結(jié)果:交換前,a=1,b=2交換后,a=2,b=1采用傳引用方式傳遞參數(shù)。函數(shù)中的形參是主調(diào)函數(shù)中實(shí)參的引用。在函數(shù)中改變了形參,就是改變了實(shí)參,因?yàn)樗麄冎赶蛲坏刂?。因此交換功能實(shí)現(xiàn)地址傳遞和引用傳遞的比較。引用作為參數(shù),主調(diào)函數(shù)可直接使用變量名地址作為參數(shù),主調(diào)函數(shù)要將變量地址傳遞過去引用作為參數(shù),函數(shù)可對形參變量

37、直接操作地址作為參數(shù),函數(shù)需通過指針對地址間接操作(9) 有空指針,無空引用(10) 引用不能用數(shù)據(jù)類型來初始化。如: int&ref=int; / error(11) 函數(shù)調(diào)用可以作為左值(函數(shù)返回值為引用類型) 引用表達(dá)式是一個(gè)左值表達(dá)式,因此它可以出現(xiàn)在形、實(shí)參數(shù)的任何一方。若一個(gè)函數(shù)返回了引用,那么該函數(shù)的調(diào)用也可以被賦值。一般說,當(dāng)返回值不是本函數(shù)內(nèi)定義的局部變量時(shí)就可以返回一個(gè)引用。在通常情況下,引用返回值只用在需對函數(shù)的調(diào)用重新賦值的場合,也就是對函數(shù)的返回值重新賦值的時(shí)候。避免將局部作用域中變量的地址返回,就使函數(shù)調(diào)用表達(dá)式作為左值來使用。函數(shù)返回值為引用類型表示該函數(shù)返回值是

38、一個(gè)變量的別名,故可將函數(shù)調(diào)用作為一個(gè)變量使用而進(jìn)行賦值【例2.8】統(tǒng)計(jì)學(xué)生中A類學(xué)生與B類學(xué)生各為多少個(gè)。A類學(xué)生的標(biāo)準(zhǔn)是平均分在80分以上,其余都是B類學(xué)生。【補(bǔ)充例子】#include int & min(int & i,int & j) if(i=j) return i; else return j;void main() int a = 3, b= 4; couta=a b=bendl; min(a,b)=5; couta=a b=bendl; min(a,b) = 0; couta=a b=bendl;【補(bǔ)充例子】#include int & min(int & i,int & j

39、)/此函數(shù)的返回值是對參數(shù)i和j中小的那個(gè)變量的引用 if(i=j) return i; else return j;void main() int a = 3, b= 4; couta=a b=bendl; min(a,b)=5; /由于函數(shù)的返回值為引用類型,所以可以為函數(shù)調(diào)用賦值 /為函數(shù)賦的值賦給兩個(gè)參數(shù)中的小者,所以a變?yōu)?,b仍為4 couta=a b=bendl; min(a,b) = 0; /a不變,b變?yōu)? couta=a b=bendl;(12)定義返回引用的函數(shù)時(shí),注意不要返回對該函數(shù)內(nèi)局部變量的引用。為什么?因?yàn)榫植孔兞康纳嫫诰窒抻诤瘮?shù)內(nèi)部,函數(shù)返回時(shí)局部變量消失,導(dǎo)

40、致函數(shù)返回一個(gè)無效的引用。故函數(shù)返回的引用是對某一個(gè)函數(shù)參數(shù)的引用且這個(gè)參數(shù)本身也是引用類型【例2.9】返回的局部作用域內(nèi)的變量,函數(shù)作為左值。2.11 const修飾符#define PI 3.1415926const float PI=3.1415926; 這個(gè)常量是有類型的,它有地址,可以用指針指向這個(gè)值,但不能修改它。C+建議用const取代#define定義常量。 注意:(1) 使用const修飾符定義常量時(shí),必須初始化;(2) 常量一旦被定義,在程序中任何地方都不能 再更改。(3) 如果用const定義的是一個(gè)整型常量,int可以省略。(4) 與#define定義的常量有所不同,c

41、onst定義的常量可以有自己的數(shù)據(jù)類型,這樣C+編譯程序可以進(jìn)行更加嚴(yán)格的類型檢查,具有良好的編譯時(shí)的檢測性。 (5) 函數(shù)參數(shù)也可以用const說明,用于保證實(shí)參在該函數(shù)內(nèi)部不被改動(dòng),大多數(shù)C+編譯器能對具有const參數(shù)的函數(shù)進(jìn)行更好的代碼優(yōu)化。例如,通過函數(shù)max求出整型數(shù)組a100中的最大值,函數(shù)原型應(yīng)該是: int max(const int *pa); 這樣做的目的是確保原數(shù)組的數(shù)據(jù)不被破壞,即在函數(shù)中對數(shù)組元素的操作只許讀,不許寫。const與指針一起使用的組合情況:(1) 指向常量的指針 指向常量的指針是指一個(gè)指向常量的指針變量。const char*pc=abcd; 聲明指向

42、常量的指針變量pc,它指向一個(gè)字符串常量由于使用了const,不允許改變指針?biāo)傅某A?,因此以下語句是錯(cuò)誤的:pc3=x;但是由于pc是一個(gè)指向常量的普通指針變量,不是常指針,因此可以改變pc的值。例如以下語句是允許的:pc=jkkk;const與指針一起使用的組合情況:(2) 常指針常指針是指指針本身,而不是它指向的對象聲明為常量。例如:char*const pc=abcd; / 常指針這個(gè)語句的含義為:聲明一個(gè)名為pc的指針變量,該指針是指向字符型數(shù)據(jù)的常指針,用“abcd”的地址初始化該常指針。創(chuàng)建一個(gè)常指針,就是創(chuàng)建不能移動(dòng)的固定指針,但是它所指的數(shù)據(jù)可以改變。例如:pc3=x; /

43、合法pc=dfasdfa; / 不合法const與指針一起使用的組合情況:(3) 指向常量的常指針整個(gè)指針本身不能改變,它所指向的值也不能改變。要聲明一個(gè)指向常量的常指針,二者都要聲明為const。例如:const char* const pc=abcd; / 指向常量的常指針這個(gè)語句的含義為:聲明一個(gè)名為pc的指針變量,它是一個(gè)指向字符型常量的常指針,用“abcd”的地址初始化該指針。以下兩個(gè)語句都是錯(cuò)誤的:pc3=x; / 錯(cuò)誤,不能改變指針?biāo)傅闹祊c=dfasdfa; / 錯(cuò)誤,不能改變指針本身2.12 字符串 除了計(jì)算外,文本處理也是編程過程中一個(gè)非常重要的方面。在C語言中使用字符數(shù)

44、組和字符指針實(shí)現(xiàn)字符串,但是在C+中提供了一種既方便又好用的string類型。下面通過一個(gè)簡單的例子說明string類型的使用?!纠?.10】字符串類string的使用。【例2.10 】#include #include /使用字符串string類型的程序應(yīng)包含頭文件using namespace std;void main()string s,t;cout請輸入一個(gè)字符串:s; / 由鍵盤輸入一行文本,并把它賦給sring類型的變量s,注意:/ 使用此方式輸入的字符串中不能包含空白字符,具體請參見7.1.2小節(jié)t=I like programming!;cout字符串的輸出:endlsend

45、ltendl;couts.append( OK!)endl; / append為string類的成員函數(shù)2.13 C+語言中函數(shù)的新特性2.13.1 函數(shù)原型(Function Prototype)2.13.2 內(nèi)聯(lián)(inline)函數(shù)2.13.3 帶缺省參數(shù)的函數(shù)2.13.4 函數(shù)重載(overload)2.13.5 函數(shù)模板(function template)C+要求為每一個(gè)函數(shù)建立原型,用以說明函數(shù)的名稱、參數(shù)個(gè)數(shù)及類型和函數(shù)返回值的類型。其主要目的是讓C+編譯程序進(jìn)行類型檢查,即形參與實(shí)參的類型匹配檢查,以及返回值是否與原型相符,以維護(hù)程序的正確性。所以應(yīng)養(yǎng)成將聲明與定義分別編寫的編

46、程習(xí)慣。函數(shù)原型與函數(shù)的定義要在函數(shù)的返回類型,函數(shù)名和參數(shù)的類型及數(shù)量這三條線上保持一致。C+中函數(shù)要經(jīng)過三個(gè)階段:先聲明,再定義,后使用。2.13.1 函數(shù)原型(Function Prototype)求44方陣中所有元素中的最大值 #include int max_element(int array44); /函數(shù)聲明void main()int p44=1,22,3,4,3,4,6,18,6,5,2,9,0,6,1,34;coutmax is :max_element(p)endl; /函數(shù)調(diào)用,二維數(shù)組名p作為參數(shù)int max_element(int array44) /函數(shù)定義in

47、t i,j,max;max=array00;for(i=0;i4;i+) for(j=0;jmax) max=arrayij;return(max);程序說明無論是一維數(shù)組名還是二維數(shù)組名作函數(shù)參數(shù),傳送的都是地址。二維數(shù)組名作函數(shù)參數(shù)時(shí),在被調(diào)用函數(shù)中對形參數(shù)組定義時(shí)可以指定每一維的大小,也可以省略第一維的大小說明。如int array4與int array44都是合法的。形參數(shù)組的類型應(yīng)與實(shí)參數(shù)組相同,它們必須是具有相同長度的一維數(shù)組所組成。不能只指定第一維而省略第二維,如int array4的寫法是錯(cuò)誤的。在第二維大小相同的前提下,形參數(shù)組的第一維可以與實(shí)參數(shù)組不同。如實(shí)參數(shù)組定義為:i

48、nt score44;而形參數(shù)組定義為:int array14;或int array94;均可以。2.13.2內(nèi)聯(lián)(inline)函數(shù)在執(zhí)行程序過程中如果要進(jìn)行函數(shù)調(diào)用,則系統(tǒng)要將程序當(dāng)前的一些狀態(tài)信息存到棧中,同時(shí)轉(zhuǎn)到函數(shù)的代碼處去執(zhí)行函數(shù)體語句,這些參數(shù)保存與傳遞的過程中需要時(shí)間和空間的開銷,使得程序執(zhí)行效率降低,特別是在程序頻繁地進(jìn)行函數(shù)調(diào)用以及函數(shù)代碼段比較少時(shí),這個(gè)問題會(huì)變得更為嚴(yán)重。為了解決這個(gè)問題,C+引入了內(nèi)聯(lián)函數(shù)機(jī)制(inline function)。(畫圖舉例)使用內(nèi)聯(lián)函數(shù)是一種用空間換時(shí)間的措施,通過將函數(shù)體的代碼直接插入到函數(shù)調(diào)用處來節(jié)省調(diào)用函數(shù)的時(shí)間開銷。2.13.2

49、內(nèi)聯(lián)(inline)函數(shù)使用內(nèi)聯(lián)函數(shù)是一種用空間換時(shí)間的措施,若內(nèi)聯(lián)函數(shù)較長,且調(diào)用太頻繁時(shí),程序?qū)⒓娱L很多。因此,通常只有較短的函數(shù)才定義為內(nèi)聯(lián)函數(shù),對于較長的函數(shù)最好作為一般函數(shù)處理。一般情況下,我們對內(nèi)聯(lián)函數(shù)做如下的限制:(1) 不能有遞歸(2) 不能包含靜態(tài)數(shù)據(jù)(3) 不能包含循環(huán)(4) 不能包含switch和goto語句(5) 不能包含數(shù)組 若一個(gè)內(nèi)聯(lián)函數(shù)定義不滿足以上限制,則編譯系統(tǒng)把它當(dāng)作普通函數(shù)對待?!纠?.11】內(nèi)聯(lián)函數(shù)的使用。 2.13.3帶缺省參數(shù)的函數(shù)如果在函數(shù)說明或函數(shù)定義中為形參指定一個(gè)缺省值,則稱此函數(shù)為帶缺省參數(shù)的函數(shù)。有對應(yīng)的實(shí)參,則用實(shí)參的值,否則用形參的缺

50、省值。當(dāng)函數(shù)調(diào)用發(fā)生后,在形參表中等號后的各“缺省值”將起實(shí)參的傳遞作用。如果函數(shù)有多個(gè)缺省參數(shù),則缺省參數(shù)必須是從右向左定義,并且在一個(gè)缺省參數(shù)的右邊不能有未指定缺省值的參數(shù)。 void fun(int a=3,int b=6,int c,int d);void fun(int a=65,int b=3,int c,int d=3);需要特別注意的是如果在函數(shù)原型的聲明中設(shè)置了函數(shù)參數(shù)的缺省值,則不可再在函數(shù)定義的頭部重復(fù)設(shè)置,否則編譯時(shí)將出現(xiàn)錯(cuò)誤信息。求3個(gè)正整數(shù)中的最大數(shù)(分析運(yùn)行結(jié)果)#include void main() int max(int a,int b,int c=0);

51、/*能否移到main外面*/ int a,b,c; cinabc; coutmax(a,b,c)= max(a,b,c)endl; coutmax(a,b)= max(a,b)a) a=b; if (ca) a=c; return a;運(yùn)行結(jié)果:19 2 56max(a,b,c)=max(a,b)=2.13.4函數(shù)重載(overload)C+編譯系統(tǒng)允許為兩個(gè)或兩個(gè)以上的函數(shù)取相同的函數(shù)名,但是形參的個(gè)數(shù)或者形參的類型不應(yīng)相同,編譯系統(tǒng)會(huì)根據(jù)實(shí)參和形參的類型及個(gè)數(shù)的最佳匹配,自動(dòng)確定調(diào)用哪一個(gè)函數(shù),這就是所謂的函數(shù)重載。C+允許用一個(gè)函數(shù)名定義多個(gè)函數(shù),這些函數(shù)的參數(shù)個(gè)數(shù)和參數(shù)類型不同,稱為重

52、載函數(shù)。即對一個(gè)函數(shù)名重新賦予新的含義,使一個(gè)函數(shù)名可以多用函數(shù)重載無需特別聲明,只要所定義的函數(shù)與已經(jīng)定義的同名函數(shù)形參形式不完全相同,C+編譯器就認(rèn)為是函數(shù)的重載。【例2.12】重載函數(shù)應(yīng)用舉例 #include int max(int x,int y) int z; z = (xy?x:y); return z;float max(float x,float y) float z; z = (xy?x:y); return z;void main() int num1,num2; float num3,num4; cinnum1num2num3num4; coutmax(num1,num

53、2)= max(num1,num2)endl; coutmax(num3,num4)= max(num3,num4)endl;在使用重載函數(shù)時(shí)要注意: 不可以定義兩個(gè)具有相同名稱、相同參數(shù)類型和相同參數(shù)個(gè)數(shù),只是函數(shù)返回值不同的函數(shù)。int func(int x);float func(int x); 如果某個(gè)函數(shù)參數(shù)有缺省值,必須保證其參數(shù)缺省后調(diào)用形式不與其它函數(shù)混淆。int f(int a, float b);void f(int a, float b, int c=0);函數(shù)調(diào)用語句:f(10, 2.0);具有二義性,既可以調(diào)用第一個(gè)函數(shù),也可以調(diào)用第二個(gè)函數(shù),編譯器不能根據(jù)參數(shù)的形式

54、確定到底調(diào)用哪一個(gè)。使用函數(shù)重載的條件 函數(shù)名相同,函數(shù)的返回值類型可以不同,但各函數(shù)的參數(shù)表中,參數(shù)個(gè)數(shù),類型或順序應(yīng)有所不同類型名 func(double,int);類型名 func(int,double); /函數(shù)形參順序不同類型名 func(int); /函數(shù)形參數(shù)目不同類型名 func(double,double); /函數(shù)形參類型不同這樣就形成了函數(shù)的重載 2.13.5函數(shù)模板(function template) C+語言中可以使用模板來避免在程序中多次書寫相同的代碼。所謂模板是一種使用無類型參數(shù)來產(chǎn)生一系列函數(shù)或類的機(jī)制,模板是以一種完全通用的方法來設(shè)計(jì)函數(shù)和類,而不必預(yù)先說明

55、將被使用的每個(gè)對象的數(shù)據(jù)類型。通過模板可以產(chǎn)生類或函數(shù)的集合,使它們操作不同的數(shù)據(jù)類型,從而避免為每一種數(shù)據(jù)類型產(chǎn)生一個(gè)單獨(dú)的類或函數(shù)。模板分為函數(shù)模板和類模板。C+提供函數(shù)模板,可以進(jìn)一步提高程序代碼的可重復(fù)利用程度。只要實(shí)現(xiàn)一個(gè)函數(shù)模板就可以用這個(gè)模板生成許多具體的函數(shù)(模板的實(shí)例化)模板函數(shù)1.函數(shù)模板函數(shù)模板的一般說明形式如下:template (模板函數(shù)形參表) / 函數(shù)定義體尖括號中不能為空,參數(shù)可以有多個(gè),用逗號分開。模板參數(shù)主要是模板類型參數(shù)。模板類型參數(shù)(template type parameter)代表一種類型,由關(guān)鍵字 class 或 typename后加一個(gè)標(biāo)識符構(gòu)成

56、,在這里兩個(gè)關(guān)鍵字的意義相同,它們表示后面的參數(shù)名代表一個(gè)基本數(shù)據(jù)類型或用戶定義的類型。 如果類型形參多于一個(gè),則每個(gè)類型形參都要使用class或typename。中的參數(shù)必須是唯一的,而且中至少出現(xiàn)一次。 如:template ,則“T”可以在程序運(yùn)行時(shí)被任何C+語言支持的數(shù)據(jù)類型所取代。如有兩個(gè)以上的模板參數(shù)時(shí),使用逗號分隔,如:“template”。由于模板是專門為函數(shù)安排的,所以模板聲明語句必須置于與其相關(guān)的函數(shù)聲明或定義語句之前,但附于函數(shù)聲明語句和定義語句前的模板參數(shù)表的替代類型標(biāo)識符可以不一致。 函數(shù)模板定義不是一個(gè)實(shí)實(shí)在在的函數(shù),編譯系統(tǒng)不為其產(chǎn)生任何執(zhí)行代碼?!纠?.13】編

57、寫一個(gè)對具有n個(gè)元素的數(shù)組a求最小值的程序,將求最小值的函數(shù)設(shè)計(jì)成函數(shù)模板。2.模板函數(shù)函數(shù)模板只是說明,不能直接執(zhí)行,需要實(shí)例化為模板函數(shù)后才能執(zhí)行。當(dāng)編譯系統(tǒng)發(fā)現(xiàn)有一個(gè)函數(shù)調(diào)用: ; 時(shí),將根據(jù)中的類型生成一個(gè)重載函數(shù),即模板函數(shù)。該模板函數(shù)的定義體與函數(shù)模板的函數(shù)定義體相同,而的類型則以的實(shí)際類型為依據(jù)。模板函數(shù)有一個(gè)特點(diǎn),雖然模板參數(shù)T可以實(shí)例化成各種類型,但是采用模板參數(shù)T的各參數(shù)之間必須保持完全一致的類型。模板類型并不具有隱式的類型轉(zhuǎn)換,例如在int與char之間、float與int之間、float與double之間等的隱式類型轉(zhuǎn)換。函數(shù)模板方法克服了C語言用大量不同函數(shù)名表示相似功能的壞習(xí)慣;克服了宏定義不能進(jìn)行參數(shù)類型檢查的弊端;克服了C+函數(shù)重載用相同函數(shù)名字重寫幾個(gè)函數(shù)的煩瑣。#include (改為模板形式)int max(int x,int y) int z; z = (xy?x:y); return z;float max(float x,float y) float z; z = (xy?x:

溫馨提示

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

最新文檔

評論

0/150

提交評論