版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第二講C++程序設(shè)計基礎(chǔ)主要內(nèi)容C++語言基本輸入輸出函數(shù)及新增特性new、delete操作符引用作用域、可見性、生命期C++標(biāo)準(zhǔn)輸入輸出流
在C++中用istream類和ostream類的派生類iostream控制輸入輸出,并提供了輸入和輸出操作符,cin:它是istream類的對象,用來處理標(biāo)準(zhǔn)輸入,即鍵盤輸入。cout:它是ostream類的對象,用來處理標(biāo)準(zhǔn)輸出,即屏幕輸出。使用時務(wù)必包含#include<iostream.h>。<<稱為插入操作符,其作用是向cout流中插入字符。>>稱為提取操作符,其作用是從cin流中提取字符。無格式輸出cout無格式輸入cincout<<變量1<<變量2…<<變量n;cin>>數(shù)據(jù)1>>數(shù)據(jù)2…>>數(shù)據(jù)n;cout<<變量1<<變量2<<變量n;cin>>變量1>>變量2>>變量n;函數(shù)調(diào)用機(jī)制c++的函數(shù)調(diào)用過程,需要調(diào)用初始化和善后處理的環(huán)節(jié)。函數(shù)調(diào)用的整個過程就是??臻g操作的過程。函數(shù)調(diào)用時,C++首先:1.建立被調(diào)函數(shù)的??臻g2.保護(hù)調(diào)用函數(shù)的運(yùn)行狀態(tài)和返回地址3.傳遞參數(shù)4.將控制轉(zhuǎn)交被調(diào)函數(shù)函數(shù)的返回機(jī)制函數(shù)的調(diào)用機(jī)制當(dāng)函數(shù)調(diào)用結(jié)束時,如果存在返回值,系統(tǒng)會自動創(chuàng)建一個和返回值類型相同的臨時變量,將返回的局部變量的值賦給這個臨時變量,然后恢復(fù)調(diào)用函數(shù)的運(yùn)行狀態(tài),釋放棧空間,釋放局部變量,使其屬于調(diào)用函數(shù)??臻g的一部分,再根據(jù)返回地址,回到主調(diào)函數(shù),在主調(diào)函數(shù)中使用臨時變量的值,當(dāng)函數(shù)調(diào)用語句結(jié)束時,再釋放臨時變量的空間。內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)擴(kuò)展(inlineexpansion)簡稱為內(nèi)聯(lián)(inline),內(nèi)聯(lián)函數(shù)也稱為內(nèi)嵌函數(shù)。當(dāng)在一個函數(shù)的定義或聲明前加上關(guān)鍵字inline則就把該函數(shù)定義為內(nèi)聯(lián)函數(shù),它主要是解決程序的運(yùn)行效率。計算機(jī)在執(zhí)行一般函數(shù)的調(diào)用時,無論該函數(shù)多么簡單或復(fù)雜,都要經(jīng)過參數(shù)傳遞、執(zhí)行函數(shù)體和返回等操作,這些操作都需要一定的時間開銷。若把一個函數(shù)定義為內(nèi)聯(lián)函數(shù)后,在程序編譯階段,編譯器就會把每次調(diào)用該函數(shù)的地方都直接替換為該函數(shù)體中的代碼,由此省去函數(shù)的調(diào)用及相應(yīng)的保存現(xiàn)場、參數(shù)傳遞和返回操作,從而加快整個程序的執(zhí)行速度。
內(nèi)聯(lián)函數(shù)可以在一開始僅定義或聲明一次,但必須在函數(shù)被調(diào)用之前定義或聲明。否則,編譯器不認(rèn)為那是內(nèi)聯(lián)函數(shù),仍然如同對普通函數(shù)那樣處理該函數(shù)的調(diào)用過程。內(nèi)聯(lián)函數(shù)的函數(shù)體有一些限制:內(nèi)聯(lián)函數(shù)中不能含有任何循環(huán)以及switch和goto語句;內(nèi)聯(lián)函數(shù)中不能說明數(shù)組;遞歸函數(shù)(自己調(diào)用自己的函數(shù))不能定義為內(nèi)聯(lián)函數(shù)。通常只適合1~5行的小函數(shù)。函數(shù)重載C++允許功能相近的函數(shù)在相同的作用域內(nèi)以相同函數(shù)名聲明,從而形成重載。方便使用,便于記憶。例:形參類型不同intadd(intx,inty);floatadd(floatx,floaty);形參個數(shù)不同intadd(intx,inty);intadd(intx,inty,intz);不要將不同功能的函數(shù)聲明為重載函數(shù),以免出現(xiàn)調(diào)用結(jié)果的誤解、混淆。這樣不好:intadd(intx,inty);intadd(inta,intb);編譯器不以形參名來區(qū)分intadd(intx,inty);voidadd(intx,inty);編譯器不以返回值來區(qū)分intadd(intx,inty){returnx+y;}floatadd(floatx,floaty){returnx-y;}重載函數(shù)的形參必須不同:個數(shù)不同或類型不同。編譯程序?qū)⒏鶕?jù)實(shí)參和形參的類型及個數(shù)的最佳匹配來選擇調(diào)用哪一個函數(shù)。函數(shù)參數(shù)的默認(rèn)值函數(shù)在聲明時可以預(yù)先給出默認(rèn)的形參值,調(diào)用時如給出實(shí)參,則采用實(shí)參值,否則采用預(yù)先給出的默認(rèn)形參值。intadd(intx=5,inty=6){returnx+y;}voidmain(void){add(10,20);//10+20add(10);//10+6add();//5+6}默認(rèn)形參值必須從右向左順序聲明,并且在默認(rèn)形參值的右面不能有非默認(rèn)形參值的參數(shù)。因?yàn)檎{(diào)用時實(shí)參取代形參是從左向右的順序。例:int
add(int
x,inty=5,intz=6);//正確int
add(intx=1,inty=5,intz);//錯誤int
add(intx=1,inty,intz=6);//錯誤new和delete運(yùn)算符
new和delete操作符是c++語言的一部分,使用時無須包含頭文件,從堆中分配和釋放內(nèi)存塊。語法:
newT(初始值
)//T是類型
創(chuàng)建一個T類型對象,若成功,返回值為對象首地址,否則NULL。
newT[E]//E是算術(shù)表達(dá)式
創(chuàng)建一個T類型對象數(shù)組,成功時返回值為數(shù)組首地址,否則NULL,不允許有初始值,且類的構(gòu)造函數(shù)參數(shù)為空或都有缺省值。
delete指針變量刪除一個指針變量所指的對象
delete[]指針變量刪除一個指針變量所指的對象數(shù)組char*pstr=newchar[10];delete[]pstr;pi=newint[10][10];float*p=newfloat;const指針指向常量的指針constinta=78;constintb=28;intc=18;constint*pi=&a;*pi=58;//errorpi=&b;*pi=68;//errorpi=&c;*pi=88;//errorc=98;指針常量char*constpc=“asdf”;pc=“dfgh”;//error*pc=‘b’;*(pc+1)=‘c’;*pc++=‘y’;//errorconstintb=28;int*constpc=&b;//errorconstintci=7;intai;constint*constcpc=&ci;constint*constcpi=&ai;cpi=&ai;//error*cpi=39;//errorai=39指向常量的指針常量*pi是常量,但pi可以改變*cpc和cpc都是常量pc是常量,但*pc可以改變引用的概念引用的概念
引用是個別名,當(dāng)建立引用時,程序用另一個變量或?qū)ο?目標(biāo))的名字初始化它。建立引用后,引用作為目標(biāo)的別名而使用,對引用的改動實(shí)際就是對目標(biāo)的改動。引用的聲明
為建立引用,先寫上目標(biāo)的類型,后跟引用運(yùn)算符“&”,然后是引用的名字。引用能使用任何合法變量名。
intsomeInt;int&rInt=someInt;
引用不是值,不占存儲空間,聲明引用時,目標(biāo)的存儲狀態(tài)不會改變。引用只有聲明,沒有定義。且在聲明時必須初始化,否則產(chǎn)生編譯錯誤。引用的操作如果程序?qū)ふ乙玫牡刂?,它返回目?biāo)的地址引用一旦初始化,就維系在一定的目標(biāo)上,再也不分開,任何對該引用的賦值,都是對引用所維系的目標(biāo)賦值,而不是將引用維系到另一個目標(biāo)上。引用與指針的差別指針是變量,可以把它再賦值成其他的地址。建立引用時必須進(jìn)行初始化并且決不會再指向其他不同的變量。什么能被引用若一個變量聲明為T&,即引用時,它必須用T類型的變量或?qū)ο?,或能夠轉(zhuǎn)換成T類型的對象進(jìn)行初始化若引用類型T的初始化不是一個左值,那么將建立一個T類型的目標(biāo)并用初值初始化,那個目標(biāo)的地址變成引用的值例:double&rr=1;doubletemp;temp=double(1);double&rr=temp;int*a;int*&p=a;intb=8;p=&b;0110:F14E0110:F890ap80110:F14Eb由于指針也是變量,所以可以有指針變量的引用。不允許進(jìn)行引用對void進(jìn)行引用是不允許的。void&a=3;void只是在語法上相當(dāng)于一個類型,本質(zhì)上不是類型。不能建立引用的數(shù)組。inta[10];int&ra[10]=a;引用本身不是一種數(shù)據(jù)類型,故沒有引用的引用,也沒有引用的指針。例:inta;int&ra=a;int&*p=&ra;
引用不能用類型來初始化:int&ra=int;
因?yàn)橐檬亲兞炕驅(qū)ο蟮囊茫皇穷愋偷囊?。有空指針,無空引用。int&ri=NULL;用引用傳遞函數(shù)參數(shù)傳遞引用給函數(shù)與傳遞指針的效果一樣,傳遞的是原來的變量或?qū)ο螅皇窃诤瘮?shù)作用域內(nèi)建立的變量或?qū)ο蟮母北?。引用具有指針的威力,但是調(diào)用引用傳遞的函數(shù)時,可讀性卻比指針傳遞好。引用具有傳值方式函數(shù)調(diào)用語法的簡單性與可讀性,但是威力卻比傳值方式強(qiáng)。引用存在的問題引用可以表達(dá)清晰并讓程序員負(fù)責(zé)了解如何傳遞參數(shù),但是在有些情況下它們能夠隱藏錯誤。
inta=10;intb=20;swap(a,b);引用隱藏了函數(shù)所使用的參數(shù)傳遞的類型,無法從所看到的函數(shù)調(diào)用判斷其是值傳遞還是引用傳遞。例:
voidfn(ints){//…}voidfn(int&t){//…}voidmain(){inta=5;fn(a);}用引用返回值函數(shù)只能返回一個值,若程序需要從函數(shù)返回多個值,引用和指針都可以用來實(shí)現(xiàn)這一過程。函數(shù)返回值時,要生成一個值的副本。而用引用返回值時,不生成值的副本。#include<iostream.h>floattemp;floatfn1(floatr){temp=r*r*3.14;returntemp;}float&fn2(floatr){temp=r*r*3.14;returntemp;}voidmain(){floata=fn1(5.0);
float&b=fn1(5.0);
floatc=fn2(5.0);
float&d=fn2(5.0);cout<<a<<endl;cout<<b<<endl;cout<<c<<endl;cout<<d<<endl;}如果返回不在作用域范圍內(nèi)的變量或?qū)ο蟮囊茫@與返回一個局部作用域指針的性質(zhì)一樣嚴(yán)重。函數(shù)調(diào)用作為左值返回一個引用使得一個函數(shù)調(diào)用表達(dá)式成為左值表達(dá)式。只要避免將局部棧中變量的地址返回,就能使函數(shù)調(diào)用表達(dá)式作為左值來使用。傳遞指針和引用的目的是效率,當(dāng)一個數(shù)據(jù)類型很大時,因?yàn)閭髦狄獜?fù)制副本,故不可取,但傳遞指針和引用存在傳值所沒有的危險。保護(hù)實(shí)參不被修改的辦法是傳遞const指針和引用。C++不區(qū)分變量的const引用和const變量的引用。程序決不能給引用本身重新賦值,使它指向另一個變量,因此引用總是const的。若對引用應(yīng)用關(guān)鍵詞const,其作用是使目標(biāo)成為const變量。即沒有:constdoubleconst&a=1;只有:constdouble&a=1;外部存儲類型一個程序在很小的規(guī)模下,可以用一個源文件來完整表達(dá)。具有應(yīng)用價值的程序由多個源文件組成,根據(jù)C++程序的定義,其中只有一個源文件具有主函數(shù)main(),而其他的文件不能含有主函數(shù)。所有函數(shù)聲明一般都放在源文件的開始位置。構(gòu)成一個程序的多個源文件之間,通過聲明數(shù)據(jù)或函數(shù)為外部的(extern)來進(jìn)行溝通。帶extern的變量不在本文件中分配空間,而在程序的其它文件中分配空間(變量定義)。默認(rèn)的函數(shù)聲明或定義總是extern的。它告訴連接程序,在所有組成該程序的文件中搜索該函數(shù)。帶extern的變量說明是變量聲明,不是變量定義靜態(tài)存儲類型靜態(tài)全局變量靜態(tài)函數(shù)在全局變量前加一個static,使該變量只在這個源文件中可用,稱之為全局靜態(tài)變量(靜態(tài)全局變量)。在一個源文件中,全局變量和靜態(tài)全局變量沒有區(qū)別。在多文件組成的程序里,全局靜態(tài)變量使得該變量成為定義該變量的源文件所獨(dú)享。使一個變量只在一個源文件中全局使用有時是必要的。第一,不必?fù)?dān)心另外源文件使用它的名字,該名字在源文件中是唯一的。第二,源文件的全局變量不能被其他源文件使用,不能被其他源文件所修改,保證變量的值是可靠的。
函數(shù)的聲明和定義默認(rèn)情況下在整個程序中是extern(外部的),有時需要使某個函數(shù)只在一個源文件中有效,不能被其他源文件所用,在函數(shù)前面加上static。它允許其他源文件建立并使用同名的函數(shù),而不相互沖突,在很大的編程項目中它是一個優(yōu)勢。在文件作用域下聲明的inline函數(shù)默認(rèn)為static存儲類型。聲明的const的常量默認(rèn)為static存儲類型。若加上extern,則為外部存儲類型。作用域局部作用域函數(shù)作用域文件作用域函數(shù)原型作用域當(dāng)標(biāo)識符的聲明出現(xiàn)在由一對花括號所括起來的一段程序(塊)內(nèi)時,該標(biāo)識符的作用域從聲明點(diǎn)開始,到塊結(jié)束處為止,該作用域的范圍具有局部性。標(biāo)號是唯一具有函數(shù)作用域的標(biāo)識符。goto語句使用標(biāo)號標(biāo)號聲明使得該標(biāo)識符在一個函數(shù)內(nèi)的任何位置均可以被使用。
函數(shù)原型聲明(不是函數(shù)定義)中所作的參數(shù)聲明在該作用域中。這個作用域開始于函數(shù)原型聲明的左括號,結(jié)束于函數(shù)原型聲明的右括號。
文件作用域是在所有函數(shù)定義之外說明的,其作用域從說明點(diǎn)開始,一直延伸到源文件結(jié)束。靜態(tài)全局變量和全局變量是文件作用域的,靜態(tài)函數(shù)也是文件作用域的。所以文件作用域也稱全局作用域。在頭文件的文件作用域中所進(jìn)行的聲明,若該頭文件被一個源文件嵌入,則聲明的作用域也擴(kuò)展到該源文件中,直到源文件結(jié)束??梢娦钥梢娦詮牧硪唤嵌缺憩F(xiàn)標(biāo)識符的有效性,標(biāo)識符在某個位置可見,表示該標(biāo)識符可以被引用??梢娦耘c作用域是一致的。作用域指的是標(biāo)識符有效的范圍,而可見性是分析在某一位置標(biāo)識符的有效性。可見性在分析兩個同名標(biāo)識符作用域嵌套的特殊情況時,非常有用。在內(nèi)層作用域中,外層作用域中聲明的同名標(biāo)識符是不可見的,當(dāng)在內(nèi)層作用域中引用這個標(biāo)識符時,表示的是對內(nèi)層作用域中聲明的標(biāo)識符的引用。標(biāo)識符的可見性范圍不超過作用域,作用域則包含可見范圍。若全局變量被隱藏,則可用符號::來引用該全局變量。{inti;charch;i=3;{doublei;i=3.0e3;
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024地震災(zāi)區(qū)重建渣土砂石供應(yīng)及運(yùn)輸合同
- 2024年度版權(quán)交易合同
- 木材采運(yùn)過程中的監(jiān)督管理考核試卷
- 2024年度國際化工產(chǎn)品采購合同
- 古代文學(xué)與歷史人物考核試卷
- 2024年微站租賃與運(yùn)營合同
- 放射性金屬礦床的地理信息系統(tǒng)與空間分析技術(shù)考核試卷
- 木材加工中的設(shè)備選擇與使用考核試卷
- 2024年建筑工程招投標(biāo)費(fèi)用支付合同
- 2024年影視作品改編權(quán)轉(zhuǎn)讓合同(具體作品名稱)
- 2024年高考政治考試題海南卷及參考答案
- 食品供應(yīng)商遴選制度(一)
- 吉林旅游外宣翻譯策略探析
- 六年級語文小課題研究
- 廣告宣傳物料投標(biāo)方案(技術(shù)方案)
- 天津市一中2024-2025學(xué)年高一語文上學(xué)期期中試題含解析
- 小紅書種草營銷師認(rèn)證考試題附有答案
- DB43 3001-2024 工業(yè)廢水高氯酸鹽污染物排放標(biāo)準(zhǔn)
- 包裝飲用水生產(chǎn)風(fēng)險清單范例
- 當(dāng)代社會政策分析 課件 第二章 就業(yè)社會政策
- GB/T 19633.2-2024最終滅菌醫(yī)療器械包裝第2部分:成型、密封和裝配過程的確認(rèn)的要求
評論
0/150
提交評論