版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第十二章C與C++12.1C轉(zhuǎn)入C++時不需改變的內(nèi)容12.2C轉(zhuǎn)入C++的一些與類無關(guān)的新特性
12.3C++的核心新特性——類12.4面向?qū)ο蟪绦蛟O(shè)計12.1C轉(zhuǎn)入C++時不需改變的內(nèi)容(1)各種數(shù)據(jù)類型變量的定義與使用,函數(shù)、數(shù)組、指針、文件等基本知識。
(2)許多有效的算法。
(3)程序的基本調(diào)試思想方法。
(4)程序設(shè)計中的自頂向下的總體思想:
(5)程序段中具體的最小模塊仍然由順序、分支、循環(huán)三種基本模塊組成。12.2C轉(zhuǎn)入C++的一些與類無關(guān)的新特性12.2.1C轉(zhuǎn)入C++時需改變的內(nèi)容C++中不能再作為標(biāo)識符的關(guān)鍵字2.函數(shù)聲明3.函數(shù)聲明的形式12.2.2C++中獨有的與類無關(guān)的部分新特性1.局部變量說明語句的位置如:voidmain(){……/*程序的其它部分(包括執(zhí)行語句)*/intcount=0;//變量count說明
while(++count<=100)//變量count使用
{……}
……/*后續(xù)程序*/}2.注釋符
C++中可以使用兩種注釋符(如上例),比C多一種注釋符“//”,其功能是其后至行末為注釋部分。程序中可靈活選用。
3.范圍分解符::
C中,當(dāng)全局變量和某函數(shù)內(nèi)的局部變量同名時,該函數(shù)對全局變量起屏蔽作用,即在該函數(shù)內(nèi)無法訪問此全局變量,而在C++中,只要在其前使用范圍分解符即可訪問同名的全局變量。例如:
floatn;voidmain(){intn;n=5;//給局部變量n賦值::n=5.53;//給全局變量n賦值
……
}4.內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)的特性類似于宏。
C中,在定義了宏#defineABS(n)((n)<0?-(n):(n))之后,程序每調(diào)用一次宏ABS,替換宏名的字符串就展開并插入在調(diào)用處一次。C中的函數(shù)調(diào)用就不是這種展開方式,而是程序轉(zhuǎn)入子函數(shù)執(zhí)行,執(zhí)行完后再返回主調(diào)函數(shù),每個函數(shù)只有一段代碼。在C++中,可以定義類似于宏的內(nèi)聯(lián)函數(shù),關(guān)鍵字是inline,如定義求絕對值的內(nèi)聯(lián)函數(shù)如下:inlineintAbs(intn){returnn<0?-n:n;}5.重載函數(shù)
C++中可以在同一程序中多次定義同名函數(shù),只要各函數(shù)間的參數(shù)個數(shù)或類型不同,例如:intAbs(intn){returnn<0?-n:n;}floatAbs(floatn){returnn<0?-n:n;}
在同一范圍內(nèi)定義同名函數(shù)稱為重載函數(shù)。編譯器根據(jù)函數(shù)調(diào)用時具體的實參的個數(shù)和類型自動調(diào)用匹配的重載函數(shù)版本。例如:intAbs(intn);floatAbs(floatn);voidmain(){inti;floatf;i=Abs(5);//調(diào)整型的求絕對值函數(shù)
f=Abs(-2.5);//調(diào)實型的求絕對值函數(shù)
……
}6.new和delete操作符以下為動態(tài)開辟內(nèi)存塊的例子:structnode{char*name;intsalary;node*next;};
char*pchar;//定義三種類型的指針變量
int*pint;structnode*pnode;pchar=newchar;//開辟了三塊內(nèi)存區(qū)pint=newint;pnode=newnode;*pchar=′a′;//為內(nèi)存單元賦值*pint=6;pnode->name="hello";pnode->salary=1000;12.3C++的核心新特性——類12.3.1類以下是一個有關(guān)“人”的類的定義classCHuman//class——類定義關(guān)鍵字
{charname[20];//類的數(shù)據(jù)成員
intage;
voidGetInfo()//類的成員函數(shù)
{……
}voidOutInfo(){……
}};12.3.2類實例
類的定義格式與結(jié)構(gòu)體類型定義格式類似,其含義也類似,均是定義了一種新的數(shù)據(jù)類型,要作為程序處理的對象。對于結(jié)構(gòu)體類型,接著要定義結(jié)構(gòu)體型變量以便在程序中引用(如第九章中的structstaffworker1,worker2;);對于類,則要生成類實例,又稱為類對象。其地位如同變量。如在上述的CHuman類定義之后,語句:
CHumanhuman;(類名前不需加關(guān)鍵字class)就生成了類CHuman的實例human,即為類對象human分配了一塊可以存放數(shù)據(jù)和對數(shù)據(jù)進行處理的程序代碼的內(nèi)存塊,又稱為類的實例化。
和內(nèi)部變量一樣,類對象在定義范圍內(nèi)有效(如在函數(shù)內(nèi)定義的類對象,在函數(shù)返回時銷毀)。一個類可以生成多個實例。也可以用C++的new操作符生成類的實例如下:CHuman*PHuman=newCHuman;這個語句分配足以放置類對象的內(nèi)存塊并返回其首地址給這個對象的指針。對象所占內(nèi)存保持到用delete操作符釋放:
deletePHuman;
C++中多用這種分配、銷毀模式。12.3.3類成員的訪問
例12.1
使用C語言全局變量實現(xiàn)有關(guān)一個人的信息的輸出操作。#include<string.h>#include<stdio.h>charname[20];/*兩個全局變量*/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++語言定義一個有關(guān)人的“類”classCHuman//class——類的定義符
{private://以下為私有變量,可以也只能由該類的成員函數(shù)調(diào)用
charname[20];
intage;
public://以下為公有函數(shù),此類內(nèi)外的函數(shù)均可以調(diào)用它們
intGetInfo(){……
}intOutInfo(){……
}};//類定義結(jié)束圖12.2類對私有數(shù)據(jù)成員的封裝怎樣正確地調(diào)用類成員:main(){CHumanhuman;//定義了一個CHuman類的對象
strcpy(,"Li-Li");//錯誤:不能訪問私有數(shù)據(jù)成員
human.age=22;//錯誤:同上
human.GetInfo();//正確:可以訪問公有成員函數(shù)
human.OutInfo();//正確:同上
}12.3.4構(gòu)造函數(shù)
在定義一個類時,直接初始化數(shù)據(jù)成員是不允許的。下列類的定義的初始化會產(chǎn)生錯誤:classC{private:
intn=0;//出錯
int*pi=&n;//出錯
……
};
其實,在類的定義中初始化是沒有意義的,它只是創(chuàng)建了一個模板,類似于C語言中的結(jié)構(gòu)體類型的定義,而程序是不可以直接對類型操作的,只能對定義在其上的變量操作。所以想要初始化成員,就必須生成一個類的實例。例如:……//其它程序voidCHuman::initial(charname[20],intage)//定義一初始化函數(shù){strcpy(name,"");age=0;}……//其它程序CHumanhuman;//生成了一個CHuman類的實例humanhuman.initial(name,age);//初始化類實例human
初始化成員變量的更好辦法是定義一個特殊的成員函數(shù):“構(gòu)造函數(shù)”。classCHuman{private:
charname[20];
intage;
public:
CHuman()//定義構(gòu)造函數(shù),它的名稱與類的名稱一樣{strcpy(name,"");age=0;}voidGetInfo(){……
}voidOutInfo(){……
};}12.3.5析構(gòu)函數(shù)
析構(gòu)函數(shù)也是自動執(zhí)行的,但它與構(gòu)造函數(shù)相反,是在程序結(jié)束時執(zhí)行,它負(fù)責(zé)在程序撤消類的對象時,釋放所占資源。例如:
~CHuman()//定義析構(gòu)函數(shù)
{deletename;//釋放name所占內(nèi)存
}
析構(gòu)函數(shù)的名稱為構(gòu)造函數(shù)名稱前加“~”例12.3CHuman類的完整定義classCHuman{private:
charname[20];intage;
public:
CHuman()//定義構(gòu)造函數(shù)
{strcpy(name,"");age=0;}voidGetInfo(){……}voidOutInfo(){……}~CHuman()//定義析構(gòu)函數(shù)
{deletename;}};12.3.6類的繼承
類的最重要的特性是繼承性,它很貼近現(xiàn)實世界,如:兒子繼承父親的一些特征,并且擁有自己的特征。孫子又繼承了兒子的一些特征,并且擁有自己的特征……。類也一樣,它的一些特性是可以繼承的。下面我們將前面的有關(guān)人的類增加一些數(shù)據(jù)成員,并派生出一個“學(xué)生”的類:classCHuman//重新定義一表示人的類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;}};
以上是一個“人”的類,現(xiàn)在,我們需要描述一個學(xué)生的一些特征。當(dāng)然,學(xué)生是屬于“人”的,所以,有關(guān)人的特性我們不應(yīng)該重復(fù),可以從“人”的類中“派生”出我們所要定義的“學(xué)生類”,繼承“人”類中所有的屬性,再增加些學(xué)生特有的屬性,定義“學(xué)生類”如下:classCStudents:publicCHuman//表示類CStudents是從類Chuman 中公有派生的
{private://學(xué)生類所具有的新的屬性
char*m-schoolname;//校名
intm-grade;//年級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基類及其派生類的成員可訪問圖12.4面向?qū)ο蟪绦蛟O(shè)計12.4.1從面向過程到面向?qū)ο?2.4.2什么是面向?qū)ο?/p>
面向?qū)ο蟪绦蛟O(shè)計是面向?qū)ο罄碚撛诔绦蛟O(shè)計中的應(yīng)用,面向?qū)ο罄碚摰膽?yīng)用范圍則更廣。面向?qū)ο笙到y(tǒng)有三大特性:封裝性、繼承性和多態(tài)性。面向?qū)ο蟮母拍羁梢杂扇缦鹿奖硎荆好嫦驅(qū)ο?對象+類+繼承+通信1.對象在面向?qū)ο蟮南到y(tǒng)中,對象是基本的、運行時的實體,它既包括數(shù)據(jù)(屬性),也包括作用于數(shù)據(jù)的操作(行為)。所以一個對象把屬性和行為密封成一個整體。從程序設(shè)計者來看,對象是一個程序模塊;從用戶來看,對象為他們提供了所希望的行為。2.類
一個類定義了一組大體上相似的對象。一個類所包含的方法和數(shù)據(jù)描述了一組對象的共同行為和屬性。把一組對象的共同特性加以抽象并存貯在一個類中的能力,是面向?qū)ο蠹夹g(shù)最重要的一點。類是在對象之上的抽象。有了類以后,對象則是類的具體化,是類的實例。類可以有子類,同樣也可以有父類,形成層次結(jié)構(gòu)。3.繼承性繼承性是父類和子類之間共享數(shù)據(jù)和操作的機制。這是類之間的一種關(guān)系,在定義和實現(xiàn)一個類的時候,可以在一個已經(jīng)存在的類的基礎(chǔ)上進行,把這個已經(jīng)存在的類所定義的內(nèi)容做為自己的內(nèi)容,并加入若干新的內(nèi)容。繼承性是面向?qū)ο蟪绦蛟O(shè)計語言的標(biāo)志。它使程序的可重用性大大提高。因為程序員只要對已有的類加以整
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年政府公共安全監(jiān)控技術(shù)合同范本3篇
- 2024年版建設(shè)項目招標(biāo)協(xié)調(diào)合同
- 三年級教學(xué)計劃3篇
- 員工工作計劃
- 2024-2030年中國羥甲煙胺片行業(yè)發(fā)展?jié)摿︻A(yù)測及投資戰(zhàn)略研究報告
- 服裝銷售工作計劃
- 學(xué)習(xí)部工作計劃4篇
- 去超市實習(xí)報告范文集合7篇
- 銀行員工辭職信
- 關(guān)于教師職稱述職報告匯編5篇
- 變壓器安裝施工工藝-課件
- 河道汛期施工防洪防汛應(yīng)急預(yù)案
- 漢語教程我聽過鋼琴協(xié)奏曲黃河課件
- 二氧化碳充裝流程
- 12m跨鋼棧橋設(shè)計計算
- 電路板類英語詞匯
- 沙特的礦產(chǎn)資源開發(fā)概況及其商機
- 高一生物必修一期末試題(附答案)
- 安全事故應(yīng)急響應(yīng)程序流程圖(共1頁)
- 三年級_上冊牛津英語期末試卷
- 損傷容限設(shè)計基本概念原理和方法PPT課件
評論
0/150
提交評論