版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年地震數(shù)據(jù)采集系統(tǒng)項(xiàng)目籌資方案
- PEP人教版小學(xué)六年級(jí)上冊(cè)Unit6 How do you feel B Lets try Lets talk
- 《知識(shí)與個(gè)人知識(shí)》課件
- 電工(初級(jí)工)測(cè)試題及參考答案
- 養(yǎng)老院老人入住資料制度
- 養(yǎng)老院老人安全管理制度
- 捐款型的借款合同
- 《高血壓的診治進(jìn)展》課件
- 2024年生日蛋糕定制與航空旅行禮品合作合同3篇
- 2025年山西貨運(yùn)從業(yè)資格證試題和答案
- 殯葬行業(yè)的風(fēng)險(xiǎn)分析
- 下肢靜脈血栓個(gè)案查房
- 通信工程冬季施工安全培訓(xùn)
- 痛風(fēng)病科普講座課件
- 工作崗位風(fēng)險(xiǎn)評(píng)估報(bào)告
- 護(hù)理查房肺部感染心衰
- 拒執(zhí)罪申請(qǐng)書(shū)范本
- 《阿米巴經(jīng)營(yíng)》讀書(shū)分享
- 鉛酸鋰電池回收項(xiàng)目計(jì)劃書(shū)
- 北京市朝陽(yáng)區(qū)2023-2024學(xué)年七年級(jí)上學(xué)期期末檢測(cè)語(yǔ)文試卷+
- (常州專(zhuān)版)江蘇省常州市2023-2024學(xué)年六年級(jí)數(shù)學(xué)上冊(cè)期末學(xué)情調(diào)研檢測(cè)卷一(蘇教版)
評(píng)論
0/150
提交評(píng)論