語(yǔ)言基本教程程序設(shè)計(jì)章_第1頁(yè)
語(yǔ)言基本教程程序設(shè)計(jì)章_第2頁(yè)
語(yǔ)言基本教程程序設(shè)計(jì)章_第3頁(yè)
語(yǔ)言基本教程程序設(shè)計(jì)章_第4頁(yè)
語(yǔ)言基本教程程序設(shè)計(jì)章_第5頁(yè)
已閱讀5頁(yè),還剩39頁(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與C++12.1C轉(zhuǎn)入C++時(shí)不需改變的內(nèi)容12.2C轉(zhuǎn)入C++的一些與類(lèi)無(wú)關(guān)的新特性

12.3C++的核心新特性——類(lèi)12.4面向?qū)ο蟪绦蛟O(shè)計(jì)12.1C轉(zhuǎn)入C++時(shí)不需改變的內(nèi)容(1)各種數(shù)據(jù)類(lèi)型變量的定義與使用,函數(shù)、數(shù)組、指針、文件等基本知識(shí)。

(2)許多有效的算法。

(3)程序的基本調(diào)試思想方法。

(4)程序設(shè)計(jì)中的自頂向下的總體思想:

(5)程序段中具體的最小模塊仍然由順序、分支、循環(huán)三種基本模塊組成。12.2C轉(zhuǎn)入C++的一些與類(lèi)無(wú)關(guān)的新特性12.2.1C轉(zhuǎn)入C++時(shí)需改變的內(nèi)容C++中不能再作為標(biāo)識(shí)符的關(guān)鍵字2.函數(shù)聲明3.函數(shù)聲明的形式12.2.2C++中獨(dú)有的與類(lèi)無(wú)關(guān)的部分新特性1.局部變量說(shuō)明語(yǔ)句的位置如:voidmain(){……/*程序的其它部分(包括執(zhí)行語(yǔ)句)*/intcount=0;//變量count說(shuō)明

while(++count<=100)//變量count使用

{……}

……/*后續(xù)程序*/}2.注釋符

C++中可以使用兩種注釋符(如上例),比C多一種注釋符“//”,其功能是其后至行末為注釋部分。程序中可靈活選用。

3.范圍分解符::

C中,當(dāng)全局變量和某函數(shù)內(nèi)的局部變量同名時(shí),該函數(shù)對(duì)全局變量起屏蔽作用,即在該函數(shù)內(nèi)無(wú)法訪(fǎng)問(wèn)此全局變量,而在C++中,只要在其前使用范圍分解符即可訪(fǎng)問(wèn)同名的全局變量。例如:

floatn;voidmain(){intn;n=5;//給局部變量n賦值::n=5.53;//給全局變量n賦值

……

}4.內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)的特性類(lèi)似于宏。

C中,在定義了宏#defineABS(n)((n)<0?-(n):(n))之后,程序每調(diào)用一次宏ABS,替換宏名的字符串就展開(kāi)并插入在調(diào)用處一次。C中的函數(shù)調(diào)用就不是這種展開(kāi)方式,而是程序轉(zhuǎn)入子函數(shù)執(zhí)行,執(zhí)行完后再返回主調(diào)函數(shù),每個(gè)函數(shù)只有一段代碼。在C++中,可以定義類(lèi)似于宏的內(nèi)聯(lián)函數(shù),關(guān)鍵字是inline,如定義求絕對(duì)值的內(nèi)聯(lián)函數(shù)如下:inlineintAbs(intn){returnn<0?-n:n;}5.重載函數(shù)

C++中可以在同一程序中多次定義同名函數(shù),只要各函數(shù)間的參數(shù)個(gè)數(shù)或類(lèi)型不同,例如:intAbs(intn){returnn<0?-n:n;}floatAbs(floatn){returnn<0?-n:n;}

在同一范圍內(nèi)定義同名函數(shù)稱(chēng)為重載函數(shù)。編譯器根據(jù)函數(shù)調(diào)用時(shí)具體的實(shí)參的個(gè)數(shù)和類(lèi)型自動(dòng)調(diào)用匹配的重載函數(shù)版本。例如:intAbs(intn);floatAbs(floatn);voidmain(){inti;floatf;i=Abs(5);//調(diào)整型的求絕對(duì)值函數(shù)

f=Abs(-2.5);//調(diào)實(shí)型的求絕對(duì)值函數(shù)

……

}6.new和delete操作符以下為動(dòng)態(tài)開(kāi)辟內(nèi)存塊的例子:structnode{char*name;intsalary;node*next;};

char*pchar;//定義三種類(lèi)型的指針變量

int*pint;structnode*pnode;pchar=newchar;//開(kāi)辟了三塊內(nèi)存區(qū)pint=newint;pnode=newnode;*pchar=′a′;//為內(nèi)存單元賦值*pint=6;pnode->name="hello";pnode->salary=1000;12.3C++的核心新特性——類(lèi)12.3.1類(lèi)以下是一個(gè)有關(guān)“人”的類(lèi)的定義classCHuman//class——類(lèi)定義關(guān)鍵字

{charname[20];//類(lèi)的數(shù)據(jù)成員

intage;

voidGetInfo()//類(lèi)的成員函數(shù)

{……

}voidOutInfo(){……

}};12.3.2類(lèi)實(shí)例

類(lèi)的定義格式與結(jié)構(gòu)體類(lèi)型定義格式類(lèi)似,其含義也類(lèi)似,均是定義了一種新的數(shù)據(jù)類(lèi)型,要作為程序處理的對(duì)象。對(duì)于結(jié)構(gòu)體類(lèi)型,接著要定義結(jié)構(gòu)體型變量以便在程序中引用(如第九章中的structstaffworker1,worker2;);對(duì)于類(lèi),則要生成類(lèi)實(shí)例,又稱(chēng)為類(lèi)對(duì)象。其地位如同變量。如在上述的CHuman類(lèi)定義之后,語(yǔ)句:

CHumanhuman;(類(lèi)名前不需加關(guān)鍵字class)就生成了類(lèi)CHuman的實(shí)例human,即為類(lèi)對(duì)象human分配了一塊可以存放數(shù)據(jù)和對(duì)數(shù)據(jù)進(jìn)行處理的程序代碼的內(nèi)存塊,又稱(chēng)為類(lèi)的實(shí)例化。

和內(nèi)部變量一樣,類(lèi)對(duì)象在定義范圍內(nèi)有效(如在函數(shù)內(nèi)定義的類(lèi)對(duì)象,在函數(shù)返回時(shí)銷(xiāo)毀)。一個(gè)類(lèi)可以生成多個(gè)實(shí)例。也可以用C++的new操作符生成類(lèi)的實(shí)例如下:CHuman*PHuman=newCHuman;這個(gè)語(yǔ)句分配足以放置類(lèi)對(duì)象的內(nèi)存塊并返回其首地址給這個(gè)對(duì)象的指針。對(duì)象所占內(nèi)存保持到用delete操作符釋放:

deletePHuman;

C++中多用這種分配、銷(xiāo)毀模式。12.3.3類(lèi)成員的訪(fǎng)問(wèn)

例12.1

使用C語(yǔ)言全局變量實(shí)現(xiàn)有關(guān)一個(gè)人的信息的輸出操作。#include<string.h>#include<stdio.h>charname[20];/*兩個(gè)全局變量*/intage;voidGetInfo(){strcpy(name,"Li-Li");age=22;}voidOutInfo(){count<<"name:"<<name<<end;/*<<為輸出顯示符*/count<<"age:"<<age<<end;}/*下面是一些其它的函數(shù)*/function1(){……//此函數(shù)內(nèi)可調(diào)用GetInfo()和OutInfo()及全局變量name[]和age}Function2(){……//此函數(shù)內(nèi)可調(diào)用GetInfo()和OutInfo()及全局變量name[]和age}main(){charch;

GetInfo();OutInfo();

……

}圖12.1C程序中全局變量不安全性例12.2

用C++語(yǔ)言定義一個(gè)有關(guān)人的“類(lèi)”classCHuman//class——類(lèi)的定義符

{private://以下為私有變量,可以也只能由該類(lèi)的成員函數(shù)調(diào)用

charname[20];

intage;

public://以下為公有函數(shù),此類(lèi)內(nèi)外的函數(shù)均可以調(diào)用它們

intGetInfo(){……

}intOutInfo(){……

}};//類(lèi)定義結(jié)束圖12.2類(lèi)對(duì)私有數(shù)據(jù)成員的封裝怎樣正確地調(diào)用類(lèi)成員:main(){CHumanhuman;//定義了一個(gè)CHuman類(lèi)的對(duì)象

strcpy(,"Li-Li");//錯(cuò)誤:不能訪(fǎng)問(wèn)私有數(shù)據(jù)成員

human.age=22;//錯(cuò)誤:同上

human.GetInfo();//正確:可以訪(fǎng)問(wèn)公有成員函數(shù)

human.OutInfo();//正確:同上

}12.3.4構(gòu)造函數(shù)

在定義一個(gè)類(lèi)時(shí),直接初始化數(shù)據(jù)成員是不允許的。下列類(lèi)的定義的初始化會(huì)產(chǎn)生錯(cuò)誤:classC{private:

intn=0;//出錯(cuò)

int*pi=&n;//出錯(cuò)

……

};

其實(shí),在類(lèi)的定義中初始化是沒(méi)有意義的,它只是創(chuàng)建了一個(gè)模板,類(lèi)似于C語(yǔ)言中的結(jié)構(gòu)體類(lèi)型的定義,而程序是不可以直接對(duì)類(lèi)型操作的,只能對(duì)定義在其上的變量操作。所以想要初始化成員,就必須生成一個(gè)類(lèi)的實(shí)例。例如:……//其它程序voidCHuman::initial(charname[20],intage)//定義一初始化函數(shù){strcpy(name,"");age=0;}……//其它程序CHumanhuman;//生成了一個(gè)CHuman類(lèi)的實(shí)例humanhuman.initial(name,age);//初始化類(lèi)實(shí)例human

初始化成員變量的更好辦法是定義一個(gè)特殊的成員函數(shù):“構(gòu)造函數(shù)”。classCHuman{private:

charname[20];

intage;

public:

CHuman()//定義構(gòu)造函數(shù),它的名稱(chēng)與類(lèi)的名稱(chēng)一樣{strcpy(name,"");age=0;}voidGetInfo(){……

}voidOutInfo(){……

};}12.3.5析構(gòu)函數(shù)

析構(gòu)函數(shù)也是自動(dòng)執(zhí)行的,但它與構(gòu)造函數(shù)相反,是在程序結(jié)束時(shí)執(zhí)行,它負(fù)責(zé)在程序撤消類(lèi)的對(duì)象時(shí),釋放所占資源。例如:

~CHuman()//定義析構(gòu)函數(shù)

{deletename;//釋放name所占內(nèi)存

}

析構(gòu)函數(shù)的名稱(chēng)為構(gòu)造函數(shù)名稱(chēng)前加“~”例12.3CHuman類(lèi)的完整定義classCHuman{private:

charname[20];intage;

public:

CHuman()//定義構(gòu)造函數(shù)

{strcpy(name,"");age=0;}voidGetInfo(){……}voidOutInfo(){……}~CHuman()//定義析構(gòu)函數(shù)

{deletename;}};12.3.6類(lèi)的繼承

類(lèi)的最重要的特性是繼承性,它很貼近現(xiàn)實(shí)世界,如:兒子繼承父親的一些特征,并且擁有自己的特征。孫子又繼承了兒子的一些特征,并且擁有自己的特征……。類(lèi)也一樣,它的一些特性是可以繼承的。下面我們將前面的有關(guān)人的類(lèi)增加一些數(shù)據(jù)成員,并派生出一個(gè)“學(xué)生”的類(lèi):classCHuman//重新定義一表示人的類(lèi)CHuman{private:char*m-name;intm-age;char*m-sex;floatm-height;public:CHuman()//定義構(gòu)造函數(shù)

{m-name="";m-age=0;m-sex="";m-height=0.0;}voidGetInfo(char*name,intage,char*sex,floatheight){m-name=newchar[strlen(name)+1];m-name=name;m-age=age;m-sex=sex;m-height=height;}voidprint(){cout<<"Name:"<<m-name;cout<<"Age:"<<m-age;cout<<"Sex:"<<m-sex;cout<<"High:"<<m-height;}~CHuman()//定義析構(gòu)函數(shù)

{deletem-name;deletem-sex;}};

以上是一個(gè)“人”的類(lèi),現(xiàn)在,我們需要描述一個(gè)學(xué)生的一些特征。當(dāng)然,學(xué)生是屬于“人”的,所以,有關(guān)人的特性我們不應(yīng)該重復(fù),可以從“人”的類(lèi)中“派生”出我們所要定義的“學(xué)生類(lèi)”,繼承“人”類(lèi)中所有的屬性,再增加些學(xué)生特有的屬性,定義“學(xué)生類(lèi)”如下:classCStudents:publicCHuman//表示類(lèi)CStudents是從類(lèi)Chuman 中公有派生的

{private://學(xué)生類(lèi)所具有的新的屬性

char*m-schoolname;//校名

intm-grade;//年級(jí)public:voidprintstu(){cout<<"Schoolname:"<<m-schoolname;cout<<"Grade:"<<m-grade;}voidGetStuInfo(char*schoolname,intgrade){m-schoolname=newchar[strlen(schoolname)+1];m-schoolname=schoolname;m-grade=grade;}CStudents()//定義構(gòu)造函數(shù)

{m-schoolname="";m-grade=0;}~CStudents()//定義析構(gòu)函數(shù)

{deletem-schoolname;}};圖12.3基類(lèi)及其派生類(lèi)的成員可訪(fǎng)問(wèn)圖12.4面向?qū)ο蟪绦蛟O(shè)計(jì)12.4.1從面向過(guò)程到面向?qū)ο?2.4.2什么是面向?qū)ο?/p>

面向?qū)ο蟪绦蛟O(shè)計(jì)是面向?qū)ο罄碚撛诔绦蛟O(shè)計(jì)中的應(yīng)用,面向?qū)ο罄碚摰膽?yīng)用范圍則更廣。面向?qū)ο笙到y(tǒng)有三大特性:封裝性、繼承性和多態(tài)性。面向?qū)ο蟮母拍羁梢杂扇缦鹿奖硎荆好嫦驅(qū)ο?對(duì)象+類(lèi)+繼承+通信1.對(duì)象在面向?qū)ο蟮南到y(tǒng)中,對(duì)象是基本的、運(yùn)行時(shí)的實(shí)體,它既包括數(shù)據(jù)(屬性),也包括作用于數(shù)據(jù)的操作(行為)。所以一個(gè)對(duì)象把屬性和行為密封成一個(gè)整體。從程序設(shè)計(jì)者來(lái)看,對(duì)象是一個(gè)程序模塊;從用戶(hù)來(lái)看,對(duì)象為他們提供了所希望的行為。2.類(lèi)

一個(gè)類(lèi)定義了一組大體上相似的對(duì)象。一個(gè)類(lèi)所包含的方法和數(shù)據(jù)描述了一組對(duì)象的共同行為和屬性。把一組對(duì)象的共同特性加以抽象并存貯在一個(gè)類(lèi)中的能力,是面向?qū)ο蠹夹g(shù)最重要的一點(diǎn)。類(lèi)是在對(duì)象之上的抽象。有了類(lèi)以后,對(duì)象則是類(lèi)的具體化,是類(lèi)的實(shí)例。類(lèi)可以有子類(lèi),同樣也可以有父類(lèi),形成層次結(jié)構(gòu)。3.繼承性繼承性是父類(lèi)和子類(lèi)之間共享數(shù)據(jù)和操作的機(jī)制。這是類(lèi)之間的一種關(guān)系,在定義和實(shí)現(xiàn)一個(gè)類(lèi)的時(shí)候,可以在一個(gè)已經(jīng)存在的類(lèi)的基礎(chǔ)上進(jìn)行,把這個(gè)已經(jīng)存在的類(lèi)所定義的內(nèi)容做為自己的內(nèi)容,并加入若干新的內(nèi)容。繼承性是面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的標(biāo)志。它使程序的可重用性大大提高。因?yàn)槌绦騿T只要對(duì)已有的類(lèi)加以整

溫馨提示

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