C++面向?qū)ο蟪绦蛟O(shè)計(jì)課件_第1頁(yè)
C++面向?qū)ο蟪绦蛟O(shè)計(jì)課件_第2頁(yè)
C++面向?qū)ο蟪绦蛟O(shè)計(jì)課件_第3頁(yè)
C++面向?qū)ο蟪绦蛟O(shè)計(jì)課件_第4頁(yè)
C++面向?qū)ο蟪绦蛟O(shè)計(jì)課件_第5頁(yè)
已閱讀5頁(yè),還剩414頁(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++面向?qū)ο蟪绦蛟O(shè)計(jì)第一章面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.1.1

面向過(guò)程程序設(shè)計(jì)的基本概念考慮一個(gè)銀行系統(tǒng),該系統(tǒng)允許顧客開(kāi)設(shè)不同類(lèi)型的銀行賬戶(hù),包括現(xiàn)金賬戶(hù)、支票賬戶(hù)和貸款賬戶(hù),同時(shí)允許顧客存款、取款和轉(zhuǎn)帳。首先考慮數(shù)據(jù)結(jié)構(gòu):

struct

account{char

*name;

/*

姓名*/unsigned

long

accountId;

/*

賬號(hào)*/float

balance;float

interestYTD;/*余額*//*年利息*/char

accountType;

/*賬戶(hù)類(lèi)型(現(xiàn)金x、支票z和貸款d)};1.1什么是面向?qū)ο蟪绦蛟O(shè)計(jì)1再考慮用三個(gè)過(guò)程分別負(fù)責(zé)存款、取款和轉(zhuǎn)帳。我們可以三個(gè)C函數(shù):MakeDeposit()WithDraw()Transfer()這種數(shù)據(jù)結(jié)構(gòu)與過(guò)程分離有很多問(wèn)題,例如增加一種賬戶(hù)類(lèi)型---退休賬戶(hù)(t),則三個(gè)C函數(shù)都必須重新編寫(xiě)。21.1.2面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念面向?qū)ο蟪绦蛟O(shè)計(jì)是一種新的程序設(shè)計(jì)范型。面向?qū)ο蟪绦虻闹饕Y(jié)構(gòu)特點(diǎn)是:第一,程序一般由類(lèi)的定義和類(lèi)的使用兩部分組成,在主程序中定義對(duì)象并規(guī)定它們之間傳遞消息的規(guī)律;第二,程序中的一切操作都是通過(guò)向?qū)ο蟀l(fā)送消息來(lái)實(shí)現(xiàn)的,對(duì)象接收到后,啟動(dòng)有關(guān)方法完成相應(yīng)操作。數(shù)據(jù)與定義在它上面的用戶(hù)需要的操作構(gòu)成一個(gè)整體。當(dāng)把對(duì)銀行賬戶(hù)的操作定義在數(shù)據(jù)上,銀行賬戶(hù)就是一個(gè)類(lèi),稱(chēng)為銀行賬戶(hù)類(lèi)。我們可以建立許多具體的銀行賬戶(hù),而每一個(gè)具體的銀行賬戶(hù)就是銀行賬戶(hù)類(lèi)的一個(gè)對(duì)象。3/*姓名*//*賬號(hào)*//*余額*//*年利息*/class

BankAccount

{char

*name;unsigned

long

accountId;float

balance;float

interestYTD;public:void

MakeDeposit(float

amount);float

WithDraw(float

amount);bool

Transfer(BankAccount

&

to,

float

amount);};41.2對(duì)象與類(lèi)對(duì)象與類(lèi)概念對(duì)象是現(xiàn)實(shí)世界的一個(gè)實(shí)體,其特性是:每一個(gè)必須有一個(gè)名字以區(qū)別于其他對(duì)象;用屬性來(lái)描述它的某些特征;有一組操作,每一個(gè)操作決定對(duì)象的一種行為。類(lèi)是一組具有共同的屬性特征和行為特征的對(duì)象的抽象。類(lèi)名:

教師類(lèi) 對(duì)象年齡:整數(shù)學(xué)歷:字符串職稱(chēng):字符串專(zhuān)業(yè):字符串動(dòng)作:說(shuō)自己的年齡吃飯授課屬性:姓名:字符串屬性:姓名:黎明年齡:30學(xué)歷:博士職稱(chēng):教授專(zhuān)業(yè):計(jì)算機(jī)軟件動(dòng)作:說(shuō)自己的年齡吃飯授課對(duì)象屬性:姓名:年齡:學(xué)歷:職稱(chēng):專(zhuān)業(yè):動(dòng)作:說(shuō)自己的年齡吃飯授課5什么是對(duì)象(object

)對(duì)象是面向?qū)ο螅∣-O)方法的核心。關(guān)于對(duì)象可以從如下幾點(diǎn)說(shuō)明:*對(duì)象是人們要進(jìn)行研究(感興趣)的任何事物,從最簡(jiǎn)的整數(shù)到航天飛都可以看成對(duì)象有形的實(shí)體。指一切看得見(jiàn)摸得著的實(shí)物。作用。指人或組織所起的作用。醫(yī)生、公司、部門(mén)等。事件。在特定時(shí)間發(fā)生的事。如飛行、演出、開(kāi)會(huì)等。性能說(shuō)明。如機(jī)床廠(chǎng)對(duì)機(jī)床的性能說(shuō)明。對(duì)象不僅能表示結(jié)構(gòu)化的數(shù)據(jù),而且也能表示抽象的事件、規(guī)則以及復(fù)雜的工程實(shí)體。因此對(duì)象具有很強(qiáng)制表達(dá)能力和描述功能。*對(duì)象實(shí)現(xiàn)了數(shù)據(jù)與操作結(jié)合對(duì)象有狀態(tài)用來(lái)描述它的某些特征,通常用數(shù)據(jù)來(lái)描述。對(duì)象還應(yīng)當(dāng)有操作,用以改變對(duì)象的狀態(tài),對(duì)象及其操作就是對(duì)象的行為。為此改變了傳統(tǒng)方法中將數(shù)據(jù)與操作(亦稱(chēng)函數(shù)或過(guò)程)相分離的做法,實(shí)現(xiàn)了將數(shù)據(jù)與操作封裝在對(duì)象的統(tǒng)一體中。6*對(duì)象應(yīng)具有唯一識(shí)別的功能對(duì)象有唯一對(duì)象標(biāo)識(shí)符(ObjectIdentify,簡(jiǎn)稱(chēng)OID)它可唯一,且永久地標(biāo)識(shí)對(duì)象。即使二完全一樣的茶杯也是二個(gè)對(duì)象有甲、乙之分*對(duì)象必須參與一個(gè)或一個(gè)以上的對(duì)象類(lèi)。對(duì)象應(yīng)參與對(duì)象類(lèi),并是類(lèi)的一個(gè)實(shí)例。*有自己內(nèi)部的和對(duì)外部的動(dòng)作,稱(chēng)為操作。*可以通過(guò)指令、命令或稱(chēng)消息發(fā)動(dòng)它的動(dòng)作。總之對(duì)象是現(xiàn)實(shí)世界中可以區(qū)分的一個(gè)事、物,它有獨(dú)立性又有相關(guān)性。7對(duì)象類(lèi)(Object

class)對(duì)象類(lèi)是(O-O)方法的一個(gè)重要抽象概念,稱(chēng)類(lèi)。將具有相同結(jié)構(gòu)、操作,并遵守相同約束規(guī)則的對(duì)象聚合成一組,這組對(duì)象集合就稱(chēng)為類(lèi)。它是把許多對(duì)象進(jìn)行抽象。如茶杯 有不同大小的茶杯,不同材料,不同形狀,可可完全相同的許多茶杯----

茶杯的類(lèi)具體對(duì)類(lèi)進(jìn)行定義時(shí),最低限度應(yīng)包括如下內(nèi)容:類(lèi)名。內(nèi)部表示。對(duì)外接口。對(duì)于操縱類(lèi)實(shí)例——對(duì)象的外部可施力的操作。接口如何在內(nèi)部動(dòng)作的。內(nèi)部實(shí)現(xiàn)。對(duì)類(lèi)的一個(gè)具體稱(chēng)為對(duì)象或?qū)嵗驅(qū)嶓w。類(lèi)最鮮明的特色是將數(shù)據(jù)的結(jié)構(gòu)與數(shù)據(jù)的操作都封裝在類(lèi)中,并實(shí)現(xiàn)了類(lèi)的外部特性與類(lèi)實(shí)現(xiàn)的隔離。也就實(shí)現(xiàn)了將使用類(lèi)和對(duì)象的使用者,與具體設(shè)計(jì)對(duì)象和類(lèi)的開(kāi)發(fā)者區(qū)分開(kāi),從而有良好的模塊化特性進(jìn)而為復(fù)雜大系統(tǒng)的分析、設(shè)計(jì),實(shí)現(xiàn)提供先進(jìn)的方法。81.2.2對(duì)象的狀態(tài)我們可以把對(duì)象看成是一個(gè)帶有狀態(tài)和行為的活的實(shí)體。類(lèi)的屬性的具體值為對(duì)象的狀態(tài)。對(duì)象的狀態(tài)是所有靜態(tài)屬性和這些屬性的動(dòng)態(tài)值的總體。屬性:姓名:字符串年齡:整數(shù)學(xué)歷:字符串職稱(chēng):字符串專(zhuān)業(yè):字符串對(duì)象的狀態(tài)不僅僅是初等的數(shù)據(jù)類(lèi)型(整數(shù),字符串),而且可以是另外的對(duì)象作為它的狀態(tài)的一部分。一輛車(chē)發(fā)動(dòng)機(jī)座位車(chē)輪91.2.3對(duì)象的交互對(duì)象之間的聯(lián)系稱(chēng)為對(duì)象的交互。一個(gè)對(duì)象向另一個(gè)對(duì)象發(fā)出的請(qǐng)求被稱(chēng)為消息。方法(Methods)和消息(Messnges)方法也即類(lèi)的外部接口的另一種說(shuō)法,實(shí)際就是類(lèi)對(duì)象的某一個(gè)操作,要使類(lèi)對(duì)象進(jìn)行某一種操作,先要給以消息,也可以方法與消息等同。因此,消息是要求對(duì)象進(jìn)行動(dòng)作的說(shuō)明或命令或指導(dǎo),是對(duì)象之間相互請(qǐng)求或相互協(xié)作的途徑。把發(fā)送消息的對(duì)象稱(chēng)為發(fā)送者,接收消息的對(duì)象稱(chēng)為接收者。對(duì)象間的聯(lián)系,只能通過(guò)傳遞消息來(lái)進(jìn)行。對(duì)象也只有在收到消息后才能選用方法而被激活。消息具有三個(gè)性質(zhì):同一個(gè)對(duì)象可以接收不同形式的多個(gè)消息,做出不同的響應(yīng)。相同形式的消息可以傳遞給不同的對(duì)象,所做出的響應(yīng)可以是不同的。消息的發(fā)送可以不考慮具體的接受者,對(duì)象可以響應(yīng)消息,也可以不響應(yīng)。10C++語(yǔ)言中對(duì)類(lèi)、對(duì)象、方法、消息的實(shí)現(xiàn)實(shí)例Class

person{private:char

name[20];int

age;char

add[40];char

sex;void

printname(){cout<<name;}void

printage(){cout<<age;}void

printadd(){cout<<add;}void

printsex(){cout<<sex;}public:void

printme(){

printname();printage();printadd();\\私有消息\\公有消息printsex();

}};//這是類(lèi),有類(lèi)名person,內(nèi)部表示數(shù)據(jù),提供外部接口printme()及實(shí)現(xiàn)。有了這個(gè)類(lèi)就可以定義各種各樣的人(對(duì)象),及給對(duì)象一個(gè)信息(消息),他就會(huì)自報(bào)家門(mén)。11#include

<iostream.h>main(

)//y是對(duì)象//這是消息,向?qū)ο髖發(fā)送了方法printme()的消息。{

person

y;y.printme();}*注* 假定

y

己有初值數(shù)據(jù),如何給初值以后構(gòu)造函數(shù)中實(shí)現(xiàn)。printme();y.printname;y.printage;等都是錯(cuò)誤的。121.3數(shù)據(jù)的抽象與封裝現(xiàn)實(shí)世界中的抽象與封裝數(shù)據(jù)的抽象與封裝的基本概念將數(shù)據(jù)結(jié)構(gòu)和作用于數(shù)據(jù)結(jié)構(gòu)上的操作組成一個(gè)實(shí)體,數(shù)據(jù)的表示方式和對(duì)數(shù)據(jù)的操作細(xì)節(jié)被隱藏起來(lái),用戶(hù)通過(guò)操作接口對(duì)數(shù)據(jù)進(jìn)行操作。這就是數(shù)據(jù)的封裝。對(duì)象的封裝是:對(duì)象具有一個(gè)清楚的邊界,對(duì)象的私有數(shù)據(jù)、成員函數(shù)的細(xì)節(jié)被封裝在該邊界內(nèi);具有一個(gè)描述對(duì)象與其它對(duì)象如何相互作用的接口,該接口必須說(shuō)明消息傳遞的使用方法;對(duì)象內(nèi)部的代碼和數(shù)據(jù)應(yīng)受到保護(hù),其它對(duì)象不能直接修改。131.3.3對(duì)象的特性

(1)封裝性封裝是指將一個(gè)數(shù)據(jù)和與這個(gè)數(shù)據(jù)有關(guān)的操作集合放在一起形成一個(gè)能動(dòng)的實(shí)體-----對(duì)象,有一個(gè)清楚的邊界包裝,對(duì)象,類(lèi)的所有私有數(shù)據(jù)內(nèi)部程序(成員函數(shù))的細(xì)節(jié)都被固定在這個(gè)邊界內(nèi)。具有一個(gè)接口,這個(gè)接口描述了對(duì)象對(duì)外界的消息、方法和響應(yīng)。對(duì)象受封殼保護(hù),外界不能直接修改使用本對(duì)象所擁有的數(shù)據(jù)和代碼。模塊獨(dú)立性動(dòng)態(tài)連接性易維護(hù)性141.4繼承性1.4.1繼承的概念以面向?qū)ο蟪绦蛟O(shè)計(jì)的觀(guān)點(diǎn)來(lái)看,繼承所表達(dá)的是對(duì)象類(lèi)之間相關(guān)的關(guān)系。這種關(guān)系使得某類(lèi)對(duì)象可以繼承另外一類(lèi)對(duì)象的特征和能力。類(lèi)之間具有繼承關(guān)系,則有下列特性:類(lèi)間具有共享特性(包括數(shù)據(jù)和程序代碼的共享);類(lèi)間具有判別或新增部分(包括非共享的數(shù)據(jù)和程序代碼);類(lèi)間具有層次結(jié)構(gòu)。假設(shè)有兩個(gè)類(lèi)A和B,若類(lèi)B繼承類(lèi)A,則屬于類(lèi)B中的對(duì)象具有類(lèi)A的一切特征(包括數(shù)據(jù)屬性和操作),這時(shí),我們稱(chēng)被繼承類(lèi)A為基類(lèi)或父類(lèi)或超類(lèi);而稱(chēng)繼承類(lèi)B為類(lèi)A的派生類(lèi)或子類(lèi)。同時(shí)我們還可以說(shuō),類(lèi)B是從類(lèi)A中派生出來(lái)的。如果類(lèi)B從類(lèi)A派生出來(lái),而類(lèi)C又是從類(lèi)B派生出來(lái)的,就構(gòu)成了類(lèi)的層次。繼承機(jī)制允許派生類(lèi)繼承基類(lèi)的數(shù)據(jù)和操作(即數(shù)據(jù)成員和成員函數(shù)),也就是說(shuō),允許派生類(lèi)使用基類(lèi)的數(shù)據(jù)和操作。同時(shí)派生類(lèi)還可以增加新的操作和數(shù)據(jù)。151.4.2繼承的分類(lèi)從繼承源上分,繼承分為單繼承和多繼承。從繼承內(nèi)容上劃分,繼承可分為取代繼承、包含繼承、受限繼承、特化繼承等。161.4.3

繼承與封裝的關(guān)系在面向?qū)ο笙到y(tǒng)中,封裝的單位是對(duì)象,也就是說(shuō),把一個(gè)屬于某一類(lèi)的對(duì)象封裝起來(lái),使其數(shù)據(jù)和操作成為一個(gè)整體。一個(gè)對(duì)象,無(wú)論它是基類(lèi)的實(shí)例,還是派生類(lèi)的實(shí)例,都是一個(gè)被封裝的實(shí)體。因此,我們得出結(jié)論:繼承機(jī)制的引入并不影響對(duì)象的封裝性。繼承是類(lèi)之間的相交關(guān)系,即類(lèi)間的繼承關(guān)系。要進(jìn)行類(lèi)間繼承它們之間應(yīng)有:類(lèi)間具有共享特征(包括數(shù)據(jù)和程序共享)類(lèi)間具有細(xì)微的差別或有新增部分(非共享的數(shù)據(jù)和代碼)類(lèi)間具有層次結(jié)構(gòu)從繼承源上劃分:從繼承內(nèi)容上劃分:?jiǎn)卫^承和多繼承繼承可以對(duì)數(shù)據(jù)(結(jié)構(gòu)特性)的繼承又具有操作(行為)的繼承。171.5多態(tài)性什么是多態(tài)性面向?qū)ο笙到y(tǒng)的多態(tài)性是指不同的對(duì)象收到相同的消息時(shí)產(chǎn)生多種不同的行為方式。重載的概念重載一般包括函數(shù)重載和運(yùn)算符重載。函數(shù)重載是指一個(gè)標(biāo)識(shí)符可同時(shí)用于為多個(gè)函數(shù)命名,而運(yùn)算符重載是指一個(gè)運(yùn)算符可同時(shí)用于多種運(yùn)算。多態(tài)性:指接收同一個(gè)消息名后,對(duì)象可以采用多種不同的行為(態(tài)度)重載概念:即可以有同名函數(shù)。同一運(yùn)算符可以定義成不同的操作。虛函數(shù)概念:指類(lèi)繼承和派生中可以用相同函數(shù)名,但不同的實(shí)現(xiàn)版本。抽象類(lèi)的概念:可以定義一種類(lèi),這種類(lèi)中有虛函數(shù),因此不能有具體對(duì)象的類(lèi),稱(chēng)抽象類(lèi)。18C++的起源C++的特點(diǎn)*.c C的源程序以下的文件C和C++都可用:C的頭包含文件C++的源程序

C++的頭包含文件*.h*.cpp*.hpp/*//*/ C的注釋<CR> C++的注釋2.1

C++的起源和特點(diǎn)12.2

C++源程序的構(gòu)成2.2.1

C++程序的一般格式〖例2.1〗說(shuō)明C++構(gòu)造的示例程序//系統(tǒng)頭文件//函數(shù)原型的說(shuō)明//主函數(shù)#include

<iostream.h>int

add(int

a,

int

b);int

main(

){

int

x,y,sum;//定義三個(gè)整型變量cout<<"輸入二個(gè)數(shù):"<<"\n";//界面:提示用戶(hù)輸入二個(gè)數(shù)//從鍵盤(pán)輸入變量x的值//從鍵盤(pán)輸入變量y的值//調(diào)用函數(shù)add,將函數(shù)返回值賦給變量cin>>x;cin>>y;sum=add(x,y);sumcout<<"二數(shù)和是:"<<sum<<"\n"; //輸出return

0;}//定義函數(shù)add,函數(shù)(返回)值為整型//定義臨時(shí)變量c//求和//將c的值返回,通過(guò)add帶回調(diào)用處int

add(int

a,

int

b){

int

c;c=a+b;return

c;}22.2.2

C++程序的結(jié)構(gòu)特點(diǎn)注釋包含文件及頭文件語(yǔ)句標(biāo)準(zhǔn)輸入與輸出printf(格式說(shuō)明,表達(dá)式表列);scanf(格式說(shuō)明,地址表列);cout<<cin>>5.新行“\n”

endl6.主函數(shù)void main(

)

{…….}7.一般的函數(shù)函數(shù)頭 int

add

(int

a,

int

b)函數(shù)體{

int

c;c=a+b;//變量定義//執(zhí)行部分return

c;}32.3

C++在非面向?qū)ο蠓矫娴囊恍┨匦?.3.1注釋行/*

*///

<CR>C的注釋C++的注釋2.3.2新的I/O流cin是標(biāo)準(zhǔn)輸入流,在程序中代表標(biāo)準(zhǔn)輸入設(shè)備,即鍵盤(pán)。運(yùn)算符“>>”表示向右cout是標(biāo)準(zhǔn)輸出流,在程序中代表標(biāo)準(zhǔn)輸出設(shè)備,即屏幕。運(yùn)算符“<<”表示向左使用cin或cout進(jìn)行I/O操作時(shí),在程序中必須嵌入頭文件iostream.h//例2.2#include

<iostream.h>int

main(

){

char

name[20];cin>>name;cout<<name<<endl;return

0;}//例2.34cout<<"Hello,

your

name#:i"nc;lude

<iostream.h>voidmain(

){

int

x=25;cout<<hex<<x<<’"<<dec<<x<<""<<oct<<x<<"\n";}2.3.3靈活的局部變量說(shuō)明int

f(

){

int

i;i=10;int

j;j=25;for(int

k=5;k>=0;k--)

…..…….}以上的寫(xiě)法在C程序中都是錯(cuò)誤的,但在C++程序中都是正確的。52.3.4結(jié)構(gòu)、聯(lián)合和枚舉名可直接作為類(lèi)型名定義枚舉類(lèi)型名:enum

bool

{FALSE,TRUE};定義結(jié)構(gòu)枚舉類(lèi)型名:Struct

student{int

sno;char

*sneme;};C語(yǔ)言中定義枚舉類(lèi)型變量:

enum

bool

done;定義結(jié)構(gòu)類(lèi)型變量:

struct

student

s1,

s2;C++語(yǔ)言中定義枚舉類(lèi)型變量:

bool

done;定義結(jié)構(gòu)類(lèi)型變量:student

s1,s2;62.3.5

const修飾符#define

LIMIT

100這里L(fēng)IMIT是一個(gè)標(biāo)志,代表100const

int

LIMIT=100;這里L(fēng)IMIT是一個(gè)常量名,在內(nèi)存有空間放了100,因此有地址,可以用指針指向這空間,但不能修改它。int

i=100;這里i是一個(gè)變量名,在內(nèi)存有空間放了100,因此有地址,可以用指針指向這空間,且可以改放別的整數(shù)。(1)可以用一個(gè)指向常量的指針變量指向常量:

const

char

*name=“chen”;name[3]=‘a(chǎn)’;

//錯(cuò)誤name=“zhang”;//正確(2)指針常量char

*const

name=“chen”;name[3]=‘a(chǎn)’;//正確name常量zhang常量Xche

nanazhangname=“zhang”;//錯(cuò)誤(3)

const

char

*const

name

=“ncahmeen”;常量ache

nX7//例2.4#include

<iostream.h>main(

){

int

a=1;#define

T1

a+a#define

T2

T1-T1cout<<"T2

is

"<<T2<<endl;return

0;}cout<<“T2

is

“<<a+a-a+a<<endla;+Ta1-T2a1+a//例2.5#include

<iostream.h>main(

){

int

a=1;const

T1=a+a;const

T2=T1-T1;

cout<<"T2

is

"<<T2<<endl;return

0;}82.3.6內(nèi)置函數(shù)//例2.6#include

<iostream.h>int

main(

){

for(int

i=1;i<=3;i++)area="<<circle(i)<<endl;cout<<"r="<<i<<"return

0;}在函數(shù)前加以inline,成為內(nèi)置函數(shù)#include

<iostream.h>int

main(

){

for(int

i=1;i<=3;i++)area="<<circle(i)<<endl;cout<<"r="<<i<<"return

0;}float

circle(float

r)3次{return

3.1416*r*r;}inline

float

circle(float

r)代碼嵌{入return

3.1416*r*r;}9//例2.7#include

<iostream.h>#define

doub(x)

x*2int

main(

){

for(int

i=1;i<=3;i++)cout<<i<<"

doubled

is

"<<doub(i)<<endl;cout<<"1+2

doubled

is

"<<doub(1+2)<<endl;return

0;}//例2.8#include

<iostream.h>inline

int

doub(int

x){

return

x*2;

}int

main(

){

for(int

i=1;i<=3;i++)cout<<i<<"

doubled

is

"<<doub(i)<<endl;cout<<"1+2

doubled

is

"<<doub(1+2)<<endl;return

0;}102.3.7函數(shù)原型返回類(lèi)型 函數(shù)名(參數(shù)表);//例2.9#include

<iostream.h>void

write(char

*s);

//函數(shù)原型或叫函數(shù)申明void

main(

){

write("Hello,

world!");

}void

write(char

*s)無(wú)分號(hào){

cout<<s<<endl;

}112.3.8帶有缺省參數(shù)的函數(shù)C++在說(shuō)明函數(shù)原型時(shí),可以為一個(gè)或多個(gè)參數(shù)指定缺省參數(shù)值,以后調(diào)用此函數(shù)時(shí),若省略其中某一實(shí)參,C++自動(dòng)以缺省值作為相應(yīng)參數(shù)的值。int

special(int

x=5,float

y=5.3);合法的調(diào)用;special();special(25);special(100,79.8);說(shuō)明:(1)所有取缺省值參數(shù)都必須出現(xiàn)在不取缺省值參數(shù)的右邊。int

fun(int

i,int

j=5,

int

k)int

fun(int

i,

int

k,int

j=5)是錯(cuò)誤的是正確的(2)調(diào)用時(shí),若某個(gè)參數(shù)省略,則其后的參數(shù)皆應(yīng)省略。不合法的調(diào)用;special(,21.5);122.3.9函數(shù)重載C++中,只要函數(shù)的參數(shù)的類(lèi)型不同,或者參數(shù)個(gè)數(shù)不同,或者二兼有之,幾個(gè)函數(shù)可以用相同的函數(shù)名。稱(chēng)為函數(shù)重載//**例2.10#include

<iostream.h>int

square(int

i){

return

i*i;

}float

square(float

f){

return

f*f;

}double

square(double

d){

return

d*d;

}void

main(

){

int

i=12;float

f=3.4;double

d=5.67;cout<<i<<"*"<<i<<"="<<square(i)<<endl;cout<<f<<"*"<<f<<"="<<square(f)<<endl;cout<<d<<"*"<<d<<"="<<square(d)<<endl;}13//**例2.11#include

<iostream.h>int

mul(int

x,

int

y){

return

x*y;

}int

mul(int

x,

int

y,

int

z){

return

x*y*z;

}voidmain(

){

int

a=3,b=4,c=5;cout<<a<<"*"<<b<<"="<<mul(a,b)<<endl;cout<<a<<"*"<<b<<"*"<<c<<"="<<mul(a,b,c)<<endl;}說(shuō)明:重載函數(shù)應(yīng)在參數(shù)個(gè)數(shù)或參數(shù)類(lèi)型上有所不同,編譯才能識(shí)別調(diào)用哪一個(gè)重載版本,即使返回類(lèi)型不同也不行。如:int

mul(int

x,int

y);和double

mul(int

x,int

y);是不能重載的。一般而言,重載函數(shù)應(yīng)對(duì)不同的參數(shù)情況執(zhí)行相同的功能。如:abs(int

x);和abs(float

x);都是求絕對(duì)值,一個(gè)是整數(shù)的絕對(duì)值,一個(gè)是實(shí)數(shù)的。142.3.10作用域運(yùn)算符::當(dāng)全局變量和局部變量同名時(shí),函數(shù)中不能使用全局變量。//**例2.12#include

<iostream.h>//全局變量int

avar=10;void

main(

){

int

avar=25;//局部變量}cout<<"avar

is

"<<avar<<endl;局部變量//**例2.13可用作用域運(yùn)算符::

#include

<iostream.h>int

avar;void

main(

){

int

avar;avar=25;::avar=10;//局部變量avar//全局變量avarcout<<"local

avar

=

"<<avar<<endl;cout<<"global

avar

=

"<<::avar<<endl;}152.3.11無(wú)名聯(lián)合C語(yǔ)言的共用體:union

data{

int

i;char

ch;float

f;}union

data

a,b,c;引用:a.i

a.cha.f

等C++的無(wú)名聯(lián)合:union{

int

i;char

ch;float

f;}直接可用

i

ch f

等a4字節(jié)i16chf2.3.12強(qiáng)制類(lèi)型轉(zhuǎn)換C語(yǔ)言的強(qiáng)制類(lèi)型轉(zhuǎn)換:int

i=10;float

x=(float)i;C++的強(qiáng)制類(lèi)型轉(zhuǎn)換:int

i=10;float

x=float(i);

float

y=(float)i;兩種方法C++都可以。172.3.13

new和deleteC語(yǔ)言用函數(shù)malloc()和free()動(dòng)態(tài)分配內(nèi)存和釋放動(dòng)態(tài)分配的內(nèi)存。C++使用運(yùn)算符new和delete能更好、更簡(jiǎn)單地進(jìn)行內(nèi)存的分配和釋放。如C語(yǔ)言中用:int

*p;p=(int

*)

malloc

(

sizeof(int)

);*p=10;而C++語(yǔ)言中

//**2.14#include

<iostream.h>voidmain(

)//定義一個(gè)整型指針變量p//動(dòng)態(tài)分配一個(gè)整型存儲(chǔ)區(qū),并把首地址賦給p{

int

*p;p=new

int;*p=10;cout<<*p<<endl;delete

p;

//釋放p指的空間,撤消指針p}new和delete的優(yōu)點(diǎn):(1)new可以自動(dòng)計(jì)算所要分配內(nèi)存的類(lèi)型的大小,而不必用sizeof來(lái)計(jì)算。p18(2)new能夠自動(dòng)返回正確的指針類(lèi)型,而不必進(jìn)行類(lèi)型轉(zhuǎn)換。

(3)可以用new將分配的對(duì)象初始化。(4)new和delete都可以被重載,允許建立自定義的分配系統(tǒng)。說(shuō)明:(1)使用new可以為數(shù)組動(dòng)態(tài)分配內(nèi)存空間。

int

*pi=new

int[10];int

*pi=new

int[2][3][4];(2)new可在為簡(jiǎn)單變量分配內(nèi)存空間的同時(shí),進(jìn)行初始化。//**例2.15#include

<iostream.h>void

main(

){

int

*p;//動(dòng)態(tài)分配內(nèi)存,并將99作為初始值賦給它p=new

int(99);cout<<*p<<endl;delete

p;}(3)釋放動(dòng)態(tài)分配的數(shù)組存儲(chǔ)區(qū):

delete[]p;19(4)使用動(dòng)態(tài)分配內(nèi)存時(shí),分配失敗,將返回空指針(NULL)。因此通常要對(duì)內(nèi)存的動(dòng)態(tài)分配是否成功進(jìn)行檢查。分配內(nèi)存失敗,p=NULL//**例2.16#include

<iostream.h>void

main(

){

int

*p;p=new

int;if(!p)//若分配內(nèi)存失敗{cout<<"allocationfailure\n";return

;}*p=20;cout<<*p<<endl;delete

p;}pNULL202.3.14引用引用可為變量起別名,主要有變量的引用、函數(shù)參數(shù)的引用、函數(shù)返回值的引用。1.引用變量 type

&//**例2.17#include

<iostream.h>void

main(

){

int

i;iint

&j=i; //

i

又叫

ji=30;jcout<<"i="<<i<<"j="<<j<<"\n";j=80;cout<<"i="<<i<<"j="<<j<<"\n";cout<<“Address

of

i

”<<&i<<“\n”;cout<<"Address

of

j

"<<&j<<"\n";//顯示i的地址}(1)定義引用時(shí),必須立即對(duì)它進(jìn)行初始化,不能以后再賦值。int

i; int

&j;

//錯(cuò)誤

j=i;21(2)引用實(shí)際上是一種隱式指針,可以少用“*”號(hào)

#include<iostream.h>voidmain(

)//**例2.18{

int

i=15;

int

*iptr=&i;int

&rptr=i;//整型變量i//iptr指向i//rptr引用icout<<"i

is

"<<i<<endl;cout<<"*iptr

is

"<<*iptr<<endl;cout<<"rptr

is

"<<rptr<<endl;i=29;cout<<"

After

changing

i

to

29"<<endl;cout<<"i

is

"<<i<<endl;cout<<"*iptr

is

"<<*iptr<<endl;cout<<"rptr

is

"<<rptr<<endl;}i

is

15

i

is

29*iptr

is

15rptr

is15*iptr

is

29rptr

is29iptrirptr22引用不可重新賦值,不可使其作為另一個(gè)變量的別名。

int

i,k;int

&j=i;j=&k;

//錯(cuò)誤引用不同于普通變量。int

&b[3]; //不能建立引用數(shù)組int

&*p;int

&&r;//不能建立指向引用的指針//不能建立引用的引用(5)當(dāng)使用取地址運(yùn)算符時(shí)&,取的是被引用變量的地址。

int

num=50;int

&ref=num;int

*p=&ref;則p中保存的是變量num的地址。2.引用參數(shù)引用參數(shù)的方法可以代替C語(yǔ)言中的指針地址調(diào)用的方式。23//**例2.19

C語(yǔ)言中的指針地址調(diào)用的方式#include

<iostream.h>void

swap(int

*m,

int

*n){

int

temp;temp=*m;*m=*n;*n=temp;}void

main(

){

int

a=5,b=10;cout<<"a="<<a<<"

b="<<b<<endl;swap(&a,&b);cout<<"a="<<a<<"

b="<<b<<endl;}a=5

b=10a=10

b=5m&aatemn&bb24//**例2.20 引用參數(shù)的方法#include

<iostream.h>void

swap(int

&m,

int

&n){

int

temp;temp=m;m=n;n=temp;}main(

){

int

a=5,b=10;cout<<"a="<<a<<"

b="<<b<<endl;swap(a,b);cout<<"a="<<a<<"

b="<<b<<endl;return

0;}a=5

b=10a=10

b=5matemnb253.引用返回值函數(shù)可返回一個(gè)引用,其目的是可將函數(shù)用在賦值運(yùn)算符的左邊。//**例2.21#include

<iostream.h>int

a[]={1,3,5,7,9};//聲明返回引用的函數(shù)//將a[2]重新賦值為25int

&index(int);voidmain(

){

index(2)=25;cout<<index(2)<<endl;}int

&index(int

i){

return

a[i];

}264.引用舉例例2.21//引用參數(shù)和引用返回值#include

<iostream.h>int

&max(int

&num1,

int

&num2);int

&min(int

&num1,

int

&num2);main(

){int

num1,num2;cout<<"輸入第一個(gè)數(shù):";cin>>num1;cout<<"輸入第二個(gè)數(shù):";cin>>num2;max(num1,num2)=0;cout<<"\n把大的數(shù)置成0后,這兩個(gè)數(shù)是:";cout<<"\n"<<num1<<"和"<<num2<<"\n";cout<<"\n再一次輸入二個(gè)數(shù):\n";cout<<"輸入第一個(gè)數(shù):";cin>>num1;cout<<"輸入第二個(gè)數(shù):";cin>>num2;27min(num1,num2)=0;cout<<"\n把小的數(shù)置成0后,這兩個(gè)數(shù)是:";cout<<"\n"<<num1<<"和"<<num2<<"\n";return

0;}int

&max(int

&num1,int

&num2)

//兩數(shù)中找大數(shù){

return

(num1>num2)?num1:num2;

}int

&min(int

&num1,int

&num2)

//兩數(shù)中找小數(shù){return(num1<num2)?num1:num2;}運(yùn)行結(jié)果:輸入第一個(gè)數(shù):45輸入第二個(gè)數(shù):78把大的數(shù)置成0后,這兩個(gè)數(shù)是:45

0再一次輸入二個(gè)數(shù):輸入第一個(gè)數(shù):13輸入第二個(gè)數(shù):56把小的數(shù)置成0后,這兩個(gè)數(shù)是:0

56282.4存儲(chǔ)類(lèi)存儲(chǔ)類(lèi)類(lèi)型修飾符類(lèi)型變量名表列;存儲(chǔ)類(lèi)auto

staticextern

register類(lèi)型修飾符const

volatile自動(dòng)變量和寄存器變量靜態(tài)變量外部變量292.5基本運(yùn)算符和表達(dá)式關(guān)系運(yùn)算符算術(shù)運(yùn)算符邏輯運(yùn)算符位運(yùn)算符條件運(yùn)算符逗號(hào)表達(dá)式

2.5.7sizeof運(yùn)算符

2.6賦值及運(yùn)算順序2.7類(lèi)型轉(zhuǎn)換302.8語(yǔ)句表達(dá)式語(yǔ)句、空語(yǔ)句和塊語(yǔ)句選擇語(yǔ)句if語(yǔ)句switch語(yǔ)句循環(huán)while

語(yǔ)句do

while

語(yǔ)句for

語(yǔ)句轉(zhuǎn)移break

與continue語(yǔ)句goto

語(yǔ)句return

語(yǔ)句312.9函數(shù)2.9.1

函數(shù)的基礎(chǔ)知識(shí) 函數(shù)先聲明再調(diào)用后定義的例子#include

<iostream.h>void

main(

){

int

a,b,c;int

sum(int,int); //先申明sum()函數(shù)

a=25;b=36;c=sum(a,b); //調(diào)用sum()函數(shù)

cout<<c<<endl;}//定義sum()函數(shù)int

sum(int

x,

int

y){

int

temp;temp=x+y;return

temp;}32//習(xí)題函數(shù)(7.1)#include<stdio.h>void

main(){int

m,n,l,s;int

maxj(int

a,

int

b);int

minb(int

a,

int

b);printf("輸入個(gè)正整數(shù):");scanf("%d,%d",&m,&n);if

(m>0

&&

n>0)

{l=maxj(m,n);s=minb(m,n);}int

maxj(int

a,

int

b){

int

r,t;if(a<b)

{t=a;a=b;b=t;}r=a%b;while(r!=0){a=b;

b=r;r=a%b;}return

b;}int

minb(int

a,

int

b)printf("%d和%d的最大公約數(shù)為%d\n",m,n,l){;printf("%d和%d的最小公倍數(shù)為%d\n",m,n,s);}else

printf("輸入了負(fù)數(shù)!\n");return;int

r;r=maxj(a,b);if

(r!=0)return

a*b/r;elsereturn

0;}sl56785678rtr567833//習(xí)題函數(shù)(7.5)#include<iostream.h>#include<stdio.h>#include<string.h>void

main(){

char

a[255];void

convert(char

b[]);printf("請(qǐng)輸入一個(gè)字符串:\n");gets(a);convert(a);printf("該字符串反序?yàn)?\n");puts(a);return;}void

convert(char

b[]){

int

l,i;char

c;l=strlen(b);for(i=0;

i<=l/2

;i++){c=b[i];

b[i]=b[l-i-1];

b[l-i-1]=c;}return

;}caba[0]a[1]a

b

c

db[0]b[1]a[254]e

f

\034m#include

<stdio.h>#include

<math.h>void

main(){

float

a,b,c,d,x[2];void

root0(float

a,

float

b,

float

c,

float

d,float

x[]);void

root1(float

a,

float

b,

float

c,float

x[]);void

root2(float

a,

float

b,

float

c,

float

d,

float

x[]);printf("請(qǐng)輸入一元二次方程的三個(gè)系數(shù)a,b,c:\n");scanf("%f,%f,%f",&a,&b,&c);if(a<=1e-6)printf("不是一元二次方程!\n");else

{printf("方程(%4.1f)x*x+(%4.1f)x+(%4.1f)=0\n",a,b,c);d=b*b-4*a*c;if

(d<0){root0(a,b,c,d,x);printf("由于b*b-4*a*c<0因此有二個(gè)虛根:\n");printf("x1=%f+%f

i\n",x[0],x[1]);printf("x2

=

%f

-

%f

i\n",

x[0],x[1]);}else

if(d==0){root1(a,b,c,x);printf("由于b*b-4*a*c=0因此有一個(gè)重根:\n");printf("x1=%f\n",x[0]);printf("x2

=

%f

\n",x[1]);}x[1]x[0]35else{root2(a,b,c,d,x);printf("由于b*b-4*a*c>0因此有二個(gè)實(shí)根:\n");printf("x1=%f\n",x1);printf("x2

=

%f

\n",x2);}}return;}void

root0(float

a,

float

b,

float

c,

float

d,floatx[]){

x[0]=-b/(2*a); x[1]=sqrt(-d)/(2*a);}void

root1(float

a,

float

b,

float

c,float

x[]){

x[0]=x[1]==-b/(2*a);}void

root2(float

a,

float

b,

float

c,

float

d,float

x[]){

float

r,

i;r=-b/(2*a);

i=sqrt(d)/(2*a);x[0]=r-i;

x[1]=r+i;}362.9.2參數(shù)傳遞及函數(shù)返回值值傳一般變量傳地址結(jié)構(gòu),數(shù)組傳引用一般變量,結(jié)構(gòu),數(shù)組缺省參數(shù)2.9.3使用C++系統(tǒng)函數(shù)372.10數(shù)組定義

類(lèi)型 數(shù)組名[大小];int

a[4;];int

b[3][4];int

c[2][3][4];使用時(shí)數(shù)組元素?cái)?shù)組名[表達(dá)式]a[0]=10;i=3;a[i]=5;b[0][3]=20;初始值定義時(shí)int

a[]={2,4,6,8,10};int

b[][3]={{2,4,6},{8,10,12}};382.11指針定義類(lèi)型*指針變量名;2.11.1

使用指針

取地址運(yùn)算符&取內(nèi)容運(yùn)算符*位移取值 [

]#include

<iostream.h>void

main(

){

int

a[10]={2,4,6,8,10};for(int

*p=a;p<a+10;p++)cout

<<

p[+0]

<<endl;}這里p[+0]位移+0,等價(jià)于*pp=a;

p[+2]

*(p+2) p[-i]

*(p-i)392.11.2指針運(yùn)算1.賦值int

x,*px,*q;q=px;px=&x;2.比較

px==qp<q表示q和px同指一個(gè)地方(q跟著px指)q!=px判斷q和px是否同指一個(gè)地方判斷p和q指在數(shù)組元素的前后3.移動(dòng)指針

p=p+3;++y=*px++;y=*++px;y=++*px;y=(*px)++;--運(yùn)算//y=*(px++);//y=*(++px);//y=++(*px);402.11.3指針和數(shù)組指向一維數(shù)組的指針int

a[4],*p; p=a;或p=&a[0];即p指向a[0];指針數(shù)組許多個(gè)指針變量在一起都可用來(lái)指向整數(shù)int

*pa[2]; char

*pc[5][7];例#include

<iostream.h>void

main(){

int

a[2][3]={{2,4,6},{8,10,12}};int

*pa[2]; //有二個(gè)指針

pa[0]

pa[1]pa[0]=a[0];

pa[1]=a[1];for

(int

i=0;

i<2;

i++)for(int

j=0;

j<3;

j++,pa[i]++)cout

<<

"a["<<i<<"]["<<j<<"]=”

<<*pa[i]<<endl;}41a=b;ab01234567893.指向整個(gè)數(shù)組的指針(行指針)如:int(*a)[5];int

b[2][5]={0,1,2,3,4,5,6,7,8,9}#include

<iostream.h>void

main(

){

int

(*a)[5];int

b[2][5]={0,1,2,3,4,5,6,7,8,9};a=b;for(int

i=0;i<5;i++)cout

<<

i

<<":"<<*(*a+i)<<endl;a++;for(int

i=0;i<5;i++)cout

<<

i

<<":"<<*(*a+i)<<endl;}42一維數(shù)組的地址int

a[4];地址a&a[0]a+0是第

0列的地址*(a+0)是第

0列的數(shù)據(jù)數(shù)據(jù)*aa[0]a+i是第

i列的地址*(a+i)是第

i列的數(shù)據(jù)一維數(shù)組的指針int

a[4],

*p;p=a;可以p++指針p數(shù)據(jù)*pa[0]43二維數(shù)組的地址int

a[3][4];*a

a[0]列地址*(a+0)*(a+i)+j是第i行第j列地址*(*(a+i)+j)

a+i

是第

i

行的地址

*(a+0)是第

0行第

0列的地址……..*(a+0)+j是第

0行第

j列的地址*(a+i)是第

i行第

0列的地址……...*(a+i)+j是第

i行第

j列的地址*(*(a+0)+0)是第0行第0列的數(shù)據(jù)..(*(a+0)+j)是第0行第j列的數(shù)據(jù)*(*(a+i)+0)是第i行第0列的數(shù)據(jù)….*(*(a+i)+j)是第i行第j列的數(shù)據(jù)行地址a+0a+0行是地是址第0a+行i

的地址……….44二維數(shù)組的指針*a

a[0]列地址*(ap+0i)*4+j)是第i行第j列地址int

a[3][4];*(p+i*4+j)(1)int

*p;(小指針)

p=*a;∨p=a;ㄨp=a[0];

∨p=&a[0][0];

∨元素地址:

p=*a+j;元素?cái)?shù)據(jù):

*p

*(p+j)p+j

p++;p[j]*(a+0)是第

0行第

0列的地址……..*(a+0)+j是第

0行第

j列的地址*(a+i)是第

i行第

0列的地址……...*(a+i)+j是第

i行第

j列的地址*(*(a+0)+0)是第0行第0列的數(shù)據(jù)..(*(a+0)+j)是第0行第j列的數(shù)據(jù)*(*(a+i)+0)是第i行第0列的數(shù)據(jù)….*(*(a+i)+j)是第i行第j列的數(shù)據(jù)p

當(dāng)一維數(shù)組名用但可

p=p+i

p++ 走

(i)一行元素地址:

*p+j數(shù)據(jù):

*(*p+j)

(*p)[j]45struct

student

{int

num;float

score;struct

student*next};struct

student

*p;nextnumscore結(jié)點(diǎn)#include

<stdlib.h>申請(qǐng)空間函數(shù):malloc(字節(jié)數(shù))測(cè)試字節(jié)運(yùn)算符:sizeof(類(lèi)型)p=(struct

student

*

)malloc(sizeof(struct

student));釋放空間函數(shù):free(指針);free(

p

);

結(jié)點(diǎn)pnextnum

score46p1=p2=(struct

student

*

)malloc(LEN);結(jié)點(diǎn)p1

p2num

score

next20101

89.5scanf(“%d,%f”,&p1->num,&p1->score);head

NULLhead=p1;p1=(struct

student

*

)malloc(LEN);n= 0

212headp1num

20103score

next90scanf(“%d,%f”,&p1->num,&p1->score);(n=2)

p2->next=p1;p2=p1;p2nextnum

0scorep1NULLp1->num==047pp0103070811NULLheadp1p2p1p20103070811NULLhead05p0p1p01031108p1headNULLp2482.11.4引用引用可為變量起別名,它主要用作函數(shù)參數(shù)以及函數(shù)的返回類(lèi)型。有參數(shù)引用和返回值引用。引用說(shuō)明int

num=50;int&

ref=num;表示放整數(shù)50的內(nèi)存空間可叫num,又可叫ref引用實(shí)質(zhì)上是為另一個(gè)變量建立別名。引用參數(shù)(傳引用)493.返回引用的函數(shù)當(dāng)一個(gè)函數(shù)的返回值需重新賦值的時(shí)候,我們也可對(duì)返回值進(jìn)行引用,這時(shí)函數(shù)可出現(xiàn)在賦值號(hào)的左邊。這種函數(shù)稱(chēng)為返回引用的函數(shù)。形式類(lèi)型&函數(shù)名(參數(shù))#include

<iostream.h>int

a[]={2,4,6,8,10,12};int&

index(int

i);void

main(

){

index(3)=16;

//index(3)

即返回值a[i],i=3,a[3]改為16cout<<index(3)<<endl; cout

<<a[3]<<endl;}int&

index(int

i){ return

a[i];

}注意:返回值是函數(shù)內(nèi)的局部變量時(shí)不能引用50例#include

<iostream.h>int

e(int

i){

return

i+1;

}int&f(){

int

i=1;return

++i;}int

g(int

&i){

i=i+1;return

i;}main(){int

r1=e(3);int

&r2=e(4);int

r3=f();int

&r4=f();int

a=0,b=0,c=0,d;d=g(4);a+=g(g(c));b+=g(e(3));return

1;}512.11.5

void類(lèi)型指針void指針是一個(gè)特殊指針,它可以指向任一類(lèi)型的C++對(duì)象。void

main(){

void

*vp;

int

i=5;

floatf=7.8;

char

c="A";char

*cp;int

*ip;

float

*fp;ip=&i;

vp=&i;cp=&c;

vp=&c;fp=&f;

vp=&f;vp=ip;

vp=fp;

vp=cp;ip=vp;cp=vp;fp=vp;//錯(cuò)誤}522.12類(lèi)型定義typedef

類(lèi)型名 標(biāo)識(shí)符2.13指針和動(dòng)態(tài)內(nèi)存分配C++的基本操作符new和delete分配內(nèi)存: 指針變量名=new

類(lèi)型[大小];int

*ip;ip=new

int[5];釋放內(nèi)存delete

ip;532.14指針和函數(shù)指針變量可以作函數(shù)的參數(shù),指針也可作函數(shù)的返回值,還有一種指針可以用來(lái)指向函數(shù)2.14.1指針作為函數(shù)的參數(shù)函數(shù)中的形參,可以是指針變量。這時(shí)實(shí)參可以是地址或指針來(lái)調(diào)用它【例】指針作為參數(shù)的例子#include

<iostream.h>void

main(

){

int

a[15];input(a,15);for(int

i=0;

i<15;

i++)cout<<a[i]<<endl;}void

input(int

*s,

int

n){cout<<“請(qǐng)輸入”<<n<<“個(gè)整數(shù):”<<endl;for(int

i=0;

i<n;

i++)void

input(int

*s,intcnin)>;>s[i];//或cin>>*s++;}542.14.2返回指針的函數(shù)C++函數(shù)的返回類(lèi)型,可以是除數(shù)組和函數(shù)外的任何類(lèi)型包括指針【例】指針作為函數(shù)的返回值的例子先問(wèn)用戶(hù)要輸入多少個(gè)實(shí)數(shù),然后分配一存儲(chǔ)空間保存輸入的這些實(shí)數(shù),并把指向這空間的指針?lè)祷亟o用戶(hù)。#include

<iostream.h>float

*input(int&

n);void

main(

){

int

num;

float

*data;data

=

input(num);if(data)cout<<data[i]<<"

";delete

data;}}float

*input(int&

n){

int

num;cout<<“要輸入多少個(gè)實(shí)數(shù):”;cin<<num;if(num<=0)

return

0;float

*buf=new

float[num];if(buf==0)

return;{

for(int

i=0;

i<num;

i++n)=

num;for(int

i=0;

i<num;

i++)cin>>buf[i];return

buf;}552.14.3指向函數(shù)的指針變量C++中函數(shù)也有地址,也可以用指針指向它。這種指針的定義方法:int

(*funp)(int

a,int

b);表示funp是指針,可以用來(lái)指向帶有兩個(gè)int類(lèi)型參數(shù)的函數(shù),這個(gè)函數(shù)的返回值是int函數(shù)int

fun(int

a,int

b){..........…}funp=fun; funp指向函數(shù)fun可以用這種指針調(diào)用函數(shù)result=(*funp)(5,10);或result=fnup(5,10);56在C++中,字符串被定義為以"\0"結(jié)束的字符數(shù)組。

char

str[7]={"s","t","r","i","n","g","\0"};

char

str[7]="string";char

*ps="string";或分成char

*ps;ps="string";但數(shù)組不能分成char

str[7];串可以作為一個(gè)整體輸入輸出:#include

<iostream.h>void

main(

)str="string";//錯(cuò)誤{char

str[]="請(qǐng)輸入一個(gè)字符串:";char

entstr[25];cout

<<

str;cin

>>

entstr;cout<<"\n您輸入的字符串是:"<<entstr;}57783.1

類(lèi)與對(duì)象的基本概念3.1.1結(jié)構(gòu)與類(lèi)1.結(jié)構(gòu)的擴(kuò)充C++中對(duì)C語(yǔ)言的結(jié)構(gòu)類(lèi)型進(jìn)行了擴(kuò)充,它還可以含有函數(shù)。如:struct

complex{doubledoublereal;imag;//復(fù)數(shù)的實(shí)部//復(fù)數(shù)的虛部void init

(double

r,

double

I)//給real和imag賦初值{

real=r; imag=i;

}double

realcomplex(){

return

real;}double

imagcomplex(){

return

imag;}//取復(fù)數(shù)的實(shí)部值//取復(fù)數(shù)的虛部值double

abscomplex() //求復(fù)數(shù)的絕對(duì)值{

double

t;t=real*real+imag*imag;return

agrt(t);}};結(jié)構(gòu)類(lèi)型中的數(shù)據(jù)和函數(shù),分別稱(chēng)為數(shù)據(jù)成員和函數(shù)成員。**例3.1#include#include//復(fù)數(shù)的實(shí)部//復(fù)數(shù)的虛部void init

(double

r,

double

I)//給real和imag賦初值{

real=r; imag=i;

}double

realcomplex(){

return

real;}double

imagcomplex(){

return

imag;}//取復(fù)數(shù)的實(shí)部值//取復(fù)數(shù)的虛部值double

abscomplex()//求復(fù)數(shù)的絕對(duì)值{

double

t;t=real*real+imag*imag;return

sqrt(t);}}

A;void

main(){

A.init(1.1,2.2);<iostcroeutata<m<.“h復(fù)>數(shù)A的實(shí)部=“<<A.realcomplex()<<endl;<mathc.ohut>t><<“復(fù)數(shù)A的實(shí)部=“<<A.imagcomplex()<<endl;struct

complex{cout<<“復(fù)數(shù)A的絕對(duì)值=“<<A.abscomplex()<<endl;}double

real;double

imag;792.類(lèi)的定義(聲明)C++中說(shuō)明類(lèi)的一般形式為clsaa類(lèi)名{private:(可缺省)私有數(shù)據(jù)成員和函數(shù)成員protected:保護(hù)段public:公有數(shù)據(jù)成員和函數(shù)成員};class

complex{private:double real,

imag;public:imag=i;

}{

double

t;

t=real*real+imag*imag; return

sqrt(t);

}};類(lèi)class和結(jié)構(gòu)

sturct的主要區(qū)別是:在缺省

private時(shí),在類(lèi)中,成員是私有的void init

(double

r在,結(jié)d構(gòu)ou中u中b,l成e

員i是)

公有{的real=r;double

realcomplex() {

return

real;}double

imagcomplex()

{

return

imag;}double

abscomplex()80例3.2#include<iostream.h>#include

<math.h>class

complex{private:doublereal,

imag;public:void init

(double

r,

double

i) {

real=r;imag=i;

}double

realcomplex() {

return

real;}double

imagcomplex()

{

return

imag;}double

abscomplex(){

double

t;

t=real*real+imag*imag; return

sqrt(t);

}};void

main(

){

complex

A;A.init(1.1,2.2);cout<<“復(fù)數(shù)A的實(shí)部=“<<A.realcomplex()<<endl;cout<<“復(fù)數(shù)A的實(shí)部=“<<A.imagcomplex()<<endl;cout<<“復(fù)數(shù)A的絕對(duì)值=“<<A.abscomplex()<<endl;}813.1.2成員函數(shù)的定義第一種方式是在類(lèi)定義中只給出成員函數(shù)的原型(或者說(shuō)聲明),而成員函數(shù)在類(lèi)的外部定義。在外部定義的一般形式是:返回類(lèi)型 類(lèi)名::函數(shù)名(參數(shù)表){//函數(shù)體}class

point{//定義類(lèi)

point//數(shù)據(jù)成員,二個(gè)整數(shù)作為

x,y坐標(biāo)private:int

x,

y;public:void setpoint(int,int);//函數(shù)成員,名為setpoint,有二個(gè)整數(shù)形參,用于設(shè)置坐標(biāo)值,具體如何在外部再定義,這叫函數(shù)的原型(或者說(shuō)聲明)int

getx();int

gety();//取x坐標(biāo)值的成員函數(shù)getx()的函數(shù)原型//取y坐標(biāo)值的成員函數(shù)gety()的函數(shù)原型};//類(lèi)定義結(jié)束viod

point::setpoin

溫馨提示

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