第二講 C++程序設(shè)計(jì)基礎(chǔ)簡(jiǎn)化_第1頁(yè)
第二講 C++程序設(shè)計(jì)基礎(chǔ)簡(jiǎn)化_第2頁(yè)
第二講 C++程序設(shè)計(jì)基礎(chǔ)簡(jiǎn)化_第3頁(yè)
第二講 C++程序設(shè)計(jì)基礎(chǔ)簡(jiǎn)化_第4頁(yè)
第二講 C++程序設(shè)計(jì)基礎(chǔ)簡(jiǎn)化_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第二講C++程序設(shè)計(jì)基礎(chǔ)主要內(nèi)容C++語(yǔ)言基本輸入輸出函數(shù)及新增特性new、delete操作符引用作用域、可見(jiàn)性、生命期C++標(biāo)準(zhǔn)輸入輸出流

在C++中用istream類(lèi)和ostream類(lèi)的派生類(lèi)iostream控制輸入輸出,并提供了輸入和輸出操作符,cin:它是istream類(lèi)的對(duì)象,用來(lái)處理標(biāo)準(zhǔn)輸入,即鍵盤(pán)輸入。cout:它是ostream類(lèi)的對(duì)象,用來(lái)處理標(biāo)準(zhǔn)輸出,即屏幕輸出。使用時(shí)務(wù)必包含#include<iostream.h>。<<稱(chēng)為插入操作符,其作用是向cout流中插入字符。>>稱(chēng)為提取操作符,其作用是從cin流中提取字符。無(wú)格式輸出cout無(wú)格式輸入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)用過(guò)程,需要調(diào)用初始化和善后處理的環(huán)節(jié)。函數(shù)調(diào)用的整個(gè)過(guò)程就是??臻g操作的過(guò)程。函數(shù)調(diào)用時(shí),C++首先:1.建立被調(diào)函數(shù)的棧空間2.保護(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é)束時(shí),如果存在返回值,系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)和返回值類(lèi)型相同的臨時(shí)變量,將返回的局部變量的值賦給這個(gè)臨時(shí)變量,然后恢復(fù)調(diào)用函數(shù)的運(yùn)行狀態(tài),釋放??臻g,釋放局部變量,使其屬于調(diào)用函數(shù)棧空間的一部分,再根據(jù)返回地址,回到主調(diào)函數(shù),在主調(diào)函數(shù)中使用臨時(shí)變量的值,當(dāng)函數(shù)調(diào)用語(yǔ)句結(jié)束時(shí),再釋放臨時(shí)變量的空間。內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)擴(kuò)展(inlineexpansion)簡(jiǎn)稱(chēng)為內(nèi)聯(lián)(inline),內(nèi)聯(lián)函數(shù)也稱(chēng)為內(nèi)嵌函數(shù)。當(dāng)在一個(gè)函數(shù)的定義或聲明前加上關(guān)鍵字inline則就把該函數(shù)定義為內(nèi)聯(lián)函數(shù),它主要是解決程序的運(yùn)行效率。計(jì)算機(jī)在執(zhí)行一般函數(shù)的調(diào)用時(shí),無(wú)論該函數(shù)多么簡(jiǎn)單或復(fù)雜,都要經(jīng)過(guò)參數(shù)傳遞、執(zhí)行函數(shù)體和返回等操作,這些操作都需要一定的時(shí)間開(kāi)銷(xiāo)。若把一個(gè)函數(shù)定義為內(nèi)聯(lián)函數(shù)后,在程序編譯階段,編譯器就會(huì)把每次調(diào)用該函數(shù)的地方都直接替換為該函數(shù)體中的代碼,由此省去函數(shù)的調(diào)用及相應(yīng)的保存現(xiàn)場(chǎng)、參數(shù)傳遞和返回操作,從而加快整個(gè)程序的執(zhí)行速度。

內(nèi)聯(lián)函數(shù)可以在一開(kāi)始僅定義或聲明一次,但必須在函數(shù)被調(diào)用之前定義或聲明。否則,編譯器不認(rèn)為那是內(nèi)聯(lián)函數(shù),仍然如同對(duì)普通函數(shù)那樣處理該函數(shù)的調(diào)用過(guò)程。內(nèi)聯(lián)函數(shù)的函數(shù)體有一些限制:內(nèi)聯(lián)函數(shù)中不能含有任何循環(huán)以及switch和goto語(yǔ)句;內(nèi)聯(lián)函數(shù)中不能說(shuō)明數(shù)組;遞歸函數(shù)(自己調(diào)用自己的函數(shù))不能定義為內(nèi)聯(lián)函數(shù)。通常只適合1~5行的小函數(shù)。函數(shù)重載C++允許功能相近的函數(shù)在相同的作用域內(nèi)以相同函數(shù)名聲明,從而形成重載。方便使用,便于記憶。例:形參類(lèi)型不同intadd(intx,inty);floatadd(floatx,floaty);形參個(gè)數(shù)不同intadd(intx,inty);intadd(intx,inty,intz);不要將不同功能的函數(shù)聲明為重載函數(shù),以免出現(xiàn)調(diào)用結(jié)果的誤解、混淆。這樣不好:intadd(intx,inty);intadd(inta,intb);編譯器不以形參名來(lái)區(qū)分intadd(intx,inty);voidadd(intx,inty);編譯器不以返回值來(lái)區(qū)分intadd(intx,inty){returnx+y;}floatadd(floatx,floaty){returnx-y;}重載函數(shù)的形參必須不同:個(gè)數(shù)不同或類(lèi)型不同。編譯程序?qū)⒏鶕?jù)實(shí)參和形參的類(lèi)型及個(gè)數(shù)的最佳匹配來(lái)選擇調(diào)用哪一個(gè)函數(shù)。函數(shù)參數(shù)的默認(rèn)值函數(shù)在聲明時(shí)可以預(yù)先給出默認(rèn)的形參值,調(diào)用時(shí)如給出實(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í)實(shí)參取代形參是從左向右的順序。例:int

add(int

x,inty=5,intz=6);//正確int

add(intx=1,inty=5,intz);//錯(cuò)誤int

add(intx=1,inty,intz=6);//錯(cuò)誤new和delete運(yùn)算符

new和delete操作符是c++語(yǔ)言的一部分,使用時(shí)無(wú)須包含頭文件,從堆中分配和釋放內(nèi)存塊。語(yǔ)法:

newT(初始值

)//T是類(lèi)型

創(chuàng)建一個(gè)T類(lèi)型對(duì)象,若成功,返回值為對(duì)象首地址,否則NULL。

newT[E]//E是算術(shù)表達(dá)式

創(chuàng)建一個(gè)T類(lèi)型對(duì)象數(shù)組,成功時(shí)返回值為數(shù)組首地址,否則NULL,不允許有初始值,且類(lèi)的構(gòu)造函數(shù)參數(shù)為空或都有缺省值。

delete指針變量刪除一個(gè)指針變量所指的對(duì)象

delete[]指針變量刪除一個(gè)指針變量所指的對(duì)象數(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可以改變引用的概念引用的概念

引用是個(gè)別名,當(dāng)建立引用時(shí),程序用另一個(gè)變量或?qū)ο?目標(biāo))的名字初始化它。建立引用后,引用作為目標(biāo)的別名而使用,對(duì)引用的改動(dòng)實(shí)際就是對(duì)目標(biāo)的改動(dòng)。引用的聲明

為建立引用,先寫(xiě)上目標(biāo)的類(lèi)型,后跟引用運(yùn)算符“&”,然后是引用的名字。引用能使用任何合法變量名。

intsomeInt;int&rInt=someInt;

引用不是值,不占存儲(chǔ)空間,聲明引用時(shí),目標(biāo)的存儲(chǔ)狀態(tài)不會(huì)改變。引用只有聲明,沒(méi)有定義。且在聲明時(shí)必須初始化,否則產(chǎn)生編譯錯(cuò)誤。引用的操作如果程序?qū)ふ乙玫牡刂?,它返回目?biāo)的地址引用一旦初始化,就維系在一定的目標(biāo)上,再也不分開(kāi),任何對(duì)該引用的賦值,都是對(duì)引用所維系的目標(biāo)賦值,而不是將引用維系到另一個(gè)目標(biāo)上。引用與指針的差別指針是變量,可以把它再賦值成其他的地址。建立引用時(shí)必須進(jìn)行初始化并且決不會(huì)再指向其他不同的變量。什么能被引用若一個(gè)變量聲明為T(mén)&,即引用時(shí),它必須用T類(lèi)型的變量或?qū)ο?,或能夠轉(zhuǎn)換成T類(lèi)型的對(duì)象進(jìn)行初始化若引用類(lèi)型T的初始化不是一個(gè)左值,那么將建立一個(gè)T類(lèi)型的目標(biāo)并用初值初始化,那個(gè)目標(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)行引用對(duì)void進(jìn)行引用是不允許的。void&a=3;void只是在語(yǔ)法上相當(dāng)于一個(gè)類(lèi)型,本質(zhì)上不是類(lèi)型。不能建立引用的數(shù)組。inta[10];int&ra[10]=a;引用本身不是一種數(shù)據(jù)類(lèi)型,故沒(méi)有引用的引用,也沒(méi)有引用的指針。例:inta;int&ra=a;int&*p=&ra;

引用不能用類(lèi)型來(lái)初始化:int&ra=int;

因?yàn)橐檬亲兞炕驅(qū)ο蟮囊?,而不是?lèi)型的引用。有空指針,無(wú)空引用。int&ri=NULL;用引用傳遞函數(shù)參數(shù)傳遞引用給函數(shù)與傳遞指針的效果一樣,傳遞的是原來(lái)的變量或?qū)ο?,而不是在函?shù)作用域內(nèi)建立的變量或?qū)ο蟮母北?。引用具有指針的威力,但是調(diào)用引用傳遞的函數(shù)時(shí),可讀性卻比指針傳遞好。引用具有傳值方式函數(shù)調(diào)用語(yǔ)法的簡(jiǎn)單性與可讀性,但是威力卻比傳值方式強(qiáng)。引用存在的問(wèn)題引用可以表達(dá)清晰并讓程序員負(fù)責(zé)了解如何傳遞參數(shù),但是在有些情況下它們能夠隱藏錯(cuò)誤。

inta=10;intb=20;swap(a,b);引用隱藏了函數(shù)所使用的參數(shù)傳遞的類(lèi)型,無(wú)法從所看到的函數(shù)調(diào)用判斷其是值傳遞還是引用傳遞。例:

voidfn(ints){//…}voidfn(int&t){//…}voidmain(){inta=5;fn(a);}用引用返回值函數(shù)只能返回一個(gè)值,若程序需要從函數(shù)返回多個(gè)值,引用和指針都可以用來(lái)實(shí)現(xiàn)這一過(guò)程。函數(shù)返回值時(shí),要生成一個(gè)值的副本。而用引用返回值時(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ū)ο蟮囊?,這與返回一個(gè)局部作用域指針的性質(zhì)一樣嚴(yán)重。函數(shù)調(diào)用作為左值返回一個(gè)引用使得一個(gè)函數(shù)調(diào)用表達(dá)式成為左值表達(dá)式。只要避免將局部棧中變量的地址返回,就能使函數(shù)調(diào)用表達(dá)式作為左值來(lái)使用。傳遞指針和引用的目的是效率,當(dāng)一個(gè)數(shù)據(jù)類(lèi)型很大時(shí),因?yàn)閭髦狄獜?fù)制副本,故不可取,但傳遞指針和引用存在傳值所沒(méi)有的危險(xiǎn)。保護(hù)實(shí)參不被修改的辦法是傳遞const指針和引用。C++不區(qū)分變量的const引用和const變量的引用。程序決不能給引用本身重新賦值,使它指向另一個(gè)變量,因此引用總是const的。若對(duì)引用應(yīng)用關(guān)鍵詞const,其作用是使目標(biāo)成為const變量。即沒(méi)有:constdoubleconst&a=1;只有:constdouble&a=1;外部存儲(chǔ)類(lèi)型一個(gè)程序在很小的規(guī)模下,可以用一個(gè)源文件來(lái)完整表達(dá)。具有應(yīng)用價(jià)值的程序由多個(gè)源文件組成,根據(jù)C++程序的定義,其中只有一個(gè)源文件具有主函數(shù)main(),而其他的文件不能含有主函數(shù)。所有函數(shù)聲明一般都放在源文件的開(kāi)始位置。構(gòu)成一個(gè)程序的多個(gè)源文件之間,通過(guò)聲明數(shù)據(jù)或函數(shù)為外部的(extern)來(lái)進(jìn)行溝通。帶extern的變量不在本文件中分配空間,而在程序的其它文件中分配空間(變量定義)。默認(rèn)的函數(shù)聲明或定義總是extern的。它告訴連接程序,在所有組成該程序的文件中搜索該函數(shù)。帶extern的變量說(shuō)明是變量聲明,不是變量定義靜態(tài)存儲(chǔ)類(lèi)型靜態(tài)全局變量靜態(tài)函數(shù)在全局變量前加一個(gè)static,使該變量只在這個(gè)源文件中可用,稱(chēng)之為全局靜態(tài)變量(靜態(tài)全局變量)。在一個(gè)源文件中,全局變量和靜態(tài)全局變量沒(méi)有區(qū)別。在多文件組成的程序里,全局靜態(tài)變量使得該變量成為定義該變量的源文件所獨(dú)享。使一個(gè)變量只在一個(gè)源文件中全局使用有時(shí)是必要的。第一,不必?fù)?dān)心另外源文件使用它的名字,該名字在源文件中是唯一的。第二,源文件的全局變量不能被其他源文件使用,不能被其他源文件所修改,保證變量的值是可靠的。

函數(shù)的聲明和定義默認(rèn)情況下在整個(gè)程序中是extern(外部的),有時(shí)需要使某個(gè)函數(shù)只在一個(gè)源文件中有效,不能被其他源文件所用,在函數(shù)前面加上static。它允許其他源文件建立并使用同名的函數(shù),而不相互沖突,在很大的編程項(xiàng)目中它是一個(gè)優(yōu)勢(shì)。在文件作用域下聲明的inline函數(shù)默認(rèn)為static存儲(chǔ)類(lèi)型。聲明的const的常量默認(rèn)為static存儲(chǔ)類(lèi)型。若加上extern,則為外部存儲(chǔ)類(lèi)型。作用域局部作用域函數(shù)作用域文件作用域函數(shù)原型作用域當(dāng)標(biāo)識(shí)符的聲明出現(xiàn)在由一對(duì)花括號(hào)所括起來(lái)的一段程序(塊)內(nèi)時(shí),該標(biāo)識(shí)符的作用域從聲明點(diǎn)開(kāi)始,到塊結(jié)束處為止,該作用域的范圍具有局部性。標(biāo)號(hào)是唯一具有函數(shù)作用域的標(biāo)識(shí)符。goto語(yǔ)句使用標(biāo)號(hào)標(biāo)號(hào)聲明使得該標(biāo)識(shí)符在一個(gè)函數(shù)內(nèi)的任何位置均可以被使用。

函數(shù)原型聲明(不是函數(shù)定義)中所作的參數(shù)聲明在該作用域中。這個(gè)作用域開(kāi)始于函數(shù)原型聲明的左括號(hào),結(jié)束于函數(shù)原型聲明的右括號(hào)。

文件作用域是在所有函數(shù)定義之外說(shuō)明的,其作用域從說(shuō)明點(diǎn)開(kāi)始,一直延伸到源文件結(jié)束。靜態(tài)全局變量和全局變量是文件作用域的,靜態(tài)函數(shù)也是文件作用域的。所以文件作用域也稱(chēng)全局作用域。在頭文件的文件作用域中所進(jìn)行的聲明,若該頭文件被一個(gè)源文件嵌入,則聲明的作用域也擴(kuò)展到該源文件中,直到源文件結(jié)束。可見(jiàn)性可見(jiàn)性從另一角度表現(xiàn)標(biāo)識(shí)符的有效性,標(biāo)識(shí)符在某個(gè)位置可見(jiàn),表示該標(biāo)識(shí)符可以被引用??梢?jiàn)性與作用域是一致的。作用域指的是標(biāo)識(shí)符有效的范圍,而可見(jiàn)性是分析在某一位置標(biāo)識(shí)符的有效性??梢?jiàn)性在分析兩個(gè)同名標(biāo)識(shí)符作用域嵌套的特殊情況時(shí),非常有用。在內(nèi)層作用域中,外層作用域中聲明的同名標(biāo)識(shí)符是不可見(jiàn)的,當(dāng)在內(nèi)層作用域中引用這個(gè)標(biāo)識(shí)符時(shí),表示的是對(duì)內(nèi)層作用域中聲明的標(biāo)識(shí)符的引用。標(biāo)識(shí)符的可見(jiàn)性范圍不超過(guò)作用域,作用域則包含可見(jiàn)范圍。若全局變量被隱藏,則可用符號(hào)::來(lái)引用該全局變量。{inti;charch;i=3;{doublei;i=3.0e3;

溫馨提示

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

評(píng)論

0/150

提交評(píng)論