版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第二講C++程序設計基礎主要內(nèi)容C++語言基本輸入輸出函數(shù)及新增特性new、delete操作符引用作用域、可見性、生命期C++標準輸入輸出流
在C++中用istream類和ostream類的派生類iostream控制輸入輸出,并提供了輸入和輸出操作符,cin:它是istream類的對象,用來處理標準輸入,即鍵盤輸入。cout:它是ostream類的對象,用來處理標準輸出,即屏幕輸出。使用時務必包含#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ù)調用機制c++的函數(shù)調用過程,需要調用初始化和善后處理的環(huán)節(jié)。函數(shù)調用的整個過程就是??臻g操作的過程。函數(shù)調用時,C++首先:1.建立被調函數(shù)的??臻g2.保護調用函數(shù)的運行狀態(tài)和返回地址3.傳遞參數(shù)4.將控制轉交被調函數(shù)函數(shù)的返回機制函數(shù)的調用機制當函數(shù)調用結束時,如果存在返回值,系統(tǒng)會自動創(chuàng)建一個和返回值類型相同的臨時變量,將返回的局部變量的值賦給這個臨時變量,然后恢復調用函數(shù)的運行狀態(tài),釋放??臻g,釋放局部變量,使其屬于調用函數(shù)??臻g的一部分,再根據(jù)返回地址,回到主調函數(shù),在主調函數(shù)中使用臨時變量的值,當函數(shù)調用語句結束時,再釋放臨時變量的空間。內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)擴展(inlineexpansion)簡稱為內(nèi)聯(lián)(inline),內(nèi)聯(lián)函數(shù)也稱為內(nèi)嵌函數(shù)。當在一個函數(shù)的定義或聲明前加上關鍵字inline則就把該函數(shù)定義為內(nèi)聯(lián)函數(shù),它主要是解決程序的運行效率。計算機在執(zhí)行一般函數(shù)的調用時,無論該函數(shù)多么簡單或復雜,都要經(jīng)過參數(shù)傳遞、執(zhí)行函數(shù)體和返回等操作,這些操作都需要一定的時間開銷。若把一個函數(shù)定義為內(nèi)聯(lián)函數(shù)后,在程序編譯階段,編譯器就會把每次調用該函數(shù)的地方都直接替換為該函數(shù)體中的代碼,由此省去函數(shù)的調用及相應的保存現(xiàn)場、參數(shù)傳遞和返回操作,從而加快整個程序的執(zhí)行速度。
內(nèi)聯(lián)函數(shù)可以在一開始僅定義或聲明一次,但必須在函數(shù)被調用之前定義或聲明。否則,編譯器不認為那是內(nèi)聯(lián)函數(shù),仍然如同對普通函數(shù)那樣處理該函數(shù)的調用過程。內(nèi)聯(lián)函數(shù)的函數(shù)體有一些限制:內(nèi)聯(lián)函數(shù)中不能含有任何循環(huán)以及switch和goto語句;內(nèi)聯(lián)函數(shù)中不能說明數(shù)組;遞歸函數(shù)(自己調用自己的函數(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)調用結果的誤解、混淆。這樣不好: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ù)不同或類型不同。編譯程序將根據(jù)實參和形參的類型及個數(shù)的最佳匹配來選擇調用哪一個函數(shù)。函數(shù)參數(shù)的默認值函數(shù)在聲明時可以預先給出默認的形參值,調用時如給出實參,則采用實參值,否則采用預先給出的默認形參值。intadd(intx=5,inty=6){returnx+y;}voidmain(void){add(10,20);//10+20add(10);//10+6add();//5+6}默認形參值必須從右向左順序聲明,并且在默認形參值的右面不能有非默認形參值的參數(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運算符
new和delete操作符是c++語言的一部分,使用時無須包含頭文件,從堆中分配和釋放內(nèi)存塊。語法:
newT(初始值
)//T是類型
創(chuàng)建一個T類型對象,若成功,返回值為對象首地址,否則NULL。
newT[E]//E是算術表達式
創(chuàng)建一個T類型對象數(shù)組,成功時返回值為數(shù)組首地址,否則NULL,不允許有初始值,且類的構造函數(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可以改變引用的概念引用的概念
引用是個別名,當建立引用時,程序用另一個變量或對象(目標)的名字初始化它。建立引用后,引用作為目標的別名而使用,對引用的改動實際就是對目標的改動。引用的聲明
為建立引用,先寫上目標的類型,后跟引用運算符“&”,然后是引用的名字。引用能使用任何合法變量名。
intsomeInt;int&rInt=someInt;
引用不是值,不占存儲空間,聲明引用時,目標的存儲狀態(tài)不會改變。引用只有聲明,沒有定義。且在聲明時必須初始化,否則產(chǎn)生編譯錯誤。引用的操作如果程序尋找引用的地址,它返回目標的地址引用一旦初始化,就維系在一定的目標上,再也不分開,任何對該引用的賦值,都是對引用所維系的目標賦值,而不是將引用維系到另一個目標上。引用與指針的差別指針是變量,可以把它再賦值成其他的地址。建立引用時必須進行初始化并且決不會再指向其他不同的變量。什么能被引用若一個變量聲明為T&,即引用時,它必須用T類型的變量或對象,或能夠轉換成T類型的對象進行初始化若引用類型T的初始化不是一個左值,那么將建立一個T類型的目標并用初值初始化,那個目標的地址變成引用的值例:double&rr=1;doubletemp;temp=double(1);double&rr=temp;int*a;int*&p=a;intb=8;p=&b;0110:F14E0110:F890ap80110:F14Eb由于指針也是變量,所以可以有指針變量的引用。不允許進行引用對void進行引用是不允許的。void&a=3;void只是在語法上相當于一個類型,本質上不是類型。不能建立引用的數(shù)組。inta[10];int&ra[10]=a;引用本身不是一種數(shù)據(jù)類型,故沒有引用的引用,也沒有引用的指針。例:inta;int&ra=a;int&*p=&ra;
引用不能用類型來初始化:int&ra=int;
因為引用是變量或對象的引用,而不是類型的引用。有空指針,無空引用。int&ri=NULL;用引用傳遞函數(shù)參數(shù)傳遞引用給函數(shù)與傳遞指針的效果一樣,傳遞的是原來的變量或對象,而不是在函數(shù)作用域內(nèi)建立的變量或對象的副本。引用具有指針的威力,但是調用引用傳遞的函數(shù)時,可讀性卻比指針傳遞好。引用具有傳值方式函數(shù)調用語法的簡單性與可讀性,但是威力卻比傳值方式強。引用存在的問題引用可以表達清晰并讓程序員負責了解如何傳遞參數(shù),但是在有些情況下它們能夠隱藏錯誤。
inta=10;intb=20;swap(a,b);引用隱藏了函數(shù)所使用的參數(shù)傳遞的類型,無法從所看到的函數(shù)調用判斷其是值傳遞還是引用傳遞。例:
voidfn(ints){//…}voidfn(int&t){//…}voidmain(){inta=5;fn(a);}用引用返回值函數(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)的變量或對象的引用,這與返回一個局部作用域指針的性質一樣嚴重。函數(shù)調用作為左值返回一個引用使得一個函數(shù)調用表達式成為左值表達式。只要避免將局部棧中變量的地址返回,就能使函數(shù)調用表達式作為左值來使用。傳遞指針和引用的目的是效率,當一個數(shù)據(jù)類型很大時,因為傳值要復制副本,故不可取,但傳遞指針和引用存在傳值所沒有的危險。保護實參不被修改的辦法是傳遞const指針和引用。C++不區(qū)分變量的const引用和const變量的引用。程序決不能給引用本身重新賦值,使它指向另一個變量,因此引用總是const的。若對引用應用關鍵詞const,其作用是使目標成為const變量。即沒有:constdoubleconst&a=1;只有:constdouble&a=1;外部存儲類型一個程序在很小的規(guī)模下,可以用一個源文件來完整表達。具有應用價值的程序由多個源文件組成,根據(jù)C++程序的定義,其中只有一個源文件具有主函數(shù)main(),而其他的文件不能含有主函數(shù)。所有函數(shù)聲明一般都放在源文件的開始位置。構成一個程序的多個源文件之間,通過聲明數(shù)據(jù)或函數(shù)為外部的(extern)來進行溝通。帶extern的變量不在本文件中分配空間,而在程序的其它文件中分配空間(變量定義)。默認的函數(shù)聲明或定義總是extern的。它告訴連接程序,在所有組成該程序的文件中搜索該函數(shù)。帶extern的變量說明是變量聲明,不是變量定義靜態(tài)存儲類型靜態(tài)全局變量靜態(tài)函數(shù)在全局變量前加一個static,使該變量只在這個源文件中可用,稱之為全局靜態(tài)變量(靜態(tài)全局變量)。在一個源文件中,全局變量和靜態(tài)全局變量沒有區(qū)別。在多文件組成的程序里,全局靜態(tài)變量使得該變量成為定義該變量的源文件所獨享。使一個變量只在一個源文件中全局使用有時是必要的。第一,不必擔心另外源文件使用它的名字,該名字在源文件中是唯一的。第二,源文件的全局變量不能被其他源文件使用,不能被其他源文件所修改,保證變量的值是可靠的。
函數(shù)的聲明和定義默認情況下在整個程序中是extern(外部的),有時需要使某個函數(shù)只在一個源文件中有效,不能被其他源文件所用,在函數(shù)前面加上static。它允許其他源文件建立并使用同名的函數(shù),而不相互沖突,在很大的編程項目中它是一個優(yōu)勢。在文件作用域下聲明的inline函數(shù)默認為static存儲類型。聲明的const的常量默認為static存儲類型。若加上extern,則為外部存儲類型。作用域局部作用域函數(shù)作用域文件作用域函數(shù)原型作用域當標識符的聲明出現(xiàn)在由一對花括號所括起來的一段程序(塊)內(nèi)時,該標識符的作用域從聲明點開始,到塊結束處為止,該作用域的范圍具有局部性。標號是唯一具有函數(shù)作用域的標識符。goto語句使用標號標號聲明使得該標識符在一個函數(shù)內(nèi)的任何位置均可以被使用。
函數(shù)原型聲明(不是函數(shù)定義)中所作的參數(shù)聲明在該作用域中。這個作用域開始于函數(shù)原型聲明的左括號,結束于函數(shù)原型聲明的右括號。
文件作用域是在所有函數(shù)定義之外說明的,其作用域從說明點開始,一直延伸到源文件結束。靜態(tài)全局變量和全局變量是文件作用域的,靜態(tài)函數(shù)也是文件作用域的。所以文件作用域也稱全局作用域。在頭文件的文件作用域中所進行的聲明,若該頭文件被一個源文件嵌入,則聲明的作用域也擴展到該源文件中,直到源文件結束??梢娦钥梢娦詮牧硪唤嵌缺憩F(xiàn)標識符的有效性,標識符在某個位置可見,表示該標識符可以被引用。可見性與作用域是一致的。作用域指的是標識符有效的范圍,而可見性是分析在某一位置標識符的有效性??梢娦栽诜治鰞蓚€同名標識符作用域嵌套的特殊情況時,非常有用。在內(nèi)層作用域中,外層作用域中聲明的同名標識符是不可見的,當在內(nèi)層作用域中引用這個標識符時,表示的是對內(nèi)層作用域中聲明的標識符的引用。標識符的可見性范圍不超過作用域,作用域則包含可見范圍。若全局變量被隱藏,則可用符號::來引用該全局變量。{inti;charch;i=3;{doublei;i=3.0e3;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度民營醫(yī)院員工安全生產(chǎn)教育與責任合同4篇
- 二零二五年度嬰幼兒奶粉進口清關及倉儲物流服務合同
- 二零二五年度民法典物權編在遺產(chǎn)繼承中的法律咨詢合同4篇
- 2025年度個人農(nóng)業(yè)生產(chǎn)經(jīng)營質押擔保貸款合同3篇
- 課題申報參考:面向國家重大戰(zhàn)略需求的博士生項目制培養(yǎng)模式研究
- 課題申報參考:馬來西亞華人音樂之存續(xù)與中華文化認同建構
- 二零二五年度木工行業(yè)安全生產(chǎn)責任保險合同
- 2025年度個人與公司租賃合同稅費承擔協(xié)議4篇
- 2025版門禁控制系統(tǒng)研發(fā)與定制服務合同4篇
- 2025年度個人股權贈與與受贈合同范本4篇
- JBT 14588-2023 激光加工鏡頭 (正式版)
- 2024年四川省成都市樹德實驗中學物理八年級下冊期末質量檢測試題含解析
- 九型人格與領導力講義
- 廉潔應征承諾書
- 2023年四川省成都市中考物理試卷真題(含答案)
- 泵車述職報告
- 2024年山西文旅集團招聘筆試參考題庫含答案解析
- 恢復中華人民共和國國籍申請表
- 管理期貨的趨勢跟蹤策略 尋找危機阿爾法
- 瀝青化學分析試驗作業(yè)指導書
- 腦出血的護理課件腦出血護理查房PPT
評論
0/150
提交評論