版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024石材加工行業(yè)標(biāo)準(zhǔn)化及質(zhì)量管理體系合作協(xié)議3篇
- 個(gè)人向公司借款詳細(xì)條款合同版B版
- 專(zhuān)業(yè)租車(chē)協(xié)議范本:2024年版
- 2025年度地質(zhì)勘查測(cè)繪合作協(xié)議書(shū)8篇
- 2024版銷(xiāo)售代表獎(jiǎng)勵(lì)提成協(xié)議樣本一
- 集合2024年度醫(yī)療設(shè)備采購(gòu)及安裝服務(wù)合同
- 2025年度文化旅游項(xiàng)目合作協(xié)議補(bǔ)充協(xié)議3篇
- 2024精密波紋管訂貨及銷(xiāo)售協(xié)議條款版B版
- 2025年度廠(chǎng)房租賃及品牌授權(quán)使用合同4篇
- 二零二五年度汽車(chē)后市場(chǎng)銷(xiāo)售提成及品牌代理協(xié)議
- 礦山隱蔽致災(zāi)普查治理報(bào)告
- 2024年事業(yè)單位財(cái)務(wù)工作計(jì)劃例文(6篇)
- 副總經(jīng)理招聘面試題與參考回答(某大型國(guó)企)2024年
- PDCA循環(huán)提高護(hù)士培訓(xùn)率
- 2024年工程咨詢(xún)服務(wù)承諾書(shū)
- 青桔單車(chē)保險(xiǎn)合同條例
- 車(chē)輛使用不過(guò)戶(hù)免責(zé)協(xié)議書(shū)范文范本
- 《獅子王》電影賞析
- 2023-2024學(xué)年天津市部分區(qū)九年級(jí)(上)期末物理試卷
- DB13-T 5673-2023 公路自愈合瀝青混合料薄層超薄層罩面施工技術(shù)規(guī)范
- 河北省保定市定州市2025屆高二數(shù)學(xué)第一學(xué)期期末監(jiān)測(cè)試題含解析
評(píng)論
0/150
提交評(píng)論