面向?qū)ο蟪绦蛟O(shè)計(jì)(譚浩強(qiáng)版)_第1頁
面向?qū)ο蟪绦蛟O(shè)計(jì)(譚浩強(qiáng)版)_第2頁
面向?qū)ο蟪绦蛟O(shè)計(jì)(譚浩強(qiáng)版)_第3頁
面向?qū)ο蟪绦蛟O(shè)計(jì)(譚浩強(qiáng)版)_第4頁
面向?qū)ο蟪绦蛟O(shè)計(jì)(譚浩強(qiáng)版)_第5頁
已閱讀5頁,還剩494頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)第1章C++的初步知識第2章類和對象第3章關(guān)于類和對象的進(jìn)一步討論第4章運(yùn)算符重載第5章繼承與派生第6章多態(tài)性與虛函數(shù)第7章輸入輸出流第8章C++工具內(nèi)容簡介面向?qū)ο蟮母舅枷隒++語言的根本概念、根本語法和編程方法C++語言的面向?qū)ο筇卣黝惻c對象繼承與派生多態(tài)性與虛函數(shù)學(xué)習(xí)方法多練習(xí),掌握根本概念多讀程序,學(xué)習(xí)編程方法與技巧多上機(jī)實(shí)踐,加強(qiáng)動手能力多剖析范例,積累編程經(jīng)驗(yàn)教材及參考書目C++語言根底教程.呂鳳翥著.清華大學(xué)出版社.1999C++語言及其程序設(shè)計(jì)教程〔修訂版〕.張國峰編著.電子工業(yè)出版社.1997C++語言程序設(shè)計(jì).鄭莉等編著.清華大學(xué)出版社.1999VisualC++程序設(shè)計(jì).王育堅(jiān)編著.清華大學(xué)出版社第1章C++初步知識1.1從C到C++1.2最簡單的C++程序1.3C++對C的擴(kuò)充1.4C++程序的編寫和實(shí)現(xiàn)1.5關(guān)于C++上要實(shí)踐1.6C++程序的結(jié)構(gòu)1.1從C到C++機(jī)器語言〔二進(jìn)制碼〕匯編語言20世紀(jì)50年代中期,F(xiàn)ORTRAN語言20世紀(jì)50年代中期,Algol語言在計(jì)算機(jī)語言開展史上具有劃時代的意義,引入了許多程序設(shè)計(jì)概念。如變量、數(shù)組、循環(huán)、分支等。提出塊(Begin…End)思想,對數(shù)據(jù)進(jìn)行保護(hù),是一種初級封裝。20世紀(jì)60年代中期,Simula67語言

面向?qū)ο笳Z言的鼻祖,提出了對象、類的概念,并支持類的繼承。20世紀(jì)70年代中期,Ada語言

支持?jǐn)?shù)據(jù)抽象類型的最重要的語言之一,但不完全支持繼承。20世紀(jì)70年代中期,Smalltalk語言

最有影響的面向?qū)ο笳Z言之一,豐富了面向?qū)ο蟮母拍睢?0世紀(jì)80年代中期后出現(xiàn)C++等多種面向?qū)ο笳Z言1.1從C到C++C語言的主要特點(diǎn)是:1、C語言是一種結(jié)構(gòu)化的程序設(shè)計(jì)語言,語言本身簡潔、使用靈活方便。既適用于設(shè)計(jì)和編寫大的系統(tǒng)程序,又適用于編寫小的控制程序,也適用科學(xué)計(jì)算。2、它既有高級語言的特點(diǎn),又具有匯編語言的特點(diǎn)。運(yùn)算符豐富,除了提供對數(shù)據(jù)的算術(shù)邏輯運(yùn)算外,還提供了二進(jìn)制的位運(yùn)算。并且也提供了靈活的數(shù)據(jù)結(jié)構(gòu)。用C語言編寫的程序表述靈活方便,功能強(qiáng)大。用C語言開發(fā)的程序,其結(jié)構(gòu)性好,目標(biāo)程序質(zhì)量高,程序執(zhí)行效率高。3、程序的可移植性好。用C語言在某一種型號的計(jì)算機(jī)上開發(fā)的程序,根本上可以不作修改,而直接移植到其它型號和不同檔次的計(jì)算機(jī)上運(yùn)行。4、程序的語法結(jié)構(gòu)不夠嚴(yán)密,程序設(shè)計(jì)的自由度大。這對于比較精通C語言的程序設(shè)計(jì)者來說,可以設(shè)計(jì)出高質(zhì)量的非常通用的程序。但對于初學(xué)者來說,要能比較熟練運(yùn)用C語言來編寫程序,并不是一件容易的事情。與其它高級語言相比而言,調(diào)試程序比較困難。往往是編好程序輸入計(jì)算機(jī)后,編譯時容易通過,而在執(zhí)行時還會出錯。但只要對C語言的語法規(guī)那么真正領(lǐng)會,編寫程序及調(diào)試程序還是比較容易掌握的。隨著C語言應(yīng)用的推廣,C語言存在的一些缺陷或缺乏也開始流露出來,并受到大家的關(guān)注。如:C語言對數(shù)據(jù)類型檢查的機(jī)制比較弱;缺少支持代碼重用的結(jié)構(gòu);隨著軟件工程規(guī)模的擴(kuò)大,難以適應(yīng)開發(fā)特大型的程度等等。為了克服C語言本身存在的缺點(diǎn),并保持C語言簡潔、高效,與匯編語言接近的特點(diǎn),1980年,貝爾實(shí)驗(yàn)室的BjarneStroustrup博士及其同事對C語言進(jìn)行了改進(jìn)和擴(kuò)充,并把Simula67中類的概念引入到C中。并在1983年由RickMaseitti提議正式命名為C++〔CPlusPlus〕。后來,又把運(yùn)算符的重載、引用、虛函數(shù)等功能參加到C++中,使C++的功能日趨完善。當(dāng)前用得較為廣泛的C++有:VC++〔VisualCPlusPlus〕、BC++〔BorlandCPlusPlus〕、AT&TC++等。一、C++的起源在C語言根底上為支持面向?qū)ο蟮某绦蛟O(shè)計(jì)研制的一個通用目的的程序設(shè)計(jì)語言;由AT&T貝爾實(shí)驗(yàn)室BjarneStroustrup博士開發(fā);二、C++的特點(diǎn)與C兼容,既保持了C的簡潔、高效和接近匯編的特點(diǎn),又比C更平安,結(jié)構(gòu)化程度更高;既支持面向過程的程序設(shè)計(jì),又支持面向?qū)ο蟮某绦蛟O(shè)計(jì);注意其兩面性1.1從C到C++必須先研究事物,而后才能研究過程。必須先知道一個事物是什么,而后才能覺察這個事物中所發(fā)生的變化。《路德維?!べM(fèi)爾巴哈和德國古典文學(xué)的終結(jié)》恩格斯

三、面向?qū)ο蟮姆椒?.1從C到C++1.2最簡單的C++程序例1.1:輸出一行字符:“ThisisaC++program.〞#include<iostream>//用cout輸出時需要用此頭文件usingnamespacestd;//使用命名空間std(276)intmain(){cout<<"ThisisaC++Program.\n";//用cout的方法輸出一行return0;}1.2最簡單的C++程序分析:(1)main前的int;return0;表示正常返回(2)/*……*/多行注釋,不能嵌套定義(3)cout(c、out),輸出對流類的一個對象(4)頭文件<iostream>,i-o-stream,輸入輸出流類(5)usingnamespacestd;命名空間std,表示要用到命名空間std的內(nèi)容?!?73頁〕1.2最簡單的C++程序cout:輸出(1)cout<<a<<b;(2)cout<<a,b,c;(3)續(xù)行符“\〞(4)cout<<“hello\n〞;//原樣輸出字符串(5)cout<<“a=〞<<a<<endl;錯換行1.2最簡單的C++程序例1.2:求a和b兩個數(shù)之和。#include<iostream>//用cout輸出時需要用此頭文件usingnamespacestd;//使用命名空間stdintmain(){//函數(shù)體開始inta,b,sum;//定義變量cin>>a>>b;//輸入語句sum=a+b;//賦值語句cout<<"a+b="<<sum<<endl;//輸出語句return0;//如程序正常結(jié)束,向操作系統(tǒng)返回一個零值}參考9頁1.2最簡單的C++程序#include<iostream>usingnamespacestd;intmain(){intmax(intx,inty);inta,b,c;cin>>a>>b;c=max(a,b);//函數(shù)調(diào)用cout<<"max="<<c<<endl;return0;}例1.3:輸入兩個數(shù)x和y,求兩數(shù)中的大者。intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}函數(shù)聲明1.2最簡單的C++程序例1.4:輸入任意短語或句子,計(jì)算該短語包含多少個字(word)和字符(character)。注意:輸入短語時,必須在字和字之間只空一格。面向過程的方法#include<stdio.h>#include<conio.h>voidmain(){charch;intwdcount,chcount;wdcount=1;chcount=0;printf("***:Pleaseinputanyphrase…\n");while((ch=getche())!='\r'){chcount++;1.2最簡單的C++程序if(ch=='')wdcount++;}printf("\n***:Thenumberofwordis

%d\n",wdcount);printf("\n***:Thenumberofcharis

%d\n",chcount);}面向?qū)ο蟮姆椒?include<iostream.h>#include<conio.h>classcount{public:定義類公有成員1.2最簡單的C++程序〔續(xù)〕count();voidprocess();voiddisplay();private:intwdcount,chcount;};count::count(){wdcount=1;chcount=0;}voidcount::process(){私有成員構(gòu)造函數(shù)成員函數(shù)數(shù)據(jù)成員1.2最簡單的C++程序charch;cout<<"***:Pleaseinputanyphrase…"<<endl;while((ch=getche())!='\r'){chcount++;if(ch=='')wdcount++;}cout<<endl;}voidcount::display(){printf("\n***:Thenumberofwordis

%d\n",wdcount);1.2最簡單的C++程序〔續(xù)〕printf("\n***:Thenumberofcharis

%d\n",chcount);}voidmain(){countA;A.process();A.display();}運(yùn)行結(jié)果***Pleaseinputanyphrase...Iamateacher***:Thenumberofwordis4***:Thenumberofcharis15定義對象調(diào)用公有成員函數(shù)1.2最簡單的C++程序〔續(xù)〕一、面向過程與面向?qū)ο蟪绦蛟O(shè)計(jì)是一種數(shù)學(xué)思維或計(jì)算機(jī)思維方法,與人們認(rèn)識世界的方法不同以不穩(wěn)定的、多變的“過程〞和“操作〞為中心來構(gòu)造系統(tǒng)可重用性較差是建立在認(rèn)識方法學(xué)根底上的一項(xiàng)技術(shù)科學(xué),比較自然地模擬了人類認(rèn)識客觀世界的方式;以相對穩(wěn)定的“對象〞和“數(shù)據(jù)結(jié)構(gòu)〞為中心來構(gòu)造系統(tǒng)可重用性較好面向過程程序設(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)一、面向過程與面向?qū)ο蟪绦蛟O(shè)計(jì)面向過程程序設(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)P1P2P3P4P5O1O2O3O4O5Changing?P6一、面向過程與面向?qū)ο蟪绦蛟O(shè)計(jì)面向過程程序設(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)P1P2P3P5O1O2O3O4O5Changing?P6O4二、抽象在面向?qū)ο笾械淖饔芒瘛⒊橄蟮母拍畛橄蟠碇粋€對象的本質(zhì)特征,這個特征將這個對象與所有其他種類的對象區(qū)別開來;抽象是通過從特定的實(shí)例中抽取共同的性質(zhì)以形成一般化的概念的過程;抽象具有層次;汽車輪船飛機(jī)交通工具二、抽象在面向?qū)ο笾械淖饔?續(xù))Ⅱ、面向?qū)ο蟪橄蟮脑怼裁嫦驅(qū)ο笥?jì)算的本質(zhì)〕數(shù)據(jù)抽象、行為共享、進(jìn)化、確定性1、數(shù)據(jù)抽象為程序員提供了一種對數(shù)據(jù)和為操作這些數(shù)據(jù)所需要的算法的抽象;是面向?qū)ο蠓椒ǖ暮诵模ǎ耗K化:構(gòu)成了面向?qū)ο笥?jì)算的本質(zhì);信息隱藏:將一個模塊的細(xì)節(jié)局部對用戶隱藏起來,用戶只能通過一個受保護(hù)的接口來訪問某個模塊,而不能直接訪問一個模塊內(nèi)部的細(xì)節(jié);類公有成員二、抽象在面向?qū)ο笾械淖饔?續(xù))2、行為共享行為是由實(shí)體的外部接口定義的行為共享指許多實(shí)體具有相同的接口,可增加系統(tǒng)的靈活性;支持行為共享的方式分類與層次分類多態(tài)與繼承對象公有成員函數(shù)名二、抽象在面向?qū)ο笾械淖饔?續(xù))3、進(jìn)化需求進(jìn)化〔虛函數(shù)〕進(jìn)化式的問題求解〔繼承的構(gòu)造函數(shù)〕4、確定性確保每個行為項(xiàng)都有一個正確的解釋,系統(tǒng)不會因不能響應(yīng)某一行為而失??;確定性與類型的正確性有關(guān);三、面向?qū)ο笥?jì)算的根本特征面向?qū)ο笙到y(tǒng)的三要素:對象、類和繼承;〔一〕、對象1、概念上對象是代表著正在創(chuàng)立的系統(tǒng)中的一個實(shí)體;2、實(shí)現(xiàn)形式上對象是一個狀態(tài)和操作〔或方法〕的封裝體;3、對象的定義狀態(tài):對象的狀態(tài)由這個對象的屬性和這些屬性的當(dāng)前值決定。屬性是靜態(tài)的,當(dāng)前值是動態(tài)的;一個對象具有狀態(tài)、行為和標(biāo)識。三、面向?qū)ο笥?jì)算的根本特征(續(xù))行為:一個對象如何以狀態(tài)變化和消息傳遞的形式進(jìn)行作用和對外界進(jìn)行反響。一個對象的行為代表了這個對象的外部可見的和可測試的活動;一個對象的狀態(tài)代表著它的行為的累積結(jié)果;標(biāo)識:標(biāo)識是一個對象固有的一種特性,該特性將這個對象與其他對象區(qū)別開來;屬性1屬性2...屬性n值11值21...值n1值12值22...值n2對象1行為值11值21...值n1值12值22...值n2對象2行為三、面向?qū)ο笥?jì)算的根本特征(續(xù))4、對象的分類實(shí)體對象界面對象控制對象按作用分類存儲信息的對象支持系統(tǒng)的主要功能5、對象確實(shí)認(rèn)創(chuàng)造對象:主要是控制對象;發(fā)現(xiàn)對象:主要是實(shí)體對象或界面對象;〔二〕、類1、什么是類三、面向?qū)ο笥?jì)算的根本特征(續(xù))類是創(chuàng)立對象的樣板,它包含著所創(chuàng)立對象的狀態(tài)描述和方法的定義。類的完整描述包含了外部接口和內(nèi)部算法以及數(shù)據(jù)結(jié)構(gòu)的形式;2、類是對象的抽象及描述類中包含生成對象的具體方法,由一個類所創(chuàng)立的對象稱為該類的實(shí)例;3、類是抽象數(shù)據(jù)類型的實(shí)現(xiàn)類是所有對象的共同的行為和不同的狀態(tài)的集合體;〔三〕、繼承繼承提供了創(chuàng)立新類的一種方法,它的本質(zhì)特征是行為共享;屬性1屬性2……屬性n行為1行為2……行為m值11值21……值n1值12值22……值n2行為1值11值21……值n1行為m值12值22……值n2對象1對象2對象k對象p類類與對象的關(guān)系三、面向?qū)ο笥?jì)算的根本特征(續(xù))四、C++語言中的抽象支持控制抽象:用于排列任意動作的順序的一種方法;三種語句控制結(jié)構(gòu):順序、循環(huán)、分支過程抽象〔面向過程〕:對一組輸入數(shù)據(jù)的一個計(jì)算動作和產(chǎn)生的輸出結(jié)果;數(shù)據(jù)抽象〔面向?qū)ο蟆常侯愂菍?shí)現(xiàn)抽象數(shù)據(jù)類型的工具;五、C++對面向?qū)ο蟪绦蛟O(shè)計(jì)方法的支持C++支持?jǐn)?shù)據(jù)封裝〔數(shù)據(jù)抽象〕C++中,類是支持?jǐn)?shù)據(jù)封裝的工具,對象那么是數(shù)據(jù)封裝的實(shí)現(xiàn);C++中包含有私有、公有和保護(hù)成員

每個可能的消息對應(yīng)一個相應(yīng)的方法,方法通過函數(shù)來定義;C++中通過發(fā)送消息來處理對象C++中允許友元破壞封裝性C++中允許函數(shù)名和運(yùn)算符重載C++支持繼承性C++支持動態(tài)聯(lián)編六、C++對C語言的改進(jìn)增加了新的運(yùn)算符:::,new,delete等;改進(jìn)了類型系統(tǒng),增加了平安性;引進(jìn)了引用概念;允許函數(shù)重載,允許設(shè)置缺省參數(shù),提高了編程的靈活性;引進(jìn)了內(nèi)聯(lián)函數(shù),提高了程序的效率;可以根據(jù)需要隨時對變量進(jìn)行說明;七、C++程序的編輯、編譯和運(yùn)行〔一〕、編輯:源文件的擴(kuò)展名為.cpp〔二〕、編譯1、預(yù)處理過程詞法分析:單詞語法分析:構(gòu)造程序的格式符號表:程序中的各種符號及其屬性錯誤處理程序:生成目標(biāo)代碼:目標(biāo)文件擴(kuò)展名.obj2、編譯過程3、連接過程:可執(zhí)行文件擴(kuò)展名.exe三、運(yùn)行八、C++程序的編輯、編譯和運(yùn)行(續(xù))源程序.cpp目標(biāo)文件.obj可執(zhí)行文件.exe編譯器連接器磁盤中的#include文件C++庫文件.LIB編譯過程:1〕啟動VisualC++,選擇“文件〞菜單中的“新建〞命令,選擇“文件〞標(biāo)簽中的“C++SourceFile〞選項(xiàng)。2〕選擇源程序存放的目錄和輸入源程序名,單擊“確定〞。3〕在編輯器中編寫源程序。4〕單擊F7或“編譯〞中的“重建全部〞編譯源程序,假設(shè)編譯通過,單擊“執(zhí)行〞,在DOS屏上看結(jié)果,任按一鍵返回編輯器。啟動VC++編譯系統(tǒng)VC++編譯系統(tǒng)界面單擊“File〞菜單中“New〞命令選擇“Files〞選項(xiàng)卡選擇C++源文件命令輸入文件名輸入文件存放位置單擊選擇驅(qū)動器選擇驅(qū)動器或目錄C++源文件編輯界面輸入C++源代碼可以將此源代碼另起文件名存盤選擇編譯命令,將源文件.cpp生成.obj文件如果編譯出錯,會出現(xiàn)提示信息,指出錯誤的位置及種類錯誤所在行錯誤的原因雙擊錯誤所在行光標(biāo)移到該行生成可執(zhí)行文件通過后單擊該命令運(yùn)行程序運(yùn)行結(jié)果顯示在DOS屏上注意:不可以在軟盤上運(yùn)行程序!應(yīng)該把保存在軟盤中的源文件拷貝到硬盤的目錄中再運(yùn)行!源程序所在目錄未編譯前,只有一個源程序編譯運(yùn)行后,出現(xiàn)眾多附加文件同時,產(chǎn)生一個子目錄DebugDebug目錄中,有obj和EXE文件補(bǔ):C++的字符集大小寫的英文字母:a~z,A~Z數(shù)字字符:0~9特殊字符詞法記號1、關(guān)鍵字〔保存字〕表1-1C++的關(guān)鍵字詞法記號〔續(xù)〕2、標(biāo)識符組成規(guī)那么:以字母或下劃線開始,其后跟零個或多個字母、數(shù)字或下劃線;不能以數(shù)字開始正確標(biāo)識符:Result,DoubleList,_first,first_錯誤標(biāo)識符:1first標(biāo)識符的長度任意〔受編譯器限制〕;區(qū)分字母的大小寫;不能使用系統(tǒng)的保存字;例如:ADD,Add,add詞法記號〔續(xù)〕3、運(yùn)算符單目雙目三目運(yùn)算符5、分隔符(){},分隔符:4、各種文字?jǐn)?shù)字字符文字串文字文字布爾文字;空白一、空白包括:空格、制表符、換行符、注釋功能:指示詞法記號的開始和結(jié)束位置;二、注釋/*……*///C++程序的結(jié)構(gòu)一、C++示范程序#include<iostream.h>voidmain(){cout<<"Helloworld!"<<endl;}二、C++程序的組成預(yù)處理命令輸入輸出函數(shù)語句變量其他I/O流庫,提供所有的輸入輸出操作cout:流類對象<<:插入符提供屏幕輸出;提供鍵盤輸入:cin:流類對象>>:提取符例如:cin>>"Pleaseinputtwointegers:";cin>>a>>b;endl:換行;1.3.1C++的輸入輸出1、用cout進(jìn)行輸出舉例:如果要輸出a=2,b=3,c=4(假設(shè)已賦值〕cout<<"a="<<a<<','<<"b="<<b<<','<<"c=“<<c<<endl;2、用cin進(jìn)行輸入舉例:cin>>a>>b>>c;cin>>a;cin>>b;cin>>c;1.3C++對C的補(bǔ)充根本數(shù)據(jù)類型一、根本數(shù)據(jù)類型整型int浮點(diǎn)型(實(shí)型)字符型char根本數(shù)據(jù)類型邏輯型bool空值型void單精度浮點(diǎn)數(shù)float雙精度浮點(diǎn)數(shù)double用于函數(shù)和指針根本數(shù)據(jù)類型〔續(xù)〕二、數(shù)據(jù)類型修飾符signed:有符號unsigned:無符號short:短型long:長型說明:3)

long修飾符還適用于雙精度浮點(diǎn)數(shù);2)上述修飾符均可用于整型和字符型;1)類型修飾符可以修飾除void、bool類型以外的其他類型;根本數(shù)據(jù)類型〔續(xù)〕三、根本數(shù)據(jù)類型列表表2-1C++的基本數(shù)據(jù)類型根本數(shù)據(jù)類型〔續(xù)〕說明:1)表中的[int]可以省略,即在int之前有修飾符出現(xiàn)時,可以省略關(guān)鍵字int;2)單精度類型float、雙精度類型double、長精度類型longdouble統(tǒng)稱浮點(diǎn)類型;3)char類型和各種int類型統(tǒng)稱整型類型;char類型變量在內(nèi)存中以它的ASCII碼值的形式存儲;4)字寬〔字節(jié)〕取決于操作系統(tǒng)和編譯器的實(shí)現(xiàn),可用sizeof驗(yàn)證;常量一、整型常量〔無小數(shù)局部〕1、表示方法十進(jìn)制八進(jìn)制十六進(jìn)制2、十進(jìn)制表示由0~9的數(shù)字組成不能以0開始無前綴例:132,-3453、八進(jìn)制表示由0~7的數(shù)字組成以0為前綴例:010,-05364、十六進(jìn)制表示由0~9的數(shù)字及A~F的字母(大小寫均可)組成以0x或0X為前綴例:0x7A,-0X3de常量〔續(xù)〕5、說明:1)長整型用L〔或l〕做后綴表示。例如:32765L,793l;2)無符號型用U〔或u〕做后綴表示。例如:4352U,3100u;3)unsignedlong型用后綴U〔或u〕和L〔或l〕一起表示,L與U的先后順序無關(guān)。例如:49321ul,37825LU,41152Lu;4)無后綴時,整型常量類型按如下順序確定:

int,(unsigned),long,unsignedlong十進(jìn)制時無常量〔續(xù)〕二、浮點(diǎn)型常量由整數(shù)局部和小數(shù)局部構(gòu)成;只有十進(jìn)制表示;一般表示形式〔小數(shù)表示形式〕:整數(shù)局部與小數(shù)局部可以省去一局部,但不能全部省去;例如:5.,.25,4.07常量〔續(xù)〕科學(xué)表示形式:在小數(shù)表示法后面加E〔或e〕表示指數(shù);例如:23.5E6,.032E-5,.3e10指數(shù)局部可正可負(fù),但必須為整數(shù);浮點(diǎn)常量的缺省數(shù)據(jù)類型為double型;后綴F〔或f〕表示float類型;后綴l〔或l〕表示longdouble類型;常量〔續(xù)〕三、字符常量由一對單引號括起的一個字符表示;其值為所括起字符在ASCII表中的編碼;所括起字符的表示方法:圖形表示法該方法適用于有圖形符號的可打印字符;例如:'A','a','*'轉(zhuǎn)義序列表示法該方法適用于所有字符,尤其是無圖形符號的不可打印字符;常量〔續(xù)〕轉(zhuǎn)義序列表示方法:以反斜線(\)開頭,后跟字符的ASCII碼值;八進(jìn)制表示:\ddd;例如:\101十六進(jìn)制表示:\xhh;例如:\x41表2-2C++中常用轉(zhuǎn)義序列符常量〔續(xù)〕四、布爾常量有兩個值:true和false;五、字符串常量〔串常量,字符串〕一對雙引號括起的字符序列,字符序列可以包含空格、轉(zhuǎn)義序列或任何其他字符,這些字符不一定是C++字符集中的字符,只要C++編譯器支持即可;例如:"Thisisastring;"串常量與字符常量的區(qū)別:常量〔續(xù)〕由一個字符型變量存放由一維數(shù)組存放字符常量串常量用單引號括起用雙引號括起字符串有一個結(jié)束符,該結(jié)束符用'\0'表示字符常量'a'在內(nèi)存中占用一個字節(jié)字符串常量"a"在內(nèi)存中占用兩個字節(jié)可進(jìn)行加、減法運(yùn)算可進(jìn)行連接、拷貝運(yùn)算常量〔續(xù)〕六、符號常量用來表示C++中的常量,即用一個與常量相關(guān)的標(biāo)識符來替代常量;優(yōu)點(diǎn):增加可讀性,增強(qiáng)可維護(hù)性;例如:PI表示3.1415926定義方法:使用類型說明符const;例如:constintsize=80;定義的符號常量必須初始化;一個符號常量可看作是一個只讀變量,由const定義的常量的值不可以改變;與#define的區(qū)別?1.3.2用const定義常變量宏定義:(1)#definePI3.14159(2)#defineA2#defineB3#defineCA+Bcout<<B*C;(3)#defineMAX(a,b)return(a>b?a:b)

1.3C++對C的補(bǔ)充注意:(1)只是替換(2)沒有類型檢驗(yàn)(3)而且是在編譯前進(jìn)行,不分配存儲空間(4)末尾沒有分號,有分號作為宏體的一局部(5)不能有單行注釋(6)位置只在文件的上方

1.3C++對C的補(bǔ)充用const定義符號常量的方法:(1)intconsta=3;(2)constinta=3;注意:位置可以任意(局部和全局)要帶分號有類型檢測,有空間分配,是編譯時決定的,其它變量是運(yùn)行時決定一旦定義后,不能作為左值

1.3C++對C的補(bǔ)充常指針Line1: #include<iostream.h>Line2: constdoublepi=3.1415;Line3: constdoubler;Line4: voidmain()Line5: {Line6: doubleperimeter,area;Line7: perimeter=2*pi*r;Line8: pi=3.14;Line9: area=pi*r*r;Line10: cout<<perimeter<<","<<area<<endl;Line11: }

常量〔續(xù)〕constdoubler=3.2;錯誤錯誤,不能修改pi的值#define與const定義符號常量的區(qū)別const產(chǎn)生一個具有類型的符號#define僅產(chǎn)生文本替換,而不管內(nèi)容是否正確constdoublePI=3.1415;#definePI3.1415使用const可以定義一個局部常量,可局部在一個函數(shù)體內(nèi)用#define定義的常量的作用域是從定義時開始,直到使用#undef取消定義時為止,如果不取消定義,直到整個文件結(jié)束使用const定義常量是一個說明語句,用分號(;)結(jié)束使用#define定義常量是一個預(yù)處理命令,不能用分號(;)結(jié)束地址值變量一、變量的三個根本要素名字類型值三要素數(shù)據(jù)值地址值intc;c=5;內(nèi)存5......c地址值1000H變量類型變量名數(shù)據(jù)值二、變量的定義可以在程序中隨時定義變量,只要在該變量被使用前定義即可;定義格式:<類型><變量名表>;例如:inta,b,c;doublex,y,z;變量〔續(xù)〕同一程序塊內(nèi)不可以定義同名變量;初始值變量定義時可賦初始值;聲明格式:數(shù)據(jù)類型標(biāo)識符1(初始值1),…,標(biāo)識符n(初始值n);數(shù)據(jù)類型標(biāo)識符1=初始值1,…,標(biāo)識符n=初始值n;例如:doubleprice=15.5;

intsize=100;未被初始化的變量的值或者是默認(rèn)值,或者是無效值,由變量類型決定;變量可被賦值,由變量名標(biāo)識;1.3.7引用〔C++〕標(biāo)識對象的一種機(jī)制;對對象存儲地址的抽象,但引用不是值;引用有類型;變量的別名;1、定義格式<類型>&<引用名>(<變量名>);或<類型>&<引用名>=<變量名>;2、初始化與賦值定義引用時必須初始化;可以將一個引用賦給某個變量;引用可被賦值;引用〔續(xù)〕例如:inta=3;int&m=a;intn=m;int*p=&m;m=m+5;3a8pm3n定義引用并初始化將引用賦值給變量a=8,對引用的操作就是對被引用者的操作3、引用的功能用做函數(shù)的參數(shù)或函數(shù)的返回值;函數(shù)不能返回對局部對象的引用;引用〔續(xù)〕例如:int&f(intindex,inta[]){intr=a[index];returnr;}錯,r是局部對象4、指針與引用的區(qū)別指針通過地址間接訪問某個變量,引用通過別名直接訪問某個變量;引用必須初始化,一旦被初始化后不得再作為其他變量的別名;正確:int&r=a[index];為什么?引用〔續(xù)〕例1:分析以下程序的輸出結(jié)果。#include<iostream.h>voidmain(){intval(5);int&refv=val;refv=refv+5;;cout<<val<<endl;int*p=&refv,val1(refv);cout<<*p<<"\t"<<val1<<endl;}輸出101010引用〔續(xù)〕例2:分析以下程序的輸出結(jié)果。#include<iostream.h>int&f(intindex,inta[]){int&r=a[index];returnr;}voidmain(){inta[]={1,3,5,7,9};f(2,a)=55;for(i=0;i<5;i++)cout<<a[i]<<"\t";}傳址調(diào)用(C++中數(shù)組自動轉(zhuǎn)換為指針);引用可作左值;輸出:135579r5a[0]91357…a[2]r55引用〔續(xù)〕對引用的進(jìn)一步說明:〔1〕不能建立void類型的引用;void&a=9;〔2〕不能建立引用的數(shù)組;charc[6]="hello“’char&rc[6]=c;〔3〕可以將變量的引用的地址賦給一個指針,此時指針指向的是原來的變量;inta=3;int&b=a;int*p=&b;int&*p=&a;//錯引用〔續(xù)〕對引用的進(jìn)一步說明:〔4〕可以建立指針變量的引用;inti=5;int*p=&i;int*&pt=p;〔5〕可以用const對引用加以限定,不允許改變該引用的值;constint&a=i;引用〔續(xù)〕對引用的進(jìn)一步說明:〔6〕可以用常量或表達(dá)式對引用進(jìn)行初始化,但此時必須用const作聲明。const&a=3;inti;const&b=i+6;思:為什么要用const呢?算術(shù)運(yùn)算符1、普通算術(shù)運(yùn)算符單目算術(shù)運(yùn)算符:-〔取負(fù)〕、+〔取正〕;雙目算術(shù)運(yùn)算符:+、-、*、/、%(只用于int型);單目運(yùn)算符優(yōu)先級高于雙目運(yùn)算符;2、增1和減1運(yùn)算符單目運(yùn)算符:++、--;++運(yùn)算符的功能:由該運(yùn)算符組成的表達(dá)式具有一定的值;由該運(yùn)算符組成的表達(dá)式計(jì)算后,其變量值要發(fā)生改變;算術(shù)運(yùn)算符〔續(xù)〕++運(yùn)算符的兩種方式:前綴方式與后綴方式;前綴方式與后綴方式的區(qū)別:前綴運(yùn)算表達(dá)式的值為原來變量值加1;后綴運(yùn)算表達(dá)式的值為原來變量值;兩種方式的變量的值都加1;例如:inta(1);++a;intb(1);b++;表達(dá)式++a的值為2,變量a的值為2;表達(dá)式b++的值為1,變量b的值為2;關(guān)系運(yùn)算符雙目運(yùn)算符:>、<、>=、<=、==、!=前四種優(yōu)先級高于后兩種;邏輯運(yùn)算符雙目運(yùn)算符:&&、||優(yōu)先級:&&、||、!單目運(yùn)算符:!位操作運(yùn)算符1、邏輯位運(yùn)算符單目邏輯位運(yùn)算符:~雙目邏輯位運(yùn)算符:&、|、^雙目邏輯位運(yùn)算符的優(yōu)先級:&、|、^;2、移位運(yùn)算符雙目運(yùn)算符:<<、>>;<<時移掉的位被丟棄,右邊移出的空位補(bǔ)0;>>時移掉的位被丟棄,左邊移出的空位補(bǔ)0或符號位;賦值運(yùn)算符簡單賦值運(yùn)算符:=復(fù)合賦值運(yùn)算符:+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=其他運(yùn)算符1、三目運(yùn)算符格式:d1?d2:d3功能:先計(jì)算d1,假設(shè)其非零,表達(dá)式的值為d2的值,否那么為d3的值;表達(dá)式類型:d2和d3中類型較高者的類型;2、逗號運(yùn)算符格式:d1,d2,…,dn表達(dá)式的值和類型:由最后一個表達(dá)式確定;優(yōu)先級在所有運(yùn)算符中最低;3、sizeof運(yùn)算符其他運(yùn)算符〔續(xù)〕格式:功能:返回其后的類型說明符或表達(dá)式所表示的數(shù)在內(nèi)存中所占的字節(jié);4、單目運(yùn)算符&和*&:取地址;*:用在指針名前,表示取指針的內(nèi)容;5、強(qiáng)制類型運(yùn)算符sizeof(<類型說明符>);或sizeof(<表達(dá)式>);格式:<類型說明符>(<表達(dá)式>);或(<類型說明符>)<表達(dá)式>;其他運(yùn)算符〔續(xù)〕強(qiáng)制類型轉(zhuǎn)換可將高類型轉(zhuǎn)換為低類型,是一種不平安的轉(zhuǎn)換;例如:doublef(3.85);inth;h=int(f);該轉(zhuǎn)換是暫時的,一次性的;例如:inta(3),m;doubleb;b=3.56+double(a);m=a+5;表達(dá)式的種類由運(yùn)算符和操作數(shù)組成的式子;常見的表達(dá)式算術(shù)表達(dá)式;邏輯表達(dá)式;關(guān)系表達(dá)式;賦值表達(dá)式;條件表達(dá)式;逗號表達(dá)式;表達(dá)式的種類〔續(xù)〕本卷須知:連續(xù)的兩個運(yùn)算符之間用空格分隔;可用括號來改變運(yùn)算符優(yōu)先級;雙目運(yùn)算符的左右可以用空格符和操作數(shù)分開;過長的表達(dá)式可分成幾個表達(dá)式;表達(dá)式的值和類型一、確定表達(dá)式的值二、表達(dá)式求值方法與確定類型的方法先確定運(yùn)算符的功能;確定計(jì)算順序:先考慮優(yōu)先級,再考慮結(jié)合性;表達(dá)式的值和類型〔續(xù)〕例1:分析以下程序的輸出結(jié)果(算術(shù)表達(dá)式)。#include<iostream.h>voidmain(){unsigneda(0xab),b(20);a&=b;a^=a;cout<<a<<"\t"<<b<<endl;intx(-3),y(5);x>>y;x<<=y;x|=y^~y;y&=~x+1;cout<<x<<"\t"<<y<<endl;}輸出:020-11表達(dá)式的值和類型〔續(xù)〕例2:分析以下程序的輸出結(jié)果(關(guān)系表達(dá)式)。#include<iostream.h>voidmain(){charx('m'),y('n');intn;n=x<y;cout<<n<<endl;n=x==y-1;cout<<n<<endl;n=('y'!='Y')+(5>3)+(y-x==1);cout<<n<<endl;}輸出:113表達(dá)式的值和類型〔續(xù)〕例3:分析以下程序的輸出結(jié)果(邏輯表達(dá)式)。#include<iostream.h>voidmain(){intx,y,z;x=y=z=1;--x&&++y&++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;++x&&++y&&++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;++x&&y--||++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;}輸出:011122212注意邏輯表達(dá)式的求值方法表達(dá)式的值和類型〔續(xù)〕例4:分析以下程序的輸出結(jié)果(條件表達(dá)式)。#include<iostream.h>voidmain(){inta(3),b(4),c;c=a>b?++a:++b;cout<<a<<","<<b<<","<<c<<endl;c=a-b?a+b:a-3?b:a;cout<<a<<","<<b<<","<<c<<endl;}3,5,53,5,8注意三目運(yùn)算符的判斷條件輸出表達(dá)式的值和類型〔續(xù)〕例5:分析以下程序的輸出結(jié)果(賦值表達(dá)式)。#include<iostream.h>voidmain(){intx(1),y(3),z(5);x+=y*=z-=2;cout<<x<<","<<y<<","<<z<<endl;x*=y/=z-=x;cout<<x<<","<<y<<","<<z<<endl;x=y=z=2;z=(x+=2)+(y+=4)+2;cout<<x<<","<<y<<“,"<<z<<endl;}輸出:10,9,3-10,-1,-74,6,12表達(dá)式的值和類型〔續(xù)〕例6:分析以下程序的輸出結(jié)果(逗號表達(dá)式)。#include<iostream.h>voidmain(){inta,b,c;a=1,b=2,c=a+b+3;cout<<a<<","<<b<<","<<c<<endl;c=(a++,a+=b,a+b);cout<<a<<","<<b<<","<<c<<endl;}1,2,64,2,6輸出表達(dá)式中的類型轉(zhuǎn)換一、隱含轉(zhuǎn)換雙目運(yùn)算中操作數(shù)的類型轉(zhuǎn)換;是一種保值轉(zhuǎn)換,轉(zhuǎn)換類型由低到高;轉(zhuǎn)換規(guī)那么:intunsignedlongunsignedlongdoubleshort,charfloat二、強(qiáng)制轉(zhuǎn)換顯式強(qiáng)制轉(zhuǎn)換〔通過強(qiáng)制轉(zhuǎn)換運(yùn)算符實(shí)現(xiàn)〕;表達(dá)式中的類型轉(zhuǎn)換(續(xù))隱式強(qiáng)制轉(zhuǎn)換:在賦值表達(dá)式中,當(dāng)左值〔賦值運(yùn)算符左邊的值〕和右值〔賦值運(yùn)算符右邊的值〕的類型不同時,一律將右值類型強(qiáng)制轉(zhuǎn)換為左值的類型;在函數(shù)有返回值的調(diào)用中,將return后面的表達(dá)式的類型強(qiáng)制轉(zhuǎn)換為該函數(shù)的類型;顯式隱式賦值表達(dá)式函數(shù)返回值隱含轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換類型轉(zhuǎn)換類型定義1、格式typedef<已有類型名><新類型名表>;例如:typedefdoublewages,bouns;wagesweekly;bounsmonthly;2、自定義類型的作用改善程序的可讀性,增加所定義變量的信息書寫簡練提高程序的可移植性預(yù)處理和語句預(yù)處理功能語句選擇語句循環(huán)語句轉(zhuǎn)向語句預(yù)處理功能一、預(yù)處理命令及預(yù)處理功能1、預(yù)處理命令C++源程序中包含的各種編譯命令在程序被正常編譯之前執(zhí)行;預(yù)處理命令不是C++語言的一局部;2、預(yù)處理功能由預(yù)處理命令實(shí)現(xiàn)的功能;二、常用的預(yù)處理命令文件包含命令宏定義命令預(yù)處理功能〔續(xù)〕以"#"為引導(dǎo);每條預(yù)處理命令單獨(dú)占用一行,同一行不能有其他預(yù)處理命令和語句;三、預(yù)處理命令使用說明條件編譯命令停止編譯命令預(yù)處理命令的位置可以放在開頭、中間和結(jié)尾;預(yù)處理命令可以續(xù)行,續(xù)行符為"\";預(yù)處理命令不是語句,不能以分號(;)結(jié)束;文件包含命令一、功能指示C++編譯器將一個文件〔頭文件〕的內(nèi)容嵌入到該指令所在的文件中該指令所在位置處;頭文件指存放與標(biāo)準(zhǔn)函數(shù)有關(guān)的信息,或者存放符號常量、類型定義、類和其他復(fù)雜類型的定義以及與程序環(huán)境相關(guān)信息的.h文件;二、格式#include

<文件名>由系統(tǒng)提供并放在指定子目錄中的頭文件;#include

"文件名"由用戶定義,放在當(dāng)前目錄或其他目錄下的頭文件或其他源文件;文件包含命令〔續(xù)〕三、說明文件包含命令一般放在程序頭;一條文件包含命令只能包含一個文件;文件名:myfile.h#include"myfile2.h"#include"myfile3.h"文件包含命令可以嵌套;包含文件不易過多;條件編譯命令一、功能用來定義某些編譯內(nèi)容要在滿足一定條件下才參與編譯,否那么不參與編譯;可使同一源程序在不同的編譯條件下產(chǎn)生不同的目標(biāo)代碼。二、格式格式一:#ifdef<標(biāo)識符><程序段1>#else<程序段2>#endif或#ifdef<標(biāo)識符><程序段1>#endif條件編譯命令〔續(xù)〕格式二#ifndef<標(biāo)識符><程序段1>#else<程序段2>#endif或#ifndef<標(biāo)識符><程序段1>#endif格式三#if<常量表達(dá)式1><程序段1>#elif<常量表達(dá)式2><程序段2>#elif<常量表達(dá)式3><程序段3>...#else<程序段n+1>#endif條件編譯命令〔續(xù)〕例1:分析以下程序的輸出結(jié)果。#include<iostream.h>#defineA10voidmain(){#ifA>0cout<<"a>0"<<endl;#elifA<0cout<<"a<0"<<endl;#elsecout<<"a==0"<<endl;#endif}輸出:a>0條件編譯命令〔續(xù)〕例2:防止重復(fù)引用某個頭文件。//main.cpp#include"myfile1.h"#include"myfile2.h"http://myfile1.h#include"myhead.h"http://myfile2.h#include"myhead.h"改進(jìn)://myfile1.h#ifndefMYHEAD_H#defineMYHEAD_H#include"myhead.h"#endif//myfile2.h#ifndefMYHEAD_H#defineMYHEAD_H#include"myhead.h"#endif條件編譯命令〔續(xù)〕例3:用于調(diào)試。調(diào)試時:#defineDEBUG1...#ifDEBUG=1cout<<"OK"<<endl;#endif...調(diào)試后:#defineDEBUG0...停止編譯命令一、格式#error<字符序列>二、功能當(dāng)編譯器遇到該指令時,顯示“字符序列〞,即錯誤信息,然后停止對該程序的編譯,從而可以在編譯階段發(fā)現(xiàn)程序中的錯誤;三、例如假設(shè)country值為:US、ENGLAND、CHINA程序中有如下語句:停止編譯命令〔續(xù)〕//…#else#errorYoudefinecountryincorrectly#endif當(dāng)country的值不是上述三者之一時,編譯器將顯示:然后停止編譯。Youdefinecountryincorrectly語句1、表達(dá)式語句和空語句表達(dá)式語句:任何一個表達(dá)式加上分號(;);空語句:只有一個分號(;)的語句;2、復(fù)合語句和分程序復(fù)合語句:由兩條或兩條以上的程序構(gòu)成,并由一對花括號括起;分程序:又稱塊結(jié)構(gòu),含有一條或多條說明語句的復(fù)合語句;條件語句if(<條件1>)<語句1>elseif(<條件2>)<語句2>elseif(<條件3>)<語句3>...elseif(<條件n>)<語句n>else<語句n+1>說明:if語句可以嵌套,在此情況下,else與最近的一個沒有與else配對的if配對。開關(guān)語句switch(<整型表達(dá)式>){case<整常型表達(dá)式1>:<語句序列1>case<整常型表達(dá)式2>:<語句序列2>...case<整常型表達(dá)式n>:<語句序列n>default<語句序列n+1>}注意:在執(zhí)行語句序列中如果遇到break語句,那么退出switch語句,執(zhí)行后面的語句;如果其后的語句序列中沒有break語句,那么一直執(zhí)行至switch語句結(jié)束。開關(guān)語句〔續(xù)〕例3:分析以下程序的輸出結(jié)果。#include<iostream.h>voidmain(){inti(1),j(0),m(1),n(2);switch(i++){case1:m++;n++;case2:switch(++j){case1:m++;case2:n++;}case3:m++;n++;break;case4:m++;n++;}cout<<m<<','<<n<<endl;}

輸出:4,5循環(huán)語句1、while循環(huán)語句while(<條件>)<語句>;2、do-while循環(huán)語句do<語句>while(<條件>);do-while循環(huán)與while循環(huán)的區(qū)別:do-while循環(huán)至少執(zhí)行一次循環(huán)體,while循環(huán)可能一次也不執(zhí)行循環(huán)體;3、for循環(huán)語句for

(d1;d2;d3)<語句>;4、多重循環(huán)轉(zhuǎn)向語句1、goto語句格式:goto<語句編號>;goto語句只能在一個函數(shù)內(nèi)進(jìn)行轉(zhuǎn)向;2、break語句格式:break;適用情況:用于開關(guān)語句的語句序列中,其功能是退出開關(guān)語句,執(zhí)行其后的語句;用于循環(huán)體中,其功能是用來退出該重循環(huán);3、continue語句格式:continue;功能:在循環(huán)體中用來結(jié)束本次循環(huán);函數(shù)和作用域函數(shù)的根本概念函數(shù)的定義和說明函數(shù)的調(diào)用函數(shù)的參數(shù)內(nèi)聯(lián)函數(shù)函數(shù)重載異常處理根底作用域返回類型為void類型的函數(shù)抽象為過程抽象函數(shù)的根本概念函數(shù)結(jié)構(gòu):由花括號括起來的一個語句序列;函數(shù)抽象:使用標(biāo)識符對語句序列進(jìn)行的抽象;函數(shù)調(diào)用:函數(shù)級上的控制抽象,一種控制轉(zhuǎn)移;參數(shù)化:在函數(shù)抽象中對其所操作的值進(jìn)行抽象的過程;形參與實(shí)參函數(shù)抽象與過程抽象函數(shù)抽象的目的是進(jìn)行求值過程抽象的目的是更新對象C++中只有函數(shù)抽象函數(shù)的定義格式<類型><函數(shù)名>(<參數(shù)表>){<假設(shè)干條語句>}說明:<類型>為函數(shù)返回值類型,假設(shè)為void,那么為過程調(diào)用;<參數(shù)表>中的參數(shù)為形參,在函數(shù)被調(diào)用時進(jìn)行初始化,從而從被調(diào)用處獲得數(shù)據(jù);函數(shù)體函數(shù)的說明方法(函數(shù)的聲明)一、函數(shù)的說明原那么如果一個函數(shù)定義在先,調(diào)用在后,調(diào)用前可以不必說明;如果一個函數(shù)定義在后,調(diào)用在先,調(diào)用前必須說明;二、函數(shù)的說明方法〔原型說明〕<類型><函數(shù)名>(<參數(shù)表>);三、例如參數(shù)表中的參數(shù)名稱可以省略1.3C++對C的補(bǔ)充1.3.3函數(shù)原型聲明一般形式:函數(shù)類型函數(shù)名〔參數(shù)表〕;注意:參數(shù)表中一般包括參數(shù)類型和參數(shù)名,也可以只包括參數(shù)類型而不包括參數(shù)名。例如:intmax(intx,inty);或intmax(int,int);intmax(inta[],intn);或intmax(int[],int);intmax(int*p);或intmax(int*);函數(shù)的說明方法(續(xù))#include<iostream.h>voidfun1(),fun2(),fun3();voidmain(){cout<<"Itisinmain."<<endl;fun2();cout<<"Itisbackinmain."<<endl;}voidfun1(){cout<<"Itisinfun1."<<endl;fun3();cout<<"Itisbackinfun1."<<endl;}例1:分析以下程序的輸出結(jié)果。函數(shù)原型聲明函數(shù)的說明方法(續(xù))voidfun2(){cout<<"Itisinfun2."<<endl;fun1();cout<<"Itisbackinfun2."<<endl;}voidfun3(){cout<<"Itisinfun3."<<endl;}Itisinmain. Itisbackinfun1.Itisinfun2.Itisbackinfun2.Itisinfun1.Itisbackinmain.Itisinfun3.輸出函數(shù)的值和類型說明:實(shí)參表的個數(shù)由形參決定,用來初始化實(shí)參,多個實(shí)參用逗號分隔;實(shí)參的個數(shù)與類型必須與形參的個數(shù)與類型完全一致;一、函數(shù)調(diào)用格式<函數(shù)名>(<實(shí)參表>);實(shí)參對形參的初始化按其位置進(jìn)行;函數(shù)的值和類型〔續(xù)〕關(guān)于return語句的說明:有返回值的return語句可以返回一個表達(dá)式的值,從而實(shí)現(xiàn)函數(shù)之間的信息傳遞;無返回值的函數(shù)必須用void說明其返回類型;二、返回語句格式格式一:return<表達(dá)式>;格式二:return;函數(shù)的傳值調(diào)用一、傳值調(diào)用的分類二、傳值調(diào)用的實(shí)現(xiàn)機(jī)制和特點(diǎn)傳值調(diào)用:傳遞變量本身的值〔數(shù)據(jù)值〕;傳址調(diào)用:傳遞變量的地址值;用法:調(diào)用函數(shù)的實(shí)參用常量、變量(數(shù)據(jù))值或表達(dá)式值,被調(diào)用函數(shù)的形參用變量;實(shí)現(xiàn)機(jī)制:系統(tǒng)將實(shí)參拷貝一個副本給形參(數(shù)據(jù)值)

;特點(diǎn):形參值的改變不影響實(shí)參值;函數(shù)的傳值調(diào)用〔續(xù)〕#include<iostream.h>voidswap1(intx,inty){inttemp;temp=x;x=y;y=temp;cout<<"x="<<x<<","<<"y="<<y<<endl;}voidmain(){inta(5),b(9);swap1(a,b);cout<<"a="<<a<<","<<"b="<<b<<endl;}例2:分析以下程序的輸出結(jié)果(傳值調(diào)用)。輸出:x=9,y=5a=5,b=9函數(shù)的傳址調(diào)用傳址調(diào)用的實(shí)現(xiàn)機(jī)制和特點(diǎn)用法:調(diào)用函數(shù)的實(shí)參用地址值,被調(diào)用函數(shù)的形參用指針;實(shí)現(xiàn)機(jī)制:讓形參的指針直接指向?qū)崊?;特點(diǎn):可以通過改變形參所指向的變量值來影響實(shí)參值;函數(shù)的傳址調(diào)用〔續(xù)〕#include<iostream.h>voidswap2(int*x,int*y){inttemp;temp=*x;

*x=*y;

*y=temp;cout<<"x="<<*x<<","<<"y="<<*y<<endl;}voidmain(){inta(5),b(9);swap2(&a,&b);cout<<"a="<<a<<","<<"b="<<b<<endl;}輸出:x=9,y=5a=9,b=5例3:分析以下程序的輸出結(jié)果(傳址調(diào)用)。函數(shù)的引用調(diào)用(C++特有)引用調(diào)用的實(shí)現(xiàn)機(jī)制和特點(diǎn)用法:調(diào)用函數(shù)的實(shí)參用變量名,被調(diào)用函數(shù)的形參用引用;實(shí)現(xiàn)機(jī)制:直接通過引用來改變實(shí)參的數(shù)據(jù)值;特點(diǎn):起到傳址調(diào)用的作用,但比傳址調(diào)用更方便、更直接;函數(shù)的引用調(diào)用(續(xù))#include<iostream.h>voidswap3(int&x,int&y){inttemp;temp=x;

x=y;

y=temp;cout<<"x="<<x<<","<<"y="<<y<<endl;}voidmain(){inta(5),b(9);swap3(a,b);cout<<"a="<<a<<","<<"b="<<b<<endl;}輸出:x=9,y=5a=9,b=5例4:分析以下程序的輸出結(jié)果(引用調(diào)用)。函數(shù)的引用調(diào)用(續(xù))三種調(diào)用方式比較函數(shù)參數(shù)的求值順序當(dāng)一個函數(shù)帶有多個參數(shù)時,C++語言沒有規(guī)定函數(shù)調(diào)用時實(shí)參的求值順序;編譯器根據(jù)對代碼進(jìn)行優(yōu)化的需要自行規(guī)定對實(shí)參的求值順序;在實(shí)參中注意不要使用帶有副作用的運(yùn)算符,此時可能產(chǎn)生二義性;例4.5:由于使用對參數(shù)求值順序不同的編譯器造成的二義性。函數(shù)參數(shù)的求值順序〔續(xù)〕#include<iostream.h>intadd(intx,inty){returnx+y;}voidmain(){intx(4),y(6);intz=add(++x,x+y);cout<<z<<endl;}產(chǎn)生二義性可能的結(jié)果〔按照編譯器對實(shí)參求值順序不同〕:自左至右,兩個實(shí)參的值分別為5和11;自右至左,兩個實(shí)參的值分別為5和10;注意:函數(shù)參數(shù)求值順序與參數(shù)默認(rèn)值補(bǔ)足順序不同參數(shù)求值順序:由編譯器決定求值方向;參數(shù)默認(rèn)值補(bǔ)足順序:自左向右1.3.6設(shè)置函數(shù)參數(shù)的默認(rèn)值C++中,在函數(shù)聲明或定義時可以為一個或多個參數(shù)指定缺省參數(shù)值;intadd(intx,inty=10);進(jìn)行函數(shù)調(diào)用時,假設(shè)未指定足夠的實(shí)參,那么編譯器將按從左向右的順序用函數(shù)聲明或定義中的缺省值來補(bǔ)足所缺少的實(shí)參;add(15);add(15,10);設(shè)置函數(shù)參數(shù)的默認(rèn)值(續(xù))在一個指定了缺省值的參數(shù)的右邊,不能出現(xiàn)沒有指定缺省值的參數(shù);voidf(intx,inty=1,intz);在給某個參數(shù)指定缺省值時,不僅可以是一個數(shù)值,而且可以是任意復(fù)雜的表達(dá)式;intf();……voiddelay(intk,inttime=f());錯誤例如:f(2,4);理想:f(2,1,4),實(shí)際:z參數(shù)未被賦值設(shè)置函數(shù)參數(shù)的默認(rèn)值(續(xù))#include<iostream.h>voidfun(inta=1,intb=3,intc=5){cout<<"a="<<a<<","<<"b="<<b<<","<<"c="<<c<<endl;}voidmain(){fun();fun(7);fun(7,9);fun(7,9,11);cout<<"OK!"<<endl;}輸出:a=1,b=3,c=5a=7,b=3,c=5a=7,b=9,c=5a=7,b=9,c=11OK!例5:分析以下程序的輸出結(jié)果。普通函數(shù)內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)引入的原因(C++)目的

解決程序中一些函數(shù)體代碼不是很大,但又頻繁地被調(diào)用的函數(shù)的函數(shù)調(diào)用的效率問題。解決方法以目標(biāo)代碼的增加為代價來換取時間上的節(jié)??;即在編譯時將函數(shù)體中的代碼替換到程序中,增加目標(biāo)程序代碼量,進(jìn)而增加空間開銷,從而在時間開銷上不像函數(shù)調(diào)用時那么大。內(nèi)聯(lián)函數(shù)的定義方法在函數(shù)定義的前面加上關(guān)鍵字inline

inlineintadd(intx,inty,intz){returnx+y+z;}使用內(nèi)聯(lián)函數(shù)的本卷須知在內(nèi)聯(lián)函數(shù)內(nèi)不允許用循環(huán)語句或開關(guān)語句;內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在該內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前;類結(jié)構(gòu)中所有在類說明內(nèi)部定義的函數(shù)都是內(nèi)聯(lián)函數(shù);對內(nèi)聯(lián)函數(shù)不能進(jìn)行異常接口說明;內(nèi)聯(lián)函數(shù)無法遞歸調(diào)用;內(nèi)聯(lián)函數(shù)具有與帶參數(shù)的宏定義#define相同的作用和相似的機(jī)理,但內(nèi)聯(lián)函數(shù)具有宏定義的所有優(yōu)點(diǎn)而沒有其缺點(diǎn),它消除了宏定義的不平安性。include<iostream.h>#definef(x)x*x

voidmain(){ intx(2); cout<<f(x)<<endl; cout<<f(x+1)<<endl;}程序運(yùn)行結(jié)果:45原因:f(x) 替換為2*2f(x+1) 替換為2+1*2+1include<iostream.h>inlineintf(intx){ returnx*x;}voidmain(){ intx(2); cout<<f(x)<<endl; cout<<f(x+1)<<endl;}程序運(yùn)行結(jié)果:49原因:f(x) 替換為 2*2f(x+1) 替換為 3*3使用內(nèi)聯(lián)函數(shù)的本卷須知函數(shù)重載函數(shù)重載是指同一個函數(shù)名可以對應(yīng)著多個函數(shù)的實(shí)現(xiàn);要求:編譯器能夠唯一確定調(diào)用一個函數(shù)時應(yīng)執(zhí)行哪個函數(shù)代碼;條件:參數(shù)個數(shù)不同;參數(shù)類型不同;注意:

返回值類型不能作為重載條件;參數(shù)類型不同的重載函數(shù)#include<iostream.h>intadd(int,int);doubleadd(double,double);voidmain(){cout<<add(5,10)<<endl;cout<<add(5.0,10.5)<<endl;}intadd(intx,inty){cout<<"int"<<endl;returnx+y;}例7:分析以下程序的輸出結(jié)果。兩個add函數(shù)的參數(shù)類型不同參數(shù)類型不同的重載函數(shù)(續(xù))doubleadd(doublex,doubley){cout<<"double"<<endl;returnx+y;}輸出int15double15.5參數(shù)個數(shù)不同的重載函數(shù)#include<iostream.h>intmin(inta,intb);intmin(inta,intb,intc);intmin(inta,intb,intc,intd);voidmain(){cout<<min(13,5,4,9)<<endl;cout<<min(-2,8,0)<<endl;}intmin(inta,intb){returna<b?a:b;}例:分析以下程序的輸出結(jié)果。三個min函數(shù)的參數(shù)個數(shù)不同參數(shù)個數(shù)不同的重載函數(shù)(續(xù))intmin(inta,intb,intc){intt=min(a,b);returnmin(t,c);}intmin(inta,intb,intc,intd){intt1=min(a,b);intt2=min(c,d);returnmin(t1,t2);}輸出4-2帶有缺省參數(shù)時的函數(shù)重載使用缺省參數(shù)時,注意滿足函數(shù)重載條件;voidfun(intx,inty=0);voidfun(intx);fun(3);重載哪個函數(shù)?此時函數(shù)fun不能進(jìn)行重載,因?yàn)榫幾g器不能唯一確定調(diào)用哪個函數(shù)〔fun(3)或fun(3,0)均可〕。1.3C++對C的補(bǔ)充1.3.5函數(shù)模板:類型作為參數(shù)一般形式:template<typenameT>template<classT>注:template:模板class與typename都是表示“類型名〞,二者可互換目的是簡化程序1.3C++對C的補(bǔ)充#include<iostream>usingnamespacestd;template<typenameT>Tmax(Ta,Tb,Tc){if(b>a)a=b;if(c>a)a=c;returna;}intmain(){inti1=8,i2=5,i3=6,i;doubled1=56.9,d2=90.765,d3=43.1,d;longg1=6.7843,g2=-456,g3=78123,g;i=max(i1,i2,i3);d=max(d1,d2,d3);g=max(g1,g2,g3);cout<<"i_max="<<i<<endl;cout<<"d_max="<<d<<endl;cout<<"g_max="<<g<<endl;return0;}例1.8用函數(shù)模板實(shí)現(xiàn)求不同類型的三個數(shù)的最大值。1.3C++對C的補(bǔ)充運(yùn)行結(jié)果如下:i_max=8d_max=90.765g_max=78123注:類型參數(shù)可以不只一個,可根據(jù)需要確定個數(shù)。template<classT1,classT2>適用情況:只適用于函數(shù)物參數(shù)個數(shù)相同而類型不同,且函數(shù)體相同的情況,如參數(shù)個數(shù)不同,那么不能用函數(shù)模板。1.3C++對C的補(bǔ)充思考:求通用數(shù)組的最大值。異常處理根底一、異常當(dāng)一個函數(shù)在執(zhí)行過程中出現(xiàn)了一些不平常的情況,或運(yùn)行結(jié)果無法定義的情況,使操作不得不被中斷時,就出現(xiàn)了異常。二、異常處理的三個關(guān)鍵步驟引發(fā)異常、捕獲異常、異常處理三、引發(fā)異常(throw)throw<表達(dá)式>;當(dāng)一個異常被一個函數(shù)引發(fā)后,執(zhí)行流程返回到該函數(shù)的調(diào)用者中;表達(dá)式類型稱為異常類型

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論