面向?qū)ο蟪绦蛟O(shè)計(jì)(C語(yǔ)言)_第1頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)(C語(yǔ)言)_第2頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)(C語(yǔ)言)_第3頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)(C語(yǔ)言)_第4頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)(C語(yǔ)言)_第5頁(yè)
已閱讀5頁(yè),還剩163頁(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)介

李?lèi)?ài)華程磊編著清華大學(xué)出版社同名教材

配套電子教案2010年2月面向?qū)ο蟪绦蛟O(shè)計(jì)(C++語(yǔ)言)1第一部分C++語(yǔ)言基礎(chǔ)第1章面向?qū)ο蟪绦蛟O(shè)計(jì)概述第2章C++語(yǔ)言基礎(chǔ)2第1章面向?qū)ο蟪绦蛟O(shè)計(jì)概述本章要點(diǎn):面向過(guò)程的程序設(shè)計(jì)特點(diǎn)面向?qū)ο蟮某绦蛟O(shè)計(jì)概念、基本特征VC++環(huán)境下C++程序的開(kāi)發(fā)過(guò)程31.1面向過(guò)程與面向?qū)ο?/p>

1.1.1面向過(guò)程的程序設(shè)計(jì)

面向過(guò)程的程序設(shè)計(jì)思想的核心是功能分解,通常采用自頂向下的方法進(jìn)行程序設(shè)計(jì),即傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)(StructuredProgramming,SP)方法.面向過(guò)程的程序設(shè)計(jì)的范型是:程序=算法+數(shù)據(jù)結(jié)構(gòu)

41.1.2面向?qū)ο蟮某绦蛟O(shè)計(jì)

面向?qū)ο蟪绦蛟O(shè)計(jì)(Object-OrientedProgramming,OOP)方法強(qiáng)調(diào)以問(wèn)題域(現(xiàn)實(shí)世界)中的事物為中心來(lái)思考和認(rèn)識(shí)問(wèn)題,并按照事物的本質(zhì)特征將其抽象為對(duì)象,以作為構(gòu)成軟件系統(tǒng)的基礎(chǔ)。

5面向?qū)ο蟪绦蛟O(shè)計(jì)方法的特點(diǎn):

(1)OOP方法以“對(duì)象”或“數(shù)據(jù)”為中心。

(2)引入了“類(lèi)”的概念。

(3)OOP方法的模塊性與繼承性保證了新的應(yīng)用程序設(shè)計(jì)可在原有對(duì)象的數(shù)據(jù)類(lèi)型和功能的基礎(chǔ)上通過(guò)重用、擴(kuò)展和細(xì)化來(lái)進(jìn)行,而不必從頭做起或復(fù)制原有代碼。

6與面向過(guò)程的程序設(shè)計(jì)不同,面向?qū)ο蟮某绦蛟O(shè)計(jì)是以數(shù)據(jù)而不是功能為核心,將數(shù)據(jù)以及對(duì)這些數(shù)據(jù)的操作以類(lèi)(class)的形式封裝(encapsulation)為一個(gè)整體,以類(lèi)的對(duì)象(object)作為程序的基本元素,通過(guò)向?qū)ο蟀l(fā)送消息(message),進(jìn)而由對(duì)象啟動(dòng)相關(guān)的方法完成各種功能。同時(shí),數(shù)據(jù)本身不能被類(lèi)外的程序和過(guò)程直接存取,這種機(jī)制增強(qiáng)了數(shù)據(jù)的安全性和軟件的可靠性。7類(lèi)與對(duì)象是抽象與具體的關(guān)系。

在面向?qū)ο蟪绦蛟O(shè)計(jì)中,屬性作為類(lèi)中的數(shù)據(jù)項(xiàng)稱(chēng)為數(shù)據(jù)成員(datamember),表示一類(lèi)對(duì)象所共有的靜態(tài)特性;行為作為類(lèi)中的操作稱(chēng)為成員函數(shù)(memberfunction),表示一類(lèi)對(duì)象所共有的動(dòng)態(tài)特性。8面向?qū)ο蟮某绦蛟O(shè)計(jì)實(shí)例:一個(gè)簡(jiǎn)單的學(xué)生成績(jī)管理系統(tǒng)用來(lái)管理若干個(gè)學(xué)生的信息。每個(gè)學(xué)生的信息包括學(xué)號(hào)、姓名、某門(mén)課的平時(shí)成績(jī)、期末成績(jī)、總評(píng)成績(jī)和名次。為實(shí)現(xiàn)成績(jī)的錄入、計(jì)算、排名、輸出等操作。9classStudent //定義一個(gè)類(lèi)Student{//以下幾項(xiàng)是數(shù)據(jù)項(xiàng),作為類(lèi)內(nèi)的數(shù)據(jù)成員private://數(shù)據(jù)成員是私有的,即對(duì)外部函數(shù)不公開(kāi)

charnumber[10];//學(xué)號(hào)

charname[10]; //姓名

intdailyScore; //平時(shí)成績(jī)

intfinalScore; //期末成績(jī)

floatgeneralScorel; //總評(píng)成績(jī)

intplace; //名次public: //以下是類(lèi)的公有成員函數(shù),是類(lèi)的對(duì)外接口

voidreadData(); //輸入當(dāng)前學(xué)生的學(xué)號(hào)、姓名、平時(shí)及期末成績(jī)

voidcalcuScore(); //計(jì)算當(dāng)前學(xué)生的總評(píng)成績(jī)

voidprintOut(); //按一定的格式輸出當(dāng)前學(xué)生的完整信息

friendvoidsortScore(Studenstu[],intn);//友元,根據(jù)總評(píng)成績(jī)排名得學(xué)生名次};10┆ //類(lèi)內(nèi)函數(shù)及友元函數(shù)的具體實(shí)現(xiàn)代碼省略主函數(shù)中,通過(guò)定義類(lèi)的對(duì)象,再向?qū)ο蟀l(fā)送消息完成程序。intmain(){Studentstu[20];//定義屬于類(lèi)Student的20個(gè)學(xué)生對(duì)象,stu[i]就是每個(gè)學(xué)生的名字inti,n=5; //n=5表示管理5個(gè)學(xué)生的成績(jī)for(i=0;i<n;i++) //通過(guò)向5個(gè)對(duì)象發(fā)送消息,對(duì)象接受消息后調(diào)用成員函數(shù)

Stu[i].ReadData();//ReadData()實(shí)現(xiàn)讀入每個(gè)學(xué)生的信息for(i=0;i<n;i++) //5個(gè)對(duì)象調(diào)用成員函數(shù)calcuScore()計(jì)算總評(píng)成績(jī)

Stu[i].CalcuScore();SortScore(stu,5); //根據(jù)總評(píng)成績(jī)進(jìn)行排名,得出每個(gè)學(xué)生的名次值for(i=0;i<n;i++) //5個(gè)對(duì)象調(diào)用成員函數(shù)PrintOut()輸出各自的信息

stu[i].PrintOut();return0;}11通過(guò)這個(gè)簡(jiǎn)單示例,可以得出以下結(jié)論:

(1)面向?qū)ο蟮某绦蛞话阌深?lèi)的定義和類(lèi)的使用兩部分組成,在函數(shù)中定義類(lèi)的對(duì)象,并向?qū)ο蟀l(fā)送消息,使其響應(yīng)并完成一定功能。(2)程序中的一切操作都是通過(guò)向?qū)ο蟀l(fā)送消息來(lái)實(shí)現(xiàn)的,對(duì)象接收到消息后,啟動(dòng)有關(guān)方法完成相應(yīng)的操作。向?qū)ο蟀l(fā)送消息的形式如下:

對(duì)象名.成員函數(shù)名(實(shí)際參數(shù)表)面向?qū)ο蟮某绦蛟O(shè)計(jì)是一種新型的程序設(shè)計(jì)范型,其特征為:

程序=對(duì)象+消息12向?qū)ο蟀l(fā)送同樣的消息,有可能執(zhí)行不同的代碼產(chǎn)生不同的效果,這就是多態(tài)性(polymorphism)。類(lèi)的使用除了用來(lái)定義對(duì)象完成各種功能以外,還可以在已有類(lèi)的基礎(chǔ)上,再增加一些其它屬性和行為,派生出新的類(lèi),即利用繼承(inheritance)機(jī)制形成父類(lèi)與子類(lèi)的類(lèi)層次關(guān)系;也可以在定義一個(gè)新類(lèi)時(shí)將已定義過(guò)的類(lèi)的對(duì)象作為新類(lèi)的數(shù)據(jù)成員,這是類(lèi)的組合。因此,面向?qū)ο蟪绦蛟O(shè)計(jì)中最突出的特征是“抽象性、封裝性、繼承性和多態(tài)性”,最重要的概念是類(lèi)和對(duì)象,面向?qū)ο蟮某绦蛟O(shè)計(jì)就是圍繞類(lèi)的定義和類(lèi)的使用展開(kāi)的。131.2面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特征

1.2.1新的程序設(shè)計(jì)范型

程序設(shè)計(jì)范型是指設(shè)計(jì)程序的規(guī)范,模型和風(fēng)格,它是一類(lèi)程序設(shè)計(jì)語(yǔ)言的基礎(chǔ)。

面向?qū)ο蟪绦蛟O(shè)計(jì)是一種新型的程序設(shè)計(jì)范型。這種范型的主要特征是:程序=對(duì)象+消息14需要說(shuō)明的是,某一種程序設(shè)計(jì)語(yǔ)言不一定與一種程序設(shè)計(jì)范型相對(duì)應(yīng)。實(shí)際上存在有具備兩種或多種范型的程序設(shè)計(jì)語(yǔ)言,即混合型語(yǔ)言。例如C++就不是純粹的面向?qū)ο蟪绦蛟O(shè)計(jì)范型,而是面向過(guò)程程序設(shè)計(jì)范型和面向?qū)ο蟪绦蛟O(shè)計(jì)范型的混合范型程序設(shè)計(jì)語(yǔ)言。151.2.2面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念

在面向?qū)ο蟪绦蛟O(shè)計(jì)中,包括了對(duì)象、類(lèi)、封裝、繼承、消息傳遞和多態(tài)性等基本概念。

1.對(duì)象(object)

現(xiàn)實(shí)世界中的對(duì)象,具有以下特性:(1)每一個(gè)對(duì)象必須有一個(gè)名字以區(qū)別與其他對(duì)象。(2)用屬性來(lái)描述他的某些特征。(3)有一組操作,每個(gè)操作決定對(duì)象的一種行為。(4)對(duì)象的操作可以分為兩類(lèi):一類(lèi)是自身所承受的操作,一類(lèi)是施加于其他對(duì)象的操作。162.類(lèi)(class)具有相似屬性和行為的一組對(duì)象,就稱(chēng)為類(lèi)。也就是說(shuō),類(lèi)是對(duì)具有相同數(shù)據(jù)結(jié)構(gòu)和相同操作的一類(lèi)對(duì)象的描述。類(lèi)實(shí)質(zhì)上就是一種類(lèi)型,但這種類(lèi)型與一般類(lèi)型不同。類(lèi)包括數(shù)據(jù)成員和成員函數(shù)。

類(lèi)和對(duì)象之間的關(guān)系是抽象和具體的關(guān)系。類(lèi)是多個(gè)對(duì)象進(jìn)行綜合抽象的結(jié)果,一個(gè)對(duì)象是類(lèi)的一個(gè)實(shí)例。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,總是先聲明類(lèi),再由類(lèi)生成其對(duì)象。類(lèi)是建立對(duì)象的“模板”,按照這個(gè)模板所建立的一個(gè)個(gè)具體的對(duì)象,就是類(lèi)的實(shí)際例子,通常稱(chēng)為實(shí)例。173.消息(message)消息是一個(gè)對(duì)象向另一個(gè)對(duì)象發(fā)出的執(zhí)行某種操作的請(qǐng)求,而對(duì)象執(zhí)行操作稱(chēng)為對(duì)消息的響應(yīng)。從實(shí)現(xiàn)代碼看,消息就是通過(guò)一個(gè)對(duì)象對(duì)類(lèi)的成員函數(shù)的一次調(diào)用。一般情況下,我們稱(chēng)發(fā)送消息的對(duì)象為發(fā)送者或請(qǐng)求者,接收消息的對(duì)象為接收者或目標(biāo)對(duì)象。對(duì)象中的聯(lián)系智能通過(guò)消息傳遞來(lái)進(jìn)行。接收對(duì)象只有在接收到消息時(shí),才能被激活,被激活的對(duì)象會(huì)根據(jù)消息的要求完成相應(yīng)的功能。18

消息具有以下3個(gè)性質(zhì):同一個(gè)對(duì)象可以接收不同形式的多個(gè)消息,給出不同的響應(yīng)。相同形式的消息可以傳遞給不同的對(duì)象,所給出的響應(yīng)可以是不同的。消息的響應(yīng)并不是必需的,對(duì)象可以響應(yīng)消息,也可以不響應(yīng)。194.方法(Method)

在面向?qū)ο蟪绦蛟O(shè)計(jì)中,要求某一對(duì)象做某一操作時(shí),就向該對(duì)象發(fā)送一個(gè)相應(yīng)的消息,當(dāng)對(duì)象接收到發(fā)向他的消息時(shí),就調(diào)用有關(guān)的方法,執(zhí)行相應(yīng)的操作。

方法就是對(duì)象能執(zhí)行的操作。方法包括界面和方法體兩部分。方法的界面也就是消息的模式,他給出了方法的調(diào)用協(xié)議;方法體則是體現(xiàn)某種操作的一系列計(jì)算步驟,也就是一段程序。

20消息和方法的關(guān)系是:對(duì)象根據(jù)接收到的消息,調(diào)用相應(yīng)的方法;反過(guò)來(lái),有了方法,對(duì)象才能響應(yīng)相應(yīng)的消息。所以消息模式與方法界面應(yīng)該是一致的。同時(shí),只要方法界面保持不變,方法體的改動(dòng)不會(huì)影響方法的調(diào)用。在C++語(yǔ)言中方法是通過(guò)函數(shù)來(lái)實(shí)現(xiàn)的,稱(chēng)為成員函數(shù)。211.2.3面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特征

本節(jié)將介紹面向?qū)ο蟪绦蛟O(shè)計(jì)的4個(gè)基本特征。

1.抽象性(abstraction)

抽象是通過(guò)特定的實(shí)例(對(duì)象)抽取共同性質(zhì)以后形成概念的過(guò)程。抽象是對(duì)系統(tǒng)的簡(jiǎn)化描述或規(guī)范說(shuō)明,他強(qiáng)調(diào)了系統(tǒng)中的一部分細(xì)節(jié)和特性,而忽略了其他部分。抽象包括兩個(gè)方面:數(shù)據(jù)抽象和行為抽象。

222.封裝性(encapsulation)

封裝是指把數(shù)據(jù)和現(xiàn)實(shí)操作的代碼集中起來(lái)放在對(duì)象內(nèi)部,并盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié)。對(duì)象好像是一個(gè)不透明的黑盒子,表示對(duì)象屬性的數(shù)據(jù)和實(shí)現(xiàn)各個(gè)操作的代碼都被封裝在黑盒子里,從外面是看不見(jiàn)的,更不能從外面直接訪(fǎng)問(wèn)或修改這些數(shù)據(jù)及代碼。使用一個(gè)對(duì)象的時(shí)候,只需知道對(duì)象向外界提供的接口形式而無(wú)需知道對(duì)象的數(shù)據(jù)結(jié)構(gòu)細(xì)節(jié)和現(xiàn)實(shí)操作的算法。23從上面的敘述可以看出,封裝應(yīng)該具有下面的幾個(gè)條件:(1)對(duì)象具有一個(gè)清楚的邊界,對(duì)象的私有數(shù)據(jù)和實(shí)現(xiàn)操作的代碼都被封裝在內(nèi)。(2)具有一個(gè)描述對(duì)象與其他對(duì)象如何相互作用的接口,該接口必須說(shuō)明消息傳遞的使用方法。(3)對(duì)象內(nèi)部的代碼和數(shù)據(jù)應(yīng)受到保護(hù),其他對(duì)象不能直接修改。243.繼承性(Inheritance)在面向?qū)ο蟪绦蛟O(shè)計(jì)中,允許在已有類(lèi)的基礎(chǔ)上通過(guò)增加新特征而派生出新的類(lèi),這稱(chēng)為繼承。

其原有的類(lèi)稱(chēng)為基類(lèi)(Baseclass),而新建立的類(lèi)稱(chēng)為派生類(lèi)(Derivedclass)。例如,車(chē)是一個(gè)類(lèi),而小轎車(chē)就是車(chē)的一個(gè)派生類(lèi),奧迪小轎車(chē)又是小轎車(chē)的一個(gè)派生類(lèi)。

254.多態(tài)性(Polymorphism)

面向?qū)ο笙到y(tǒng)的多態(tài)性是指不同的對(duì)象收到相同消息時(shí)產(chǎn)生多種不同的行為方式。例如,我們有一個(gè)窗口window類(lèi)對(duì)象,還有一個(gè)棋子piece類(lèi)對(duì)象,現(xiàn)在我們來(lái)考慮對(duì)他們都發(fā)出“移動(dòng)”的消息,“移動(dòng)”操作在window類(lèi)對(duì)象和piece類(lèi)對(duì)象上可以有不同的行為。26C++語(yǔ)言支持兩種多態(tài)性,即編譯時(shí)的多態(tài)性和運(yùn)行時(shí)的多態(tài)性。編譯時(shí)的多態(tài)性是通過(guò)重載來(lái)實(shí)現(xiàn)的,運(yùn)行時(shí)的多態(tài)性是通過(guò)虛函數(shù)來(lái)實(shí)現(xiàn)。27重載一般包括函數(shù)重載和運(yùn)算符重載。函數(shù)重載是指一個(gè)標(biāo)識(shí)符可同時(shí)用于多個(gè)函數(shù)命名,而運(yùn)算符重載是指一個(gè)運(yùn)算符可同時(shí)用于多種運(yùn)算。也就是說(shuō),相同名字的函數(shù)或運(yùn)算符在不同的場(chǎng)合可以表現(xiàn)出不同的行為。多態(tài)性增強(qiáng)了軟件的靈活性和重用性,為軟件的開(kāi)發(fā)與維護(hù)提供了極大的便利。尤其是采用了虛函數(shù)和動(dòng)態(tài)聯(lián)編機(jī)制后允許用戶(hù)以更為明確、易懂的方式去建立通用的軟件。281.3面向?qū)ο蟪绦蛟O(shè)計(jì)的語(yǔ)言

下面簡(jiǎn)單介紹幾種典型的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言。(1)smalltalk語(yǔ)言(2)simula語(yǔ)言(3)C++語(yǔ)言(4)java語(yǔ)言291.4C++程序及其開(kāi)發(fā)

C++程序的開(kāi)發(fā)過(guò)程通常包括編輯、編譯、連接、運(yùn)行和調(diào)試等步驟。C++程序開(kāi)發(fā)的集成開(kāi)發(fā)環(huán)境:Microsoft公司的VisualC++Borland公司的C++BuilderIBM的VisualAgeC++VisualC++6.0301.4.1VisualC++6.0集成開(kāi)發(fā)環(huán)境簡(jiǎn)介Microsoft公司1998年推出的功能強(qiáng)大的IDE。311.4.2C++程序的開(kāi)發(fā)過(guò)程321.4.3VisualC++6.0控制臺(tái)應(yīng)用程序開(kāi)發(fā)

C++控制臺(tái)應(yīng)用程序的具體步驟如下。(1)新建一個(gè)項(xiàng)目。在MicrosoftVisualC++6.0環(huán)境下,所有應(yīng)用程序都包含在一個(gè)項(xiàng)目中,所以建立任何應(yīng)用程序的第一步需要建立一個(gè)項(xiàng)目。選擇【File】→【New】命令(快捷鍵Ctrl+N),彈出“New”對(duì)話(huà)框,選中“Project”選項(xiàng)卡。在所列出的“項(xiàng)目”中選擇“Win32ConsoleApplication

”項(xiàng)目(即控制臺(tái)應(yīng)用程序),在對(duì)話(huà)框右側(cè)的“Location”和“ProjectName”文本框中分別輸入路徑和項(xiàng)目名稱(chēng),單擊“OK”按鈕。33(2)進(jìn)入“Win32ConsoleApplication”對(duì)話(huà)框,選擇“Anemptyproject”項(xiàng),表示選擇空項(xiàng)目,單擊“Finish”按鈕,彈出“NewProjectInformation”對(duì)話(huà)框,在確認(rèn)項(xiàng)目建立信息后,單擊“OK”按鈕,至此,完成新項(xiàng)目的建立。34(3)建立和編輯C++源程序文件(即.cpp文件)。選擇【Project】→【AddtoProject】→【New】命令,選中“File”選項(xiàng)卡,在“File”選項(xiàng)卡的項(xiàng)目中選擇“C++SourceFile”項(xiàng),并在“File”文本框中輸入源文件名,確認(rèn)選擇“Addtoproject”,單擊“OK”按鈕將打開(kāi)文件編輯器,可以輸入并編輯C++源程序代碼。

35(4)建立和編輯C++源程序頭文件(即.h文件)。選擇【Project】→【AddtoProject】→【New】命令,選中“File”選項(xiàng)卡,在“File”選項(xiàng)卡的項(xiàng)目中選擇“C/C++HeaderFile”項(xiàng),并在“File”文本框中輸入頭文件名,確認(rèn)選擇“Addtoproject”,單擊“OK”按鈕將打開(kāi)文件編輯器,可以輸入并編輯C++源程序頭文件。36(5)建立可執(zhí)行文件。選擇【Build】→【Build】命令(快捷鍵F7)即可建立可執(zhí)行程序,如程序有語(yǔ)法錯(cuò)誤,則在屏幕下方的輸出窗口中顯示錯(cuò)誤信息。(6)選擇【Build】→【Execute】命令,即可運(yùn)行程序。371.5本章小結(jié)

本章介紹了面向?qū)ο蟪绦蛟O(shè)計(jì)的一些基本概念、基本特征以及VC++6.0程序開(kāi)發(fā)環(huán)境。重點(diǎn)內(nèi)容概括如下。1面向過(guò)程與面向?qū)ο?面向?qū)ο蟪绦蛟O(shè)計(jì)的概念:

面向?qū)ο蟪绦蛟O(shè)計(jì)中涉及的幾個(gè)重要概念和特性:類(lèi)、對(duì)象、封裝、繼承和多態(tài)。

3面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言

4C++程序的開(kāi)發(fā)

38第2章C++語(yǔ)言基礎(chǔ)本章要點(diǎn):簡(jiǎn)單C++程序的結(jié)構(gòu)基本數(shù)據(jù)類(lèi)型的定義與運(yùn)算符數(shù)據(jù)的輸入與輸出內(nèi)聯(lián)函數(shù)、函數(shù)重載引用的概念與使用new和delete異常處理392.1C++語(yǔ)言概述

1.2C++的產(chǎn)生與發(fā)展2.1.1從C到C++

C++語(yǔ)言是在C語(yǔ)言的基礎(chǔ)上為支持面向?qū)ο蟪绦蛟O(shè)計(jì)而研制的一種編程語(yǔ)言。1980年,貝爾實(shí)驗(yàn)室開(kāi)始對(duì)C進(jìn)行改進(jìn)和擴(kuò)充。經(jīng)過(guò)不斷完善,成為目前的C++。C++包括了C的全部特征和優(yōu)點(diǎn),同時(shí)又添加了對(duì)面向?qū)ο缶幊蹋∣OP)的完全支持。40C++現(xiàn)在得到了越來(lái)越廣泛的應(yīng)用,它繼承了C語(yǔ)言的優(yōu)點(diǎn),并有自己的特點(diǎn),最主要的有:(1)C++全面兼容C,這就使許多C代碼不經(jīng)修改就可以為C++所用,用C編寫(xiě)的眾多的函數(shù)庫(kù)和使用軟件可以用于C++中。(2)用C++編寫(xiě)的程序可讀性更好,代碼結(jié)構(gòu)更為合理,可直接地在程序映射問(wèn)題空間的結(jié)構(gòu)。(3)生成代碼的質(zhì)量高,運(yùn)行效率僅比匯編語(yǔ)言代碼段慢10%-20%。41(4)從開(kāi)發(fā)時(shí)間、費(fèi)用到形成軟件的可重用性,可擴(kuò)充性,可維護(hù)性和可靠性等方面有了很大的提高,使得大中型的程序開(kāi)發(fā)項(xiàng)目變得容易的多。(5)支持面向?qū)ο蟮臋C(jī)制,可方便地構(gòu)造出模擬現(xiàn)實(shí)問(wèn)題的實(shí)體和操作。422.1.2一個(gè)簡(jiǎn)單的C++程序

【例2.1】在屏幕上打印輸出一行字符串的程序。

/*02_01.cpp*/#include<iostream>//包含標(biāo)準(zhǔn)輸入輸出頭文件iostreamusingnamespacestd;//引入C++?標(biāo)準(zhǔn)命名空間名stdintmain(){cout<<“WelcometoC++!”<<endl;

//屏幕打印輸出“WelcometoC++!return0; //程序成功返回}

43

WelcometoC++!程序的運(yùn)行結(jié)果為:44說(shuō)明:(1)C++源程序的擴(kuò)展名為.cpp,而C源程序的擴(kuò)展名是.c。(2)頭文件:示例中的#include<iostream>為C++的預(yù)處理指令,它告訴C++編譯器在程序中要包括C++?標(biāo)準(zhǔn)輸入輸出流頭文件。從C繼承的“.h”庫(kù)仍然可用。在C源文件名前加字母c,如#include<stdio.h>在C++程序中可寫(xiě)為#include<cstdio.h>。有關(guān)<iostream>頭文件的內(nèi)容我們將在后續(xù)章節(jié)中介紹。45(3)命名空間:標(biāo)準(zhǔn)C++?引入了一個(gè)可以由程序員命名的作用域,即命名空間(namespace)。在每一個(gè)命名空間中可將一些相關(guān)的實(shí)體(如變量、函數(shù)、對(duì)象、類(lèi)等)放入其中,以解決程序中常見(jiàn)的同名沖突問(wèn)題。std為C++?標(biāo)準(zhǔn)類(lèi)庫(kù)的一個(gè)命名空間名,其中存放了C++?標(biāo)準(zhǔn)庫(kù)中所定義的各種實(shí)體名。程序中的usingnamespacestd;語(yǔ)句稱(chēng)為using指令,它將std命名空間中的實(shí)體名的作用域引入到該程序中。46(4)main()函數(shù):C++中,main()總是返回int類(lèi)型。在標(biāo)準(zhǔn)C++中,返回類(lèi)型不能省略。return0向操作系統(tǒng)返回?cái)?shù)值0,否則返回?cái)?shù)值-1。(5)程序的注釋?zhuān)涸贑語(yǔ)言中,我們用“/*”及“*/”作為注釋分界符號(hào),例如:/*thisisatest*/C++除了保留了這種注釋方式外,還增加了一種以“//”開(kāi)頭的單行注釋方式,該注釋以“//”開(kāi)始,到行尾結(jié)束。/*......*/方式的注釋不能嵌套,但它可以嵌套//方式的注釋。47(6)輸入/輸出:C++源程序中用cin>>和cout<<處理輸入/輸出,而C源程序中用scanf和printf處理輸入/輸出。其中cin稱(chēng)為標(biāo)準(zhǔn)輸入流,cout是標(biāo)準(zhǔn)輸出流,它們都是流對(duì)象;>>是輸入運(yùn)算符,<<是輸出運(yùn)算符。cout<<數(shù)據(jù);//表示把數(shù)據(jù)寫(xiě)到流對(duì)象cout上。cin>>變量;//表示從流對(duì)象cin讀數(shù)據(jù)到變量中。流對(duì)象cin、cout及運(yùn)算符<<、>>的定義,均包含在文件iostream.h中。這就是程序的開(kāi)始要有#include<iostream.h>的原因。482.1.3名字空間

C++語(yǔ)言提供名字空間(namespace)防止命名沖突。

1.名字空間的定義

namespace名字空間名稱(chēng)

{…;}關(guān)于名字空間定義的說(shuō)明:定義名字空間以關(guān)鍵字namespace開(kāi)頭,名字空間名稱(chēng)是合法的用戶(hù)自定義標(biāo)識(shí)符。以一對(duì)大括號(hào)括起該名字空間的開(kāi)始和結(jié)束處,右大括號(hào)后面不加分號(hào)。在名字空間以外聲明或定義的任何實(shí)體,都可以出現(xiàn)在名字空間內(nèi)。492.名字空間中內(nèi)容的使用

方法一:在需要使用名字空間中內(nèi)容時(shí)用下面的形式:名字空間名稱(chēng)::局部?jī)?nèi)容名

方法二:在使用該內(nèi)容之前用:usingnamespace名字空間名稱(chēng);

方法三:using名字空間名稱(chēng)::局部?jī)?nèi)容名;50【例2.2】

關(guān)于名字空間的主要用法示例。

/*02_02.cpp*/#include<iostream>usingnamespacestd;//using聲明使用一個(gè)完整的名字空間std//C++中提供的名字空間std涵蓋了所有標(biāo)準(zhǔn)C++的定義和聲明namespaceone//定義一個(gè)名字空間one,有M和inf{ constintM=200; intinf=10;}//后面不加分號(hào)namespacetwo//定義一個(gè)名字空間two,有x和inf{ intx; intinf=-100;}//后面不加分號(hào)

51usingnamespaceone;//using聲明使用一個(gè)完整的名字空間oneintmain(){usingtwo::x;//using聲明僅使用two中的x x=-100;//直接訪(fǎng)問(wèn),相當(dāng)于two::x=-100; cout<<inf<<endl;//直接使用one中所有成員

cout<<M<<endl; two::inf*=2;//使用名字空間名::局部?jī)?nèi)容名,操作未使用using聲明的內(nèi)容

cout<<two::inf<<endl;//同樣是two中的內(nèi)容,但是訪(fǎng)問(wèn)方式不一樣

cout<<x<<endl;//直接訪(fǎng)問(wèn)two中的x}5210200-200-100程序的運(yùn)行結(jié)果為:532.2基本數(shù)據(jù)類(lèi)型、運(yùn)算符和表達(dá)式

2.2.1基本數(shù)據(jù)類(lèi)型

1.?dāng)?shù)據(jù)類(lèi)型

C++提供了十分豐富的預(yù)定義數(shù)據(jù)類(lèi)型,稱(chēng)為基本數(shù)據(jù)類(lèi)型。除了基本數(shù)據(jù)類(lèi)型外,C++還提供了構(gòu)造數(shù)據(jù)類(lèi)型,包括數(shù)組、結(jié)構(gòu)體、共用體(聯(lián)合體)、枚舉和類(lèi)等。C++可以使用的數(shù)據(jù)類(lèi)型如圖2.1所示。

54圖2.1C++的數(shù)據(jù)類(lèi)型布爾型(bool)結(jié)構(gòu)體類(lèi)型(struct)數(shù)組類(lèi)型雙精度型(double)整型(int)長(zhǎng)整型(longint)短整型(short)單精度型(float)長(zhǎng)雙精度型(longdouble)枚舉類(lèi)型(enum)空類(lèi)型(void)數(shù)據(jù)類(lèi)型基本類(lèi)型構(gòu)造類(lèi)型指針類(lèi)型引用類(lèi)型整型字符型(char)浮點(diǎn)型類(lèi)類(lèi)型共用體類(lèi)型(union)55數(shù)據(jù)類(lèi)型關(guān)鍵字字節(jié)數(shù)數(shù)值范圍字符型char1-128~127整型int4-214783648~2147483647單精度浮點(diǎn)型float4±(3.4E-38~3.4E38)雙精度浮點(diǎn)型double8±(1.8E-308~1.8E308)長(zhǎng)雙精度浮點(diǎn)型longdouble10±(1.2E-4932~1.2E4932)布爾型bool1true,false無(wú)值型void0valueless表2.1C++的五種基本數(shù)據(jù)類(lèi)型

56C++的類(lèi)型修飾符如下:

signed 有符號(hào)型

unsigned 無(wú)符號(hào)型

short 短型

long 長(zhǎng)型4種修飾符都可以用來(lái)修飾整型和字符型。signed修飾的類(lèi)型的值可以為正數(shù)或負(fù)數(shù)。unsigned修飾的類(lèi)型的值只能為正數(shù)。short修飾的類(lèi)型的值一定不大于對(duì)應(yīng)的整數(shù)。long修飾的類(lèi)型的值一定不小于對(duì)應(yīng)的整數(shù)。在基本數(shù)據(jù)類(lèi)型修飾符后,C++的基本數(shù)據(jù)類(lèi)型如表2.2所示。57數(shù)據(jù)類(lèi)型標(biāo)識(shí)符字節(jié)數(shù)數(shù)值范圍常量寫(xiě)法舉例char1-128~127‘A’,‘\n’signedchar1-128~12756unsignedchar10~255100short[int]2-32768~32767100signedshort[int]2-32768~32767-3456unsignedshort[int]20~655350xffint4-214783648~21474836471000signedint4-214783648~2147483647-123456unsignedint40~42949672950xfffflong[int]4-214783648~2147483647-123456signedlong[int]4-214783648~2147483647-3246unsignedlong[int]40~4294967295123456float4±(3.4E-38~3.4E38)2.35,-53.231,3E-2double8±(1.7E-308~1.7E308)12.354,-2.5E10longdouble10±(1.2E-4932~1.2E4932)8.5E-300582.C++中的標(biāo)識(shí)符

C++中的標(biāo)識(shí)符必須符合如下命名規(guī)則:(1)一個(gè)標(biāo)識(shí)符必須是一個(gè)字母/下劃線(xiàn)(_)/數(shù)字的串,其首字符必須是字母,下劃線(xiàn)在C++中被認(rèn)為是一個(gè)字母;(2)

C++

標(biāo)準(zhǔn)中對(duì)標(biāo)識(shí)符的長(zhǎng)度不限,但具體的機(jī)器對(duì)標(biāo)識(shí)符的長(zhǎng)度有限制;(3)

C++

中的關(guān)鍵字(見(jiàn)表2.3)不能用作用戶(hù)標(biāo)識(shí)符,標(biāo)準(zhǔn)庫(kù)函數(shù)名、類(lèi)名亦不能用作用戶(hù)標(biāo)識(shí)符;59表2.3標(biāo)準(zhǔn)C++的關(guān)鍵字

C與C++關(guān)鍵字autodegaultfloatregisterstructvolatilebreakdoforreturnswitchwhilecasedoublegotoshorttypedefcharelseifsignedunionconstenumintsizeofunsignedcontinueexternlongstaticvoidC++關(guān)鍵字asmdynamic_castnamespacereinterpret_casttryboolexplicitnewstatic_casttypeidcatchfalseoperatortemplatetypenameclassfriendprivatethisunsingconst_castinlineprotectedthrowvirtualdeleteexternlingstaticvoidC++運(yùn)算符關(guān)鍵字and(&&)or(||)not(!)not_eq(!=)bitand(&)bitor(|)xor(^)compl(~)and_eq(&=)or_eq(|=)xor_eq(^=)

603.常量和變量

數(shù)據(jù)可分為常量和變量?jī)纱箢?lèi)。常量(Constant):是指在程序的執(zhí)行過(guò)程中其值不會(huì)發(fā)生改變的數(shù)據(jù)。變量(Variable):是指在程序執(zhí)行過(guò)程中其值可以被改變的數(shù)據(jù)。常量按照不同的數(shù)據(jù)類(lèi)型可以分為:字符型常量整型常量浮點(diǎn)型常量字符串常量61整型常量:十進(jìn)制格式:由數(shù)字0至9和正、負(fù)號(hào)組成,書(shū)寫(xiě)時(shí)直接寫(xiě)出數(shù)字,如123,516等。若為longint型的常量,需在常量后加一個(gè)字母l或L,例如123L。八進(jìn)制格式:以0開(kāi)頭的數(shù)字(0至7)序列,如011,010007,0177777等。如011表示八進(jìn)制數(shù)11,即(11)8,它相當(dāng)于十進(jìn)制數(shù)9。十六進(jìn)制格式:以0x或0X開(kāi)頭的數(shù)字(數(shù)字0至9、字母a至f)序列,如0x11,0x78AC,0xFFFF等。如0x11表示十六進(jìn)制數(shù)11,即(11)16,它相當(dāng)于十進(jìn)制數(shù)17。

62浮點(diǎn)型常量:

浮點(diǎn)型常量可以用十進(jìn)制小數(shù)形式或指數(shù)形式表示。

在程序中的常量有以下3種表示方法。

在程序中直接寫(xiě)入常量inti;chars;floatf;i=20;s='a';f=2.0;利用#define定義宏常量

#define宏名

常數(shù)例如:#definePI3.14…………s=2*PI*r;…………

63利用const定義正規(guī)常數(shù)

const[數(shù)據(jù)類(lèi)型標(biāo)識(shí)符]常數(shù)名=常量值;說(shuō)明:①

const必須放在被修飾類(lèi)型符和類(lèi)型名的前面。②

數(shù)據(jù)類(lèi)型是一個(gè)可選項(xiàng),用來(lái)指定常數(shù)值的數(shù)據(jù)類(lèi)型,如果省略了該數(shù)據(jù)類(lèi)型,那么,C++編譯程序認(rèn)為它是int類(lèi)型。644.變量

變量是用于保存程序運(yùn)算過(guò)程中所需要的原始數(shù)據(jù)、中間運(yùn)算結(jié)果和最終結(jié)果的其值可以改變的量。

定義變量:程序中的每一變量都要先定義、后使用。定義變量主要是告訴編譯系統(tǒng)該變量的名稱(chēng)和數(shù)據(jù)類(lèi)。定義變量3種格式:[修飾符]數(shù)據(jù)類(lèi)型標(biāo)識(shí)符

變量名列表;[修飾符]數(shù)據(jù)類(lèi)型標(biāo)識(shí)符

變量名=初始化值;[修飾符]數(shù)據(jù)類(lèi)型標(biāo)識(shí)符

變量名1[=初始值1],變量名2[=初始值2],……;

65定義變量時(shí),可以在類(lèi)型前面加上一些修飾符來(lái)表示這些變量的使用方法。

C++中常用的變量定義修飾符如表2.5所示。表2.5C++中的變量定義修飾符

特殊符類(lèi)規(guī)格符號(hào)volatileregisterstaticexternautolongshortdoublesignedunsigned66修飾符的含義如下:①volatile:說(shuō)明一種特殊的變量,其值可能隨時(shí)變化。關(guān)鍵字volatile用于一些特殊的程序,它是一個(gè)高級(jí)修飾符。②register:指明一類(lèi)頻繁使用的變量,這些變量應(yīng)放在計(jì)算機(jī)的寄存器中。③static:在函數(shù)體外說(shuō)明為static的變量只能由定義該變量的文件訪(fǎng)問(wèn),在函數(shù)體內(nèi)說(shuō)明為static的變量表示該變量是永久的,它只被初始化一次。

67④extern:表示該變量已經(jīng)在其他文件中定義了,這里只是對(duì)該變量進(jìn)行說(shuō)明。⑤auto:從堆棧中分配的變量。該關(guān)鍵字很少使用。⑥long:修飾整數(shù)。⑦short:修飾整數(shù)。⑧double:修飾浮點(diǎn)數(shù)。⑨signed:僅修飾整數(shù)型和字符型,表示為有符號(hào)的。⑩unsigned:僅修飾整數(shù)型和字符型,表示為無(wú)符號(hào)的。

68變量的初始化:

在定義變量的同時(shí)可以給變量賦一個(gè)初值,稱(chēng)為變量的初始化。

初值可以是常量,也可以是一個(gè)有確定值得表達(dá)式,系統(tǒng)會(huì)自動(dòng)計(jì)算得到一個(gè)值,賦給該變量。例如,inta=5,b=6*(3+5);在對(duì)多個(gè)變量賦于同一個(gè)初值時(shí),必須分別指定,應(yīng)當(dāng)寫(xiě)成inta=8,b=8,c=8;

或者inta,b,c=8;a=b=c;而不能寫(xiě)成inta=b=c=8;69定義變量的位置:

在程序中的不同位置采用不同的變量定義方式?jīng)Q定了該變量具有不同的特點(diǎn)。變量的定義一般可有以下3種位置。(1)在函數(shù)體內(nèi)部在函數(shù)體內(nèi)部定義的變量稱(chēng)為局部變量,這種局部變量只在進(jìn)入定義它的函數(shù)體時(shí)起作用,離開(kāi)該函數(shù)體后該變量就消失(被釋放),即不再起作用。因此,不同函數(shù)體內(nèi)部可以定義相同名稱(chēng)的變量,而互不干擾。

C++語(yǔ)言提供了局部變量更加靈活的定義方式,在滿(mǎn)足先定義后使用的原則下,局部變量可以隨用隨定義,局部變量的定義和聲明可以在程序塊的任何位置出現(xiàn),這時(shí)變量的作用域?yàn)閺亩x點(diǎn)到該變量所在的最小程序塊末的范圍。70(2)形式參數(shù)

當(dāng)定義一個(gè)有參函數(shù)時(shí),函數(shù)名后面括號(hào)內(nèi)的變量統(tǒng)稱(chēng)為形式參數(shù)。例如:intfunc(intx,inty){if(x>y)returnx;elsereturny;}71(3)全局變量在所有函數(shù)體的外部定義的變量,其作用范圍是整個(gè)程序,并在整個(gè)程序運(yùn)行期間有效。在C++語(yǔ)言中,通過(guò)在同名變量前加上域解析符“::”對(duì)被隱藏的同名全局變量進(jìn)行訪(fǎng)問(wèn)。這樣,域解析符解決了同名局部變量與全局變量的重名問(wèn)題,提供了一種在同名局部變量的作用域內(nèi)訪(fǎng)問(wèn)同名全局變量的方法,擴(kuò)大了同名全局變量的作用域,使全局變量具有真正意義上的全局作用范圍。

72【例2.3】局部變量隨用隨定義及用域解析符擴(kuò)大變量的作用域示例。/*02_03.cpp*/#include<iostream>usingnamespacestd;//使用C++的標(biāo)準(zhǔn)名字空間intsum=5050;//定義全局變量

sumintmain(){intarr[3],i;//定義變量,但是i的作用域?yàn)槿サ舻谝粋€(gè)for內(nèi)的變量i{for(inti=0;i<3;i++)//定義另一個(gè)局部變量i,其作用域僅在本循環(huán)內(nèi)

cin>>arr[i]; }intsum=0;//定義局部變量sum,與全局sum同名,該函數(shù)內(nèi)//默認(rèn)的sum是該局部變量,其作用域到函數(shù)結(jié)束處for(i=0;i<3;i++)//此處的i為函數(shù)開(kāi)始處定義的isum+=arr[i];for(i=0;i<3;i++)//此處的i為函數(shù)開(kāi)始處定義的icout<<arr[i]<<endl;cout<<”局部sum=”<<sum<<endl;//輸出局部sum變量的值::sum+=sum;//通過(guò)域解析符在同名局部變量的作用域內(nèi)對(duì)全局sum訪(fǎng)問(wèn)//賦值號(hào)右邊的sum為同名局部變量

cout<<”全局sum=”<<::sum<<endl;//輸出全局sum變量的值

cout<<return0;}73運(yùn)行程序,從鍵盤(pán)上輸入:123<回車(chē)>程序的運(yùn)行結(jié)果為:123局部sum=6全局sum=5056745.const修飾符與指針的結(jié)合

在定義指針時(shí),若與const修飾符結(jié)合在一起使用,根據(jù)const出現(xiàn)的次數(shù)及二者位置關(guān)系的不同,可以定義3種不同的指針——指向常量的指針、常指針、指向常量的常指針。(1)指向常量的指針

定義形式:const類(lèi)型名*指針名;

例如:intx=5;constint*p;p=&x;75(2)常指針定義形式:類(lèi)型名*const指針名=地址值;

例如:intx=5;int*constp=&x;(3)指向常量的常指針

定義形式:const類(lèi)型名*const指針名=地址值;

例如:intx=5;constint*constp=&x766.新增bool類(lèi)型

為了更方便地處理邏輯值,C++語(yǔ)言保持了C語(yǔ)言用0表示邏輯假,非0表示邏輯真的用法,新增加了數(shù)據(jù)類(lèi)型bool:用常量true

表示邏輯真。用常量false表示邏輯假。所有的關(guān)系運(yùn)算、邏輯運(yùn)算都產(chǎn)生bool類(lèi)型的結(jié)果值。可以使用C++標(biāo)準(zhǔn)庫(kù)提供的boolalpha操縱符使邏輯真、邏輯假輸出為true或false,可以用noboolalpha操縱符使輸出恢復(fù)為1或0。

77【例2.4】

布爾型變量使用示例。/*02_04.cpp*/#include<iostream>usingnamespacestd;voidmain(){boolf=1<2;cout<<f<<""<<boolalpha<<f<<""<<noboolalpha<<f<<endl;}

1true1程序的運(yùn)行結(jié)果為:786.新增string類(lèi)型

C++語(yǔ)言新增加了string類(lèi)型來(lái)代替C語(yǔ)言中以‘\0’結(jié)尾的char類(lèi)型數(shù)組。使用string類(lèi)型必須包含頭文件string,string類(lèi)型實(shí)際上封裝字符串?dāng)?shù)據(jù)的容器類(lèi)。

優(yōu)點(diǎn):有了string類(lèi)型,程序員無(wú)需關(guān)心內(nèi)存如何分配,也無(wú)需處理復(fù)雜的‘\0’結(jié)束字符,這些操作將由系統(tǒng)自動(dòng)完成。String類(lèi)型提供的操作:賦值、讀寫(xiě)、求串長(zhǎng)、字符串聯(lián)結(jié)、修改、比較、查找等。

797.枚舉類(lèi)型

在C語(yǔ)言中以如下方式聲明一個(gè)枚舉類(lèi)型WEEK并定義一個(gè)該類(lèi)型的變量w:enumWEEK{Sun,Mon,Tue,Wed,Thu,Fri,Sat};enumWEEKw;在C++語(yǔ)言中直接用WEEKw;定義,無(wú)需要再寫(xiě)enum。用匿名enum來(lái)定義符號(hào)常量,例如:enum{Min=0,Max=100};這樣Min、Max成為常量,定義intx=Min,arr[Max];合法。808.無(wú)名聯(lián)合

無(wú)名聯(lián)合是C++語(yǔ)言中一種特殊的聯(lián)合,它在關(guān)鍵字union后沒(méi)有給出聯(lián)合體的類(lèi)型名稱(chēng),這樣做可以使一組變量共享同一段內(nèi)存空間,起始地址相同。例如,union{charc; inti;doubled;};在此無(wú)名聯(lián)合中,變量c、i、d具有相同的起始地址。無(wú)名聯(lián)合可通過(guò)使用其中數(shù)據(jù)項(xiàng)名字直接存取數(shù)據(jù),例如:i=0;c='A';d=21.8;都是正確的,這與在C語(yǔ)言中必須通過(guò)聯(lián)合體變量名.數(shù)據(jù)項(xiàng)名字的操作方式不同。

819.?dāng)U展了的結(jié)構(gòu)體類(lèi)型

C++語(yǔ)言的結(jié)構(gòu)體類(lèi)型與C語(yǔ)言結(jié)構(gòu)體類(lèi)型有兩個(gè)區(qū)別:(1)在C++語(yǔ)言中定義結(jié)構(gòu)體類(lèi)型時(shí),struct后面的標(biāo)識(shí)符可以直接作為該結(jié)構(gòu)體類(lèi)型的類(lèi)型名,例如:structPoint{doublex,y;};Pointp;

//在C++語(yǔ)言中Point可作為類(lèi)型structPointp;

//在C語(yǔ)言中必須這樣寫(xiě)82(2)C++語(yǔ)言的結(jié)構(gòu)體中不僅包含了數(shù)據(jù)成員,還可以將對(duì)這些數(shù)據(jù)成員進(jìn)行操作的成員函數(shù)也定義在結(jié)構(gòu)體內(nèi),體現(xiàn)了數(shù)據(jù)與對(duì)數(shù)據(jù)的操作不分離的思想,這也是面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ),例如:structPoint{doublex,y;//數(shù)據(jù)成員

voidSetVal(doublea,doubleb){x=a;y=b;}//成員函數(shù)}p;//結(jié)構(gòu)體變量

語(yǔ)句:p.SetVal(2.3,5.8);其作用等同于:p.x=2.3;p.y=5.8;8310.void型指針

void通常表示無(wú)值,但將void作為指針的類(lèi)型時(shí),它卻表示不確定的類(lèi)型。這種void型指針是一種通用型指針,也就是說(shuō)任何類(lèi)型的指針值都可以賦給void類(lèi)型的指針變量。例如下面的程序段:voidpa;void*pc;inti=456;charc=’a’;pc=&i;pc=&c;84需要指出的是,這里說(shuō)void型指針是通用型指針,是指它可以接收任何類(lèi)型的指針的賦值,但對(duì)已獲值的void型指針,對(duì)它在進(jìn)行處理,如輸出或傳遞指針值時(shí),則必須再進(jìn)行顯示類(lèi)型轉(zhuǎn)換,否則會(huì)出錯(cuò)。

85【例2.5】

void型指針的使用。

/*02_05.cpp*/#include<iostream>usingnamespacestd;intmain(){void*pc;inti=456;charc=’a’;pc=&i;cout<<*(int*)pc<<endl;pc=&c;cout<<*(char*)pc<<endl;return0;}862.2.2運(yùn)算符和表達(dá)式

根據(jù)參加運(yùn)算對(duì)象的個(gè)數(shù)分類(lèi),C++語(yǔ)言中的運(yùn)算符可分為:

一元運(yùn)算符(UnaryOperator),或稱(chēng)“單目算符”,即參加運(yùn)算對(duì)象的數(shù)目為一個(gè);二元運(yùn)算符(BinaryOperator),或稱(chēng)“雙目算符”,即參加運(yùn)算對(duì)象的數(shù)目為兩個(gè);

三元運(yùn)算符(TernaryOperator),或稱(chēng)“三目算符”,即參加運(yùn)算對(duì)象的數(shù)目為三個(gè)。8788表2.4C++中運(yùn)算符的優(yōu)先級(jí)和結(jié)合性?xún)?yōu)先級(jí)運(yùn)算符結(jié)合性1::自左至右2()[]->..*->*自左至右3!~++--sizeofnew[]delete[]自右至左4*/%自左至右5+-自左至右6<<>>自左至右7<<=>>=自左至右8==!=自左至右9&自左至右10^自左至右11|自左至右12&&自左至右13||自左至右14?:自右至左15=+=-=*=/=%=<<=>>=&=^=|=自右至左16throw自右至左17,自左至右892.2.3數(shù)據(jù)類(lèi)型轉(zhuǎn)換

當(dāng)表達(dá)式中出現(xiàn)了多種類(lèi)型數(shù)據(jù)的混合運(yùn)算時(shí),首先需要進(jìn)行類(lèi)型轉(zhuǎn)換,其次再計(jì)算表達(dá)式的值。C++允許不同基本類(lèi)型的量混合參加運(yùn)算,因此,編程中我們常常需要進(jìn)行類(lèi)型之間的相互轉(zhuǎn)換。

類(lèi)型轉(zhuǎn)換分為:隱式的類(lèi)型轉(zhuǎn)換顯式的類(lèi)型轉(zhuǎn)換兩種。

90【例2.6】隱式類(lèi)型轉(zhuǎn)換實(shí)例。/*02_06.cpp/#include<iostream>usingnamespacestd;doublegt(floatx,floaty)//參數(shù)虛實(shí)結(jié)合時(shí)自動(dòng)進(jìn)行隱式的類(lèi)型轉(zhuǎn)換{

returnx>y?x:y;//

將表達(dá)式值的類(lèi)型進(jìn)行隱式的類(lèi)型轉(zhuǎn)換}intmain(){inti=23,j=45,result;doubled;d=i;//進(jìn)行隱式類(lèi)型轉(zhuǎn)換,i轉(zhuǎn)換為double類(lèi)型后賦值給dresult=gt(i,j);//i,j轉(zhuǎn)換成float類(lèi)型進(jìn)行參數(shù)傳遞//gt(i,j)的結(jié)果為double類(lèi)型,隱式類(lèi)型轉(zhuǎn)換后賦值給resultcout<<”result=”<<result<<endl;return0;}91result=45程序的運(yùn)行結(jié)果為:92所謂顯式,就是在編程時(shí),我們需手工利用這些操作符進(jìn)行類(lèi)型轉(zhuǎn)換。

C++語(yǔ)言中仍支持C語(yǔ)言中的類(lèi)型轉(zhuǎn)換形式,即:(目標(biāo)類(lèi)型名)待轉(zhuǎn)換源數(shù)據(jù)

例如:將一個(gè)float型的值轉(zhuǎn)換為int型結(jié)果,可以使用如下格式進(jìn)行轉(zhuǎn)換:

floatf=100.23;intx=(int)f;93C++語(yǔ)言提供了另一種更為方便類(lèi)似于函數(shù)調(diào)用的轉(zhuǎn)換方式:

目標(biāo)類(lèi)型名(待轉(zhuǎn)換源數(shù)據(jù))上面的轉(zhuǎn)換在C++語(yǔ)言中寫(xiě)成:

x=int(f);

類(lèi)型轉(zhuǎn)換通過(guò)調(diào)用類(lèi)型轉(zhuǎn)換函數(shù)實(shí)現(xiàn)。C++是一種強(qiáng)類(lèi)型語(yǔ)言,類(lèi)型由低向高的轉(zhuǎn)換一般是安全的、無(wú)副作用的,反之可能導(dǎo)致不期望的結(jié)果或錯(cuò)誤。總之,類(lèi)型轉(zhuǎn)換在編程時(shí)應(yīng)慎用。942.3數(shù)據(jù)的輸入與輸出

2.3.1

I/O的書(shū)寫(xiě)格式

在C++語(yǔ)言中,數(shù)據(jù)的輸入和輸出是通過(guò)I/O流來(lái)實(shí)現(xiàn)的,分別使用系統(tǒng)所提供的輸入流對(duì)象cin和輸出流對(duì)象cout來(lái)完成的。在使用過(guò)程中,只要在程序的開(kāi)頭嵌入相應(yīng)的頭文件“iostream.h”即可。

951.?dāng)?shù)據(jù)的輸出cout

輸出流對(duì)象cout輸出數(shù)據(jù)語(yǔ)句的一般格式為:

cout<<數(shù)據(jù)1<<數(shù)據(jù)2<<……<<數(shù)據(jù)n;說(shuō)明:(1)cout是系統(tǒng)預(yù)定義的一個(gè)標(biāo)準(zhǔn)輸出設(shè)備(一般代表顯示器);“<<”是輸出操作符,用于向cout輸出流中插入數(shù)據(jù)。(2)cout的作用是向標(biāo)準(zhǔn)輸出設(shè)備上輸出數(shù)據(jù),被輸出的數(shù)據(jù)可以是常量、已有值的變量或是一個(gè)表達(dá)式。

962.?dāng)?shù)據(jù)的輸入cin在C++程序中,數(shù)據(jù)的輸入通常采用輸入流對(duì)象cin來(lái)完成。其格式如下:cin>>變量名1>>變量名2>>……>>變量名n;說(shuō)明:(1)cin是系統(tǒng)預(yù)定義的一個(gè)標(biāo)準(zhǔn)輸入設(shè)備(一般代表鍵盤(pán));“>>”是輸入操作符,用于從cin輸入流中取得數(shù)據(jù),并將取得的數(shù)據(jù)傳送給其后的變量,從而完成輸入數(shù)據(jù)的功能。(2)cin的功能是:當(dāng)程序在運(yùn)行過(guò)程中執(zhí)行到cin時(shí),程序會(huì)暫停執(zhí)行并等待用戶(hù)從鍵盤(pán)輸入相應(yīng)數(shù)目的數(shù)據(jù),用戶(hù)輸入完數(shù)據(jù)并回車(chē)后,cin從輸入流中取得相應(yīng)的數(shù)據(jù)并傳送給其后的變量。97(3)“>>”操作符后除了變量名外不得有其他數(shù)字、字符串或字符,否則系統(tǒng)會(huì)報(bào)錯(cuò)。

(4)cin后面所跟的變量可為任何數(shù)據(jù)類(lèi)型,若變量為整型數(shù)據(jù)類(lèi)型,則在程序運(yùn)行過(guò)程中從鍵盤(pán)輸入數(shù)據(jù)時(shí),可分別按十進(jìn)制、八進(jìn)制或十六進(jìn)制格式輸入該整數(shù)。

(5)當(dāng)程序中用cin輸入數(shù)據(jù)時(shí),最好在該語(yǔ)句之前用cout輸出一個(gè)需要輸入數(shù)據(jù)的提示信息,以正確引導(dǎo)和提示用戶(hù)輸入正確的數(shù)據(jù)。

(6)當(dāng)一個(gè)cin后面同時(shí)跟有多個(gè)變量時(shí),則用戶(hù)輸入數(shù)據(jù)的個(gè)數(shù)應(yīng)與變量的個(gè)數(shù)相同,各數(shù)據(jù)之間用一個(gè)或多個(gè)空格隔開(kāi),輸入完畢后按回車(chē)鍵;或者,每輸入一個(gè)數(shù)據(jù)按回車(chē)鍵也可。

982.3.2簡(jiǎn)單的I/O格式控制

C++的I/O流類(lèi)庫(kù)提供了一些控制符,可以直接嵌入到輸入/輸出語(yǔ)句中來(lái)實(shí)現(xiàn)I/O格式控制。使用格式控制符首先必須在源程序的開(kāi)頭包含iomanip.h。

表2.5中列出了幾個(gè)常用的I/O流類(lèi)庫(kù)格式控制符。99表2.5常用的I/O流控制符

控制符含義dec數(shù)值數(shù)據(jù)采用十進(jìn)制hex數(shù)值數(shù)據(jù)采用十六進(jìn)制oct數(shù)值數(shù)據(jù)采用八進(jìn)制ws提取空白符endl插入換行符,并刷新流ends插入空字符setfill(c)在給定的輸出域?qū)挾葍?nèi)填充字符csetprecision(int)設(shè)置浮點(diǎn)數(shù)的小數(shù)位數(shù)(包括小數(shù)點(diǎn))setw(int)設(shè)置域?qū)抯etiosflags(ios::left)左對(duì)齊setiosflags(ios::scientific)指數(shù)顯示100在使用setw(n)是要注意:(1)如一個(gè)輸出量需要比setw(n)確定的字符數(shù)更多的字符,則該輸出量將使用它所需要的寬度。例如:floatsum=3.12345;cout<<setw(4)<<sum<<endl;其運(yùn)行結(jié)果為:3.12345它并不按4位寬度,而是按實(shí)際跨度輸出。(2)setw(n)僅僅影響下一個(gè)數(shù)值輸出,使用setw設(shè)置的間隔方式并不保留其效力。例如:cout<<200<<setw(8)<<400<<600<<endl;其運(yùn)行結(jié)果為:200400600運(yùn)行結(jié)果中600并沒(méi)有按寬度8輸出。Setw()的默認(rèn)寬度為0,意思是按輸出數(shù)值表示的寬度輸出。1012.4

C++中函數(shù)的新特性

2.4.1函數(shù)的原型

C++中函數(shù)原型聲明的形式為:

函數(shù)返回值類(lèi)型

函數(shù)名(形式參數(shù)表);

對(duì)函數(shù)的原型聲明,作以下幾點(diǎn)說(shuō)明:函數(shù)原型最簡(jiǎn)單的聲明方法是將函數(shù)定義的首部復(fù)制到調(diào)用點(diǎn)之前,然后在最后加一個(gè)分號(hào)。102函數(shù)返回值類(lèi)型建議都要給定,若一個(gè)函數(shù)沒(méi)有返回值,則必須在原型聲明中聲明其返回值類(lèi)型為void。函數(shù)原型參數(shù)表中必須指明形式參數(shù)的個(gè)數(shù)和類(lèi)型,形式參數(shù)名可以省略。

先定義后被調(diào)用的函數(shù)以及main函數(shù)無(wú)需作原型聲明。

1032.4.2默認(rèn)參數(shù)的函數(shù)

一般情況下,實(shí)參個(gè)數(shù)應(yīng)該與形參個(gè)數(shù)相同,但C++允許實(shí)參個(gè)數(shù)與形參個(gè)數(shù)不同。方法是在說(shuō)明函數(shù)原型時(shí),為一個(gè)或多個(gè)形參指定缺省值,以后調(diào)用此函數(shù)時(shí),若省略其中某一實(shí)參,C++自動(dòng)地以缺省值作為相應(yīng)參數(shù)的值。

intinit(intx=5,inty=10);則x與y的缺省值分別為5和10。104當(dāng)進(jìn)行函數(shù)調(diào)用時(shí),編譯器按從左向右順序?qū)?shí)參和形參結(jié)合,若未指定足夠的實(shí)參,則編譯器按順序調(diào)用函數(shù)原型中的缺省值來(lái)補(bǔ)足所缺少的實(shí)參。例如以下的函數(shù)調(diào)用都是允許的。init(100,80);//x=100,y=80init(25);//x=25,y=10init(10);//x=5,y=10105說(shuō)明:

(1)在函數(shù)原型中,所有取缺省值的參數(shù)都必須出現(xiàn)在不缺省值的參數(shù)的右邊。亦即,一旦開(kāi)始定義取缺省值的參數(shù),就不可以在說(shuō)明非缺省的參數(shù)。例如:intfun(inti,intj=5,intk);是錯(cuò)誤的,因?yàn)樵谌∪笔≈祬?shù)的

intj=5后,不應(yīng)再說(shuō)明非缺省參數(shù)intk。若改為:intfun(inti,intk,intj=5);就正確了106(2)在函數(shù)調(diào)用時(shí),實(shí)際參數(shù)提供的順序應(yīng)該是從左到右依次提供,實(shí)際參數(shù)的最少個(gè)數(shù)應(yīng)等于不具有默認(rèn)參數(shù)值的形式參數(shù)個(gè)數(shù)。若某個(gè)參數(shù)省略,則其后的參數(shù)皆應(yīng)省略而采用缺省值。不允許某個(gè)參數(shù)省略后,在給其后的參數(shù)指定參數(shù)值。例如不允許出現(xiàn)以下調(diào)用init()函數(shù)的語(yǔ)句:init(,20);107(3)如果制定了默認(rèn)參數(shù)值的形式參數(shù)在調(diào)用時(shí)又得到了實(shí)際參數(shù),則實(shí)際參數(shù)值優(yōu)先。在調(diào)用時(shí)如果不提供對(duì)應(yīng)參數(shù),形式參數(shù)才使用默認(rèn)參數(shù)值。

1082.4.3內(nèi)聯(lián)函數(shù)

在函數(shù)說(shuō)明前冠以關(guān)鍵字“inline”,該函數(shù)就被聲明為內(nèi)聯(lián)函數(shù)。每當(dāng)程序中出現(xiàn)對(duì)該函數(shù)的調(diào)用時(shí),C++編譯器使用函數(shù)體中的代碼插入到調(diào)用該函數(shù)的語(yǔ)句之處,在程序運(yùn)行時(shí)不再進(jìn)行函數(shù)調(diào)用。為什么要引入內(nèi)聯(lián)函數(shù)呢?

這主要是為了消除函數(shù)調(diào)用時(shí)的系統(tǒng)開(kāi)銷(xiāo),以提高運(yùn)行速度。

109【例2.7】?jī)?nèi)聯(lián)函數(shù)的使用。

/*02_07.cpp*/#include<iostream>usingnamespacestd;inlinedoublecircle(doubler){return3.1416*r*r;}intmain(){for(inti=1;i<=3;i++)cout<<”r=”<<i<<”area=”<<circle(i)<<endl;return0;}

110說(shuō)明:(1)內(nèi)聯(lián)函數(shù)在第一次被調(diào)用之前必須進(jìn)行聲明或定義,否則編譯器將無(wú)法知道應(yīng)該插入什么代碼。因此,下面的程序不會(huì)像預(yù)計(jì)的那樣被編譯:程序的運(yùn)行結(jié)果為:r=1area=3.1416r=2area=12.5664r=3area=28.274401111(2)C++的內(nèi)聯(lián)函數(shù)具有與C中的宏定義#define相同的作用和相似的機(jī)理,但消除了#define的不安全因素。(3)內(nèi)聯(lián)函數(shù)體內(nèi)一般不能有循環(huán)語(yǔ)句和開(kāi)關(guān)語(yǔ)句。(4)后面章節(jié)講到的類(lèi)結(jié)構(gòu)中所有在類(lèi)說(shuō)明體內(nèi)定義的函數(shù)都是內(nèi)聯(lián)函數(shù)。

(5)使用內(nèi)聯(lián)函數(shù)是一種用空間換時(shí)間的措施,若內(nèi)聯(lián)函數(shù)較長(zhǎng),且調(diào)用太頻繁時(shí),程序?qū)⒓娱L(zhǎng)很多。因此,通常只有較短的函數(shù)才定義為內(nèi)聯(lián)函數(shù),對(duì)于較長(zhǎng)的函數(shù)最好作為一般函數(shù)處理。1122.4.4函數(shù)重載

在傳統(tǒng)的C語(yǔ)言中,同一作用域內(nèi)函數(shù)名必須是唯一的,也就是說(shuō)不允許出現(xiàn)同名的函數(shù)。假如,要求編寫(xiě)求整數(shù),浮點(diǎn)數(shù)和雙精度數(shù)的三次方數(shù)的函數(shù)。若用C語(yǔ)言來(lái)處理,必須編寫(xiě)3個(gè)函數(shù),這3個(gè)函數(shù)的函數(shù)名不允許同名。例如:icube(inti);

//求整數(shù)的三次方fcube(floatf);

//求浮點(diǎn)數(shù)的三次方dcube(doubled);

//求雙精度數(shù)的三次方113在C++中,用戶(hù)可以重載函數(shù)。這意味著,只要函數(shù)參數(shù)的類(lèi)型不同,或者參數(shù)的個(gè)數(shù)不同,或者二者兼而有之,兩個(gè)或兩個(gè)以上的函數(shù)可以使用相同的函數(shù)名。當(dāng)兩個(gè)以上的函數(shù)共用一個(gè)函數(shù)名,但是形參的個(gè)數(shù)或者類(lèi)型不同,編譯器根據(jù)實(shí)參和形參的類(lèi)型及個(gè)數(shù)的最佳匹配,自動(dòng)確定調(diào)用那一個(gè)函數(shù),這就是函數(shù)的重載。被重載的函數(shù)稱(chēng)為重載函數(shù)。114由于C++支持函數(shù)重載,上面3個(gè)求三次方數(shù)的函數(shù)可以起一個(gè)共同的名字cube,但它們的參數(shù)類(lèi)型仍保留不同。當(dāng)用戶(hù)調(diào)用這些函數(shù)時(shí),只需在參數(shù)表中帶入實(shí)參,編譯器就會(huì)根據(jù)實(shí)參的類(lèi)型來(lái)確定到底調(diào)用哪個(gè)重載函數(shù)。因此,用戶(hù)調(diào)用求三次方數(shù)的函數(shù)時(shí),只需記住一個(gè)cube()函數(shù),剩下的則都是系統(tǒng)的事情。上述例子我們可以用下面的程序來(lái)實(shí)現(xiàn)。115【例2.8】參數(shù)類(lèi)型不同的重載函數(shù)。

/*02_08.cpp*/#include<iostream>usingnamespacestd;intCube(inti){returni*i*i;}floatCube(floatf){returnf*f*f;}doubleCube(doubled){returnd*d*d;}intmain(){inti=12;floatf=3.4;doubled=5.67;cout<<i<<’*’<<i<<’*’<<i<<’=’<<Cube(i)<<endl;cout<<f<<’*’<<f<<’*’<<f<<’=’<<Cube(f)<<endl;cout<<d<<’*’<<d<<’*’<<d<<’=’<<Cube(d)<<endl;return0;}11612*12*12=17283.4*3.4*3.4=39.3045.67*5.67*5.67=182.284程序的運(yùn)行結(jié)果為:117【例2.9】參數(shù)個(gè)數(shù)不同的重載函數(shù)。

/*02_09.cpp*/#include<iostream>usingnamespacestd;intAdd(intx,inty){returnx+y;}intAdd(intx,inty,intz){returnx+y+z;}

intmain(){inta=3,b=4,c=5;cout<<a<<"+"<<b<<"="<<Add(a,b)<<endl;cout<<a<<"+"<<b<<"+"<<c<<"="<<Add(a,b,c)<<endl;return0;}118說(shuō)明:(1)返回類(lèi)型不再參數(shù)匹配檢查之列。若兩個(gè)函數(shù)除返回類(lèi)型不同外,其他均相同,則是非法的。例如:intmul(intx,inty);doublemul(intx,inty);雖然這兩個(gè)函數(shù)的返回類(lèi)型不同,但是由于參數(shù)個(gè)數(shù)和類(lèi)型完全相同,編譯程序?qū)o(wú)法區(qū)分這兩個(gè)函數(shù)。因?yàn)樵诖_定調(diào)用哪一個(gè)函數(shù)之前,返回類(lèi)型是不知道。程序的運(yùn)行結(jié)果為:3+4=73+4+5=12119(2)函數(shù)的重載與帶缺省值的函數(shù)一起使用時(shí),有可能引起二義性,例如:

voidDrawCircl(intr=0;intx=0;inty=0);voidDrawCircle(intr);C++盡管提供重載,但當(dāng)調(diào)用:DrawCirclr(20);時(shí),編譯無(wú)法確定使用哪一個(gè)函數(shù)。120(3)在函數(shù)調(diào)用時(shí)。如果給出的實(shí)參和形參類(lèi)型不相符,C++的編譯器會(huì)自動(dòng)做類(lèi)型轉(zhuǎn)換工作。如果轉(zhuǎn)換成功,則程序繼續(xù)執(zhí)行,但在這種情況下,有可能產(chǎn)生不可識(shí)別的錯(cuò)誤。例如,有兩個(gè)函數(shù)的原型如下:voidf_a(intx);voidf_a(longx);雖然這兩個(gè)函數(shù)滿(mǎn)足函數(shù)重載的條件,但是,如果我們用intc=f_a(5.56);取調(diào)用,就會(huì)出現(xiàn)不可分辨的錯(cuò)誤。這是因?yàn)榫幾g器無(wú)法確定將5.56轉(zhuǎn)換成int還是long類(lèi)型的原因造成的。1212.5引用

2.5.1引用的概念及使用

引用(Reference)是C++語(yǔ)言新增加的概念,用來(lái)為變量起別名,它主要用作函數(shù)參數(shù)以及作為函數(shù)的返回值類(lèi)型,在程序中發(fā)揮著靈活的作用。C++是通過(guò)引用運(yùn)算符&來(lái)聲明一個(gè)引用的,在聲明時(shí),必須進(jìn)行初始化。聲明一個(gè)引用的格式如下:

數(shù)據(jù)類(lèi)型&引用名=已定義的變量名;122例如:inti=5;int&j=i;說(shuō)明:

(1)在以上聲明引用的格式中,“&”不是取地址符,而是引用運(yùn)算符,只在聲明一個(gè)引用時(shí)使用,以后引用就像普通變量一樣使用,無(wú)需再帶“&”符。(2)引用名為一個(gè)合法的用戶(hù)自定義標(biāo)識(shí)符。(3)在聲明一個(gè)引用的同時(shí),如果不是作為函數(shù)的參數(shù)或返回值類(lèi)型,就必須對(duì)它進(jìn)行初始化,以明確該引用是哪一個(gè)變量的別名,以后在程序中不可改變這種別名關(guān)系。123(4)引用只是某一個(gè)變量的別名,系統(tǒng)不為引用另外分配內(nèi)存空間,與所代表的變量占用同一內(nèi)存。(5)并不是任何類(lèi)型的數(shù)據(jù)都可以有引用,不能建立void型引用、引用的引用、指向引用的指針、引用數(shù)組。124【例2.10】引用的最基本用法示例。

/*02_010.cpp*/

#include<iostream>usingnamespacestd;intx=5,y=10;int&r=x;//定義一個(gè)引用r作為變量x的別名voidPrint()//定義一個(gè)專(zhuān)門(mén)用于輸出的函數(shù)

{

cout<<"x="<<x<<"y="<<y;cout<<"r="<<r<<endl;cout<<"Addressofx"<<&x<<endl;cout<<"Addressofy"<<&y<<endl; cout<<"Addressofr"<<&r<<endl;}125intmain(){ Print();//第1次調(diào)用輸出函數(shù)

r=y;//相當(dāng)于x=y,將y的值賦給x,//而不是r改變?yōu)樽兞縴的別名

y=100;//對(duì)y重新賦值不會(huì)影響引用r的值Print();//再次調(diào)用輸出函數(shù)return0;}126x=5y=10r=5Addressofx00474DD0Addressofy00474DD4Addressofr00474DD0x=10y=100r=10Addressofx00474DD0Addressofy00474DD4Addressofr00474DD0

程序的運(yùn)行結(jié)果為:1272.5.2引用作為參數(shù)傳遞

在C++語(yǔ)言中,引用最主要的用途是作為函數(shù)的形式參數(shù),在函數(shù)被調(diào)用時(shí)引用成為實(shí)在參數(shù)變量在被調(diào)函數(shù)中的別名,從而可以通過(guò)對(duì)引用的訪(fǎng)問(wèn)和修改達(dá)到對(duì)實(shí)在參數(shù)變量進(jìn)行操作的效果,為對(duì)實(shí)在參數(shù)變量的訪(fǎng)問(wèn)和修改提供了簡(jiǎn)單方便的途徑。引用參數(shù)使得實(shí)在參數(shù)變量的作用域“擴(kuò)大”到原先無(wú)法進(jìn)入的被調(diào)函數(shù)中。C++提供引用,其主要的一個(gè)用途就是將引用作為函數(shù)的參數(shù)。128【例2.11】采用“引用參數(shù)”傳遞函數(shù)參數(shù)。

/*02_11.cpp*/#include<iostream>usingnamespacestd;voidswap(int&m,int&n){inttemp;temp=m;m=n;n=temp;}intmain(){inta=5,b=10;cout<<”a=”<<a<<”b=”<<b<<endl;swap(a,b);

//調(diào)用函數(shù),參數(shù)傳遞相當(dāng)于執(zhí)行了int&m=a;int&n=b;使引用參數(shù)獲得了初值cout<<”a=”<<a<<”b=”<<b<<endl;return0;}129A=5b=10A=10b=5程序

溫馨提示

  • 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)論