《C++語(yǔ)言程序設(shè)計(jì)》課件第7章_第1頁(yè)
《C++語(yǔ)言程序設(shè)計(jì)》課件第7章_第2頁(yè)
《C++語(yǔ)言程序設(shè)計(jì)》課件第7章_第3頁(yè)
《C++語(yǔ)言程序設(shè)計(jì)》課件第7章_第4頁(yè)
《C++語(yǔ)言程序設(shè)計(jì)》課件第7章_第5頁(yè)
已閱讀5頁(yè),還剩56頁(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++語(yǔ)言程序設(shè)計(jì)第十一組C++語(yǔ)言程序設(shè)計(jì)第七章

類(lèi)與對(duì)象C++語(yǔ)言程序設(shè)計(jì)1目錄C++語(yǔ)言程序設(shè)計(jì)2“類(lèi)和對(duì)象的定義構(gòu)造函數(shù)析構(gòu)函數(shù)面向?qū)ο蟪绦蛟O(shè)計(jì)基本知識(shí)對(duì)象數(shù)組對(duì)象作為普通函數(shù)的參數(shù)與返回值對(duì)象指針和堆對(duì)象編程技能this指針復(fù)制構(gòu)造函數(shù)內(nèi)部類(lèi)和命名空間刨根問(wèn)底C++語(yǔ)言程序設(shè)計(jì)3基本知識(shí)a7.1類(lèi)和對(duì)象的定義常見(jiàn)的程序設(shè)計(jì)方法(1)面向過(guò)程的程序設(shè)計(jì)流程化的思想,圍繞存放數(shù)據(jù)的基本變量來(lái)組織程序?qū)⒆兞康馁x值作為程序的基本操作以變量值的改變作為程序的運(yùn)行狀態(tài)以函數(shù)的調(diào)用來(lái)實(shí)現(xiàn)代碼的重用(2)面向?qū)ο蟮某绦蛟O(shè)計(jì)是按照類(lèi)和對(duì)象的思想來(lái)組織程序類(lèi)似于人類(lèi)思維模式的方法去解決客觀(guān)問(wèn)題事物——對(duì)象,類(lèi)別——類(lèi)C++語(yǔ)言程序設(shè)計(jì)47.1類(lèi)和對(duì)象的定義面向?qū)ο蟮某绦蛟O(shè)計(jì)每個(gè)對(duì)象都擁有自己的“狀態(tài)”和“行為”?!盃顟B(tài)”在程序設(shè)計(jì)中稱(chēng)為數(shù)據(jù)、變量或?qū)傩浴靶袨椤痹诔绦蛟O(shè)計(jì)中稱(chēng)為方法或函數(shù)。各對(duì)象間通過(guò)方法的調(diào)用實(shí)現(xiàn)交互,完成一定的任務(wù)。用“類(lèi)”將數(shù)據(jù)和對(duì)數(shù)據(jù)的操作封裝在一個(gè)單獨(dú)的數(shù)據(jù)結(jié)構(gòu)中程序的模塊化程度更高,具有更強(qiáng)的描述客觀(guān)事物的能力,適合大型的程序開(kāi)發(fā)。C++語(yǔ)言程序設(shè)計(jì)57.1類(lèi)和對(duì)象的定義舉例:學(xué)籍管理軟件需要管理大量的學(xué)生,每個(gè)學(xué)生都是一個(gè)對(duì)象學(xué)生都有一些共同的屬性特征和行為動(dòng)作學(xué)生是一類(lèi)事物,因此,可以從這一組具有相同屬性和行為的學(xué)生對(duì)象中抽象出一個(gè)學(xué)生類(lèi)。C++語(yǔ)言程序設(shè)計(jì)6學(xué)生類(lèi)方法屬性張三走,學(xué)習(xí)男,23對(duì)象類(lèi)李四走,學(xué)習(xí)男,20對(duì)象……7.1類(lèi)和對(duì)象的定義學(xué)生類(lèi)舉例C++語(yǔ)言程序設(shè)計(jì)7Student設(shè)置成績(jī)學(xué)生信息輸出學(xué)號(hào)姓名年齡成績(jī)學(xué)生類(lèi)方法屬性數(shù)據(jù)成員(DataMembers)成員函數(shù)(MemberFunctions)7.1類(lèi)和對(duì)象的定義對(duì)比結(jié)構(gòu)類(lèi)型C++語(yǔ)言程序設(shè)計(jì)8classStudent//類(lèi)的定義{private: intid; charname[20]; intage; floatscore;public: voidsetscore(); voidprintstu();};

structstudent//結(jié)構(gòu)體類(lèi)型定義

{

intid;stringname;intage;floatscore;

};類(lèi)和結(jié)構(gòu)體都是一種自定義數(shù)據(jù)類(lèi)型,有許多相似的地方,但是類(lèi)的成員默認(rèn)是private的,不可以任意訪(fǎng)問(wèn)7.1類(lèi)和對(duì)象的定義使用類(lèi)定義對(duì)象C++語(yǔ)言程序設(shè)計(jì)9classstudenta;a:student類(lèi)型的變量,稱(chēng)為對(duì)象class可省略通過(guò)對(duì)象調(diào)用公有接口函數(shù)實(shí)現(xiàn)一定的功能。a.setscore();a.printstu();7.1類(lèi)和對(duì)象的定義類(lèi)的聲明具體說(shuō)明類(lèi)的組成,聲明類(lèi)的語(yǔ)法形式C++語(yǔ)言程序設(shè)計(jì)10class類(lèi)名稱(chēng){public:

公有成員protected:

保護(hù)型成員private:

私有成員};//注意最后一定要有分號(hào)數(shù)據(jù)成員成員函數(shù)7.1類(lèi)和對(duì)象的定義私有(private)成員(默認(rèn))只允許本類(lèi)的成員函數(shù)來(lái)訪(fǎng)問(wèn)公有(public)成員類(lèi)對(duì)外的接口,在類(lèi)聲明和類(lèi)(函數(shù))實(shí)現(xiàn)之后,類(lèi)的對(duì)象可以訪(fǎng)問(wèn)公有成員。保護(hù)型(protected)成員可訪(fǎng)問(wèn)性和私有成員的性質(zhì)相似,在學(xué)習(xí)“繼承”時(shí)再理解。C++語(yǔ)言程序設(shè)計(jì)117.1類(lèi)和對(duì)象的定義C++語(yǔ)言程序設(shè)計(jì)12關(guān)于訪(fǎng)問(wèn)控制屬性,注意:三種訪(fǎng)問(wèn)控制屬性順序習(xí)慣將公有類(lèi)型放在最前面可以按任意次序出現(xiàn),也可以不出現(xiàn),可以多次出現(xiàn)一個(gè)成員只能具有一種訪(fǎng)問(wèn)控制屬性。如果不寫(xiě)訪(fǎng)問(wèn)控制屬性關(guān)鍵字默認(rèn)的是private數(shù)據(jù)成員一般情況聲明為私有成員(封裝性較好)函數(shù)成員應(yīng)該有一些公有的函數(shù)成員,作為對(duì)外的接口,否則別的代碼無(wú)法訪(fǎng)問(wèn)類(lèi)7.1類(lèi)和對(duì)象的定義C++語(yǔ)言程序設(shè)計(jì)13//Clock.hclassClock //類(lèi)的聲明{public:voidSetTime(intnewH,intnewM,intnewS);voidShowTime();private:intHour;intMinute;intSecond;}; 一般將類(lèi)的聲明單獨(dú)寫(xiě)到擴(kuò)展名為.h的頭文件中7.1類(lèi)和對(duì)象的定義C++語(yǔ)言程序設(shè)計(jì)14類(lèi)的實(shí)現(xiàn)類(lèi)的成員函數(shù)描述的是類(lèi)的行為或操作。函數(shù)的原型聲明要在類(lèi)的主體中,而函數(shù)的具體實(shí)現(xiàn)一般寫(xiě)在類(lèi)聲明之外。定義類(lèi)的成員函數(shù)成員函數(shù)可以訪(fǎng)問(wèn)本類(lèi)的任意成員!返回值類(lèi)型類(lèi)名::成員函數(shù)名(參數(shù)表){函數(shù)體}作用域操作符表示函數(shù)屬于哪個(gè)類(lèi)7.1類(lèi)和對(duì)象的定義C++語(yǔ)言程序設(shè)計(jì)15類(lèi)的實(shí)現(xiàn)舉例//實(shí)現(xiàn)類(lèi)成員函數(shù)的源文件:Clock.cpp#include"Clock.h"voidClock::SetTime(intnewH,intnewM,intnewS)//SetTime()函數(shù)定義{

Hour=newH;Minute=newM;Second=newS;}voidClock::ShowTime() //ShowTime()函數(shù)定義{

cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}一般將類(lèi)的實(shí)現(xiàn)單獨(dú)寫(xiě)到擴(kuò)展名為.cpp的原文件中文件名同類(lèi)的聲明文件名一致7.1類(lèi)和對(duì)象的定義C++語(yǔ)言程序設(shè)計(jì)16類(lèi)的成員函數(shù)還可以有多種形態(tài)——參數(shù)帶默認(rèn)值classClock{public:voidSetTime(intnewH=0,intnewM=0,intnews=0);voidShowTime();private:intHour;

intMinute;

intSecond;};7.1類(lèi)和對(duì)象的定義C++語(yǔ)言程序設(shè)計(jì)17類(lèi)的成員函數(shù)還可以有多種形態(tài)——函數(shù)實(shí)現(xiàn)直接放在類(lèi)的聲明中classClock{public:

voidSetTime(intnewH=0,intnewM=0,intnews=0);voidShowTime(){

cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}

private:intHour;

intMinute;

intSecond;};7.1類(lèi)和對(duì)象的定義C++語(yǔ)言程序設(shè)計(jì)18類(lèi)的成員函數(shù)還可以有多種形態(tài)——函數(shù)重載classClock{public:

voidSetTime(intnewH=0,intnewM=0,intnews=0);voidShowTime(){

cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}

voidShowTime(intn){ cout<<Hour<<“時(shí)”<<Minute<<“分”<<Second<<“秒”<<endl;}private:intHour,Minute,Second;};7.1類(lèi)和對(duì)象的定義C++語(yǔ)言程序設(shè)計(jì)19對(duì)象的定義和使用對(duì)象,又稱(chēng)為類(lèi)的實(shí)例類(lèi)的成員是抽象的,對(duì)象的成員才是具體的類(lèi)聲明中的數(shù)據(jù)成員一定不能有具體的屬性值只有對(duì)象的成員才會(huì)有具體的屬性值聲明了類(lèi)及其對(duì)象,在類(lèi)的外部就可以訪(fǎng)問(wèn)對(duì)象的公有成員了。公有成員可以是數(shù)據(jù)成員,也可以是函數(shù)成員定義一個(gè)對(duì)象和定義一個(gè)一般變量相同,語(yǔ)法形式為:類(lèi)名稱(chēng)

對(duì)象名稱(chēng);7.1類(lèi)和對(duì)象的定義#include“Clock.h”voidmain(){

Clockmyclock;myclock.SetTime(12,5,0);myclock.ShowTime();}C++語(yǔ)言程序設(shè)計(jì)207.1類(lèi)和對(duì)象的定義類(lèi)的作用域類(lèi)作用域是指類(lèi)定義和相應(yīng)的成員函數(shù)定義的范圍,通俗地稱(chēng)為類(lèi)的內(nèi)部。

C++認(rèn)為一個(gè)類(lèi)的全部成員都是一個(gè)整體的相關(guān)部分。一個(gè)類(lèi)的所有成員位于這個(gè)類(lèi)的作用域內(nèi),在該范圍內(nèi),一個(gè)類(lèi)的成員函數(shù)對(duì)本類(lèi)的其它成員具有無(wú)限制的訪(fǎng)問(wèn)權(quán)。

C++語(yǔ)言程序設(shè)計(jì)21voidClock::SetTime(intnewH,intnewM,intnewS)//SetTime()函數(shù)定義{Hour=newH;Minute=newM;Second=newS;}7.1類(lèi)和對(duì)象的定義類(lèi)的可見(jiàn)性類(lèi)名實(shí)際是個(gè)類(lèi)型名,允許類(lèi)與其他類(lèi)型變量或其他函數(shù)同名。在類(lèi)的內(nèi)部,與類(lèi)或類(lèi)的成員同名的全局變量名或函數(shù)名不可見(jiàn)。C++語(yǔ)言程序設(shè)計(jì)22voidfunc() {Clocka; //定義對(duì)象時(shí)要用到類(lèi)名intClock=10; //變量名和類(lèi)名相同Clock++; //…};intClock(){return1;}

//定義函數(shù)

classClock{

//定義類(lèi)public:intf(){returnClock();}

//調(diào)用函數(shù)錯(cuò)誤};從程序可讀性考慮,一般不要讓類(lèi)名和其他變量、函數(shù)用同樣的名字。7.2構(gòu)造函數(shù)不同的對(duì)象如何區(qū)分?區(qū)別于其他對(duì)象的地方主要有兩個(gè),外在的區(qū)別就是對(duì)象的標(biāo)識(shí)符,即對(duì)象的名稱(chēng),而內(nèi)在的區(qū)別就是對(duì)象自身的屬性值,即數(shù)據(jù)成員的值。在定義一個(gè)對(duì)象的時(shí)候要給它分配存儲(chǔ)空間,也可以同時(shí)給它的數(shù)據(jù)成員賦初值,稱(chēng)為對(duì)象的初始化。C++程序中的對(duì)象初始化工作由一個(gè)特殊的成員函數(shù)來(lái)完成,就是構(gòu)造函數(shù)。構(gòu)造函數(shù)是類(lèi)的成員函數(shù)。

因?yàn)椴煌?lèi)型的對(duì)象的初始化工作是不一樣的,因此構(gòu)造函數(shù)從屬于某個(gè)類(lèi)的,即每個(gè)類(lèi)都要定義它自己的構(gòu)造函數(shù)。C++語(yǔ)言程序設(shè)計(jì)237.2構(gòu)造函數(shù)定義構(gòu)造函數(shù)的一般形式為:class類(lèi)名{public:

類(lèi)名(形參表); //構(gòu)造函數(shù)的原型 //類(lèi)的其它成員};類(lèi)名::類(lèi)名(形參表) //構(gòu)造函數(shù)的實(shí)現(xiàn){ //函數(shù)體}

C++語(yǔ)言程序設(shè)計(jì)247.2構(gòu)造函數(shù)定義構(gòu)造函數(shù):C++語(yǔ)言程序設(shè)計(jì)25Clock::Clock(intH,intM,intS){

Hour=H;Minute=M;Second=S;}classClock{public:Clock(intH,intM,intS); //構(gòu)造函數(shù)

voidSetTime(intnewH,intNewM,intnewS);

voidShowTime();private:

intHour;

intMinute;

intSecond;};ClockMyClock(120,1);//正確MyClock.ShowTime(); Clockb; //錯(cuò)誤!7.2構(gòu)造函數(shù)構(gòu)造函數(shù)的特點(diǎn):函數(shù)名:與類(lèi)名相同訪(fǎng)問(wèn)屬性:構(gòu)造函數(shù)一定是公有函數(shù)。是類(lèi)的成員函數(shù),可以直接訪(fǎng)問(wèn)類(lèi)的所有數(shù)據(jù)成員。具有一般函數(shù)的特點(diǎn):函數(shù)可以帶默認(rèn)形參值,也可以重載。

哪一點(diǎn)除外?C++語(yǔ)言程序設(shè)計(jì)26構(gòu)造函數(shù)沒(méi)有返回類(lèi)型,不能返回值7.2構(gòu)造函數(shù)構(gòu)造函數(shù)的特點(diǎn):每個(gè)類(lèi)都會(huì)存在構(gòu)造函數(shù)不管用戶(hù)在定義是是否定義。若用戶(hù)未定義構(gòu)造函數(shù),編譯器會(huì)自動(dòng)添加默認(rèn)構(gòu)造函數(shù)若用戶(hù)定義了構(gòu)造函數(shù),編譯器則不會(huì)自動(dòng)添加C++語(yǔ)言程序設(shè)計(jì)27classClock{public:

voidSetTime();voidShowTime();private:intHour,Minute,Second;};classClock{public:

Clock::Clock()//默認(rèn)構(gòu)造函數(shù){}

voidSetTime();voidShowTime();private:intHour,Minute,Second;};7.2構(gòu)造函數(shù)構(gòu)造函數(shù)的重載:C++語(yǔ)言程序設(shè)計(jì)28#include<iostream>usingnamespacestd;classTdate{public:Tdate(); //第一個(gè)構(gòu)造函數(shù)

Tdate(intd); //第二個(gè)構(gòu)造函數(shù)

Tdate(intm,intd); //第三個(gè)構(gòu)造函數(shù)

Tdate(intm,intd,inty);

//第四個(gè)構(gòu)造函數(shù)private:

intmonth;

intday;

intyear;};7.2構(gòu)造函數(shù)構(gòu)造函數(shù)的重載:C++語(yǔ)言程序設(shè)計(jì)29Tdate::Tdate(){month=4;day=15;year=1995;cout<<month<<"/"<<day<<"/"<<year<<endl;}Tdate::Tdate(intd){month=4;day=d;year=1996;cout<<month<<"/"<<day<<"/"<<year<<endl;}Tdate::Tdate(intm,intd){month=m;day=d;year=1997;cout<<month<<"/"<<day<<"/"<<year<<endl;}Tdate::Tdate(intm,intd,inty){month=m;day=d;year=y;cout<<month<<"/"<<day<<"/"<<year<<endl;}voidmain(){//開(kāi)始用4種方式構(gòu)造4個(gè)對(duì)象

Tdateaday;

Tdatebday(10);Tdatecday(2,12);Tdatedday(1,2,1998);}7.2構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)(也稱(chēng)為拷貝構(gòu)造函數(shù))復(fù)制構(gòu)造函數(shù)的形參是類(lèi)的對(duì)象的引用Clock(constClock&a){……}復(fù)制構(gòu)造函數(shù)與原來(lái)的構(gòu)造函數(shù)實(shí)現(xiàn)了函數(shù)的重載。自動(dòng)生成特點(diǎn)如果在類(lèi)定義時(shí)沒(méi)有定義復(fù)制構(gòu)造函數(shù),系統(tǒng)會(huì)生成默認(rèn)的復(fù)制構(gòu)造函數(shù)。默認(rèn)的復(fù)制構(gòu)造函數(shù)完成所有數(shù)據(jù)成員的復(fù)制何時(shí)會(huì)自動(dòng)執(zhí)行復(fù)制構(gòu)造函數(shù):通過(guò)“=”復(fù)制對(duì)象時(shí)對(duì)象作為函數(shù)的參數(shù),函數(shù)調(diào)用時(shí)函數(shù)返回對(duì)象時(shí)C++語(yǔ)言程序設(shè)計(jì)307.2構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)(也稱(chēng)為拷貝構(gòu)造函數(shù))C++語(yǔ)言程序設(shè)計(jì)31classTdate{public:

Tdate(constTdate&);

……};Tdatea;Tdateb=a;voidfun(Tdatex){……}fun(a);voidfun2(){Tdatex;…….returnx;}fun2();Tdatex=fun2();7.3析構(gòu)函數(shù)與構(gòu)造函數(shù)相反,當(dāng)對(duì)象生存期結(jié)束時(shí),需要調(diào)用析構(gòu)函數(shù),釋放對(duì)象所占的內(nèi)存空間。特點(diǎn):訪(fǎng)問(wèn)屬性:公有成員函數(shù)函數(shù)名:在類(lèi)名前加“~”構(gòu)成無(wú)參數(shù)、無(wú)返回值。能否重載?自動(dòng)生成析構(gòu)函數(shù)是在對(duì)象生存期即將結(jié)束的時(shí)刻由系統(tǒng)自動(dòng)調(diào)用的。如果程序員沒(méi)有定義析構(gòu)函數(shù),系統(tǒng)將自動(dòng)生成和調(diào)用一個(gè)默認(rèn)析構(gòu)函數(shù)。C++語(yǔ)言程序設(shè)計(jì)327.3析構(gòu)函數(shù)#include<iostream>usingnamespacestd;classstudent{public:

student(char*);student(student&);

~student();voidprintstu();private: char*name;};C++語(yǔ)言程序設(shè)計(jì)33student::student(char*c){

cout<<"Constructing..."<<endl;name=newchar[strlen(c)+1];

strcpy(name,c);}student::student(student&s)//復(fù)制構(gòu)造函數(shù){

cout<<"CopyConstructing..."<<endl;name=newchar[strlen()+1;strcpy(name,);//復(fù)制字符串}7.3析構(gòu)函數(shù)student::~student(){cout<<"Destructing..."<<endl;delete[]name;}voidstudent::printstu(){cout<<"姓名:"<<name<<endl;}voidmain(){studentstu("wang");stu.printstu();}C++語(yǔ)言程序設(shè)計(jì)347.4面向?qū)ο蟪绦蛟O(shè)計(jì)類(lèi)的封裝性對(duì)具體問(wèn)題進(jìn)行概括,抽象出類(lèi)的數(shù)據(jù)成員和函數(shù)成員,將這些數(shù)據(jù)和代碼相結(jié)合,形成一個(gè)有機(jī)的整體將數(shù)據(jù)與操作數(shù)據(jù)的行為進(jìn)行有機(jī)結(jié)合,這就是封裝性(Encapsulation)C++語(yǔ)言提供類(lèi)來(lái)實(shí)現(xiàn)封裝類(lèi)是屬性和操作的結(jié)合體,并且在定義類(lèi)的屬性和操作時(shí),規(guī)定了它們的可見(jiàn)性。通過(guò)封裝將一部分成員作為類(lèi)與外部的接口,而將其他成員隱藏起來(lái),以防外界的干擾和誤操作,使程序不同模塊之間的相互影響減小到最低限度C++語(yǔ)言程序設(shè)計(jì)357.4面向?qū)ο蟪绦蛟O(shè)計(jì)軟件工程建立一個(gè)大型的軟件系統(tǒng)可不是一件簡(jiǎn)單的事情,它是一項(xiàng)大工程,人們稱(chēng)它為軟件工程,它研究如何建立大型軟件系統(tǒng):可靠性;成本效益好;可理解性;可維護(hù)性。C++語(yǔ)言程序設(shè)計(jì)367.4面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)是面向?qū)ο笏枷朐谲浖こ填I(lǐng)域的全面應(yīng)用,包括:面向?qū)ο蠓治觯∣OA),面向?qū)ο笤O(shè)計(jì)(OOD),面向?qū)ο缶幊蹋∣OP)等。面向?qū)ο蠓治鲭A段要把問(wèn)題的范圍定義清楚,分析系統(tǒng)需求,把實(shí)際中不重要的東西忽略,對(duì)所關(guān)心的問(wèn)題建立一個(gè)模型。設(shè)計(jì)是在分析的基礎(chǔ)上進(jìn)一步加工,OOD階段是對(duì)OOA模型的修改和補(bǔ)充,采用一致的概念、原則和表示法,二者沒(méi)有嚴(yán)格的階段劃分,但設(shè)計(jì)階段側(cè)重于考慮與實(shí)現(xiàn)有關(guān)的細(xì)節(jié)。到了OOP階段,OOD階段設(shè)計(jì)的類(lèi)被具體的程序設(shè)計(jì)語(yǔ)言的類(lèi)所實(shí)現(xiàn)。C++語(yǔ)言程序設(shè)計(jì)37C++語(yǔ)言程序設(shè)計(jì)編程技能b38(一)對(duì)象數(shù)組C++語(yǔ)言程序設(shè)計(jì)39數(shù)組元素類(lèi)型不僅可以是基本數(shù)據(jù)類(lèi)型也可以是自定義的類(lèi)型:結(jié)構(gòu)類(lèi)型,類(lèi)類(lèi)型等對(duì)象數(shù)組的元素是對(duì)象,不僅具有數(shù)據(jù)成員,還有函數(shù)成員,可以通過(guò)數(shù)組元素調(diào)用成員函數(shù)。舉例:學(xué)生類(lèi)的對(duì)象數(shù)組studentarr[100];(一)對(duì)象數(shù)組#include<iostream>#include<string>usingnamespacestd;classstudent{private:

stringname;

public:voidset(char*);voidprintstu(){cout<<"姓名:"<<name<<endl;}};C++語(yǔ)言程序設(shè)計(jì)40voidstudent::set(char*c){name=c;}voidmain(){studentstu[5];//對(duì)象數(shù)組stu[0].set("wang");//設(shè)置數(shù)組中每個(gè)對(duì)象stu[1].set("Li");stu[2].set("zhao");stu[3].set("guo");stu[4].set("meng");for(inti=0;i<5;i++)stu[i].printstu(); //顯示每個(gè)對(duì)象}(一)對(duì)象數(shù)組#include<iostream>#include<string>usingnamespacestd;classstudent{private:

stringname;

public:

student(char*c){set(c);}voidset(char*);voidprintstu(){cout<<"姓名:"<<name<<endl;}};C++語(yǔ)言程序設(shè)計(jì)41voidstudent::set(char*c){name=c;}voidmain(){studentstu[5]={

student("wang"), student("Li"); student("zhao"); student("guo"); student("meng");}for(inti=0;i<5;i++)stu[i].printstu(); //顯示每個(gè)對(duì)象}(一)對(duì)象數(shù)組#include<iostream>#include<string>usingnamespacestd;classstudent{private:

stringname;

public:

student(char*c){set(c);}

student(){name=‘’;}voidset(char*);voidprintstu(){cout<<"姓名:"<<name<<endl;}};C++語(yǔ)言程序設(shè)計(jì)42voidstudent::set(char*c){name=c;}voidmain(){studentstu[5]={

student("wang"), student("Li"); student("zhao");}

stu[3].set("guo");stu[4].set("meng");for(inti=0;i<5;i++)stu[i].printstu(); //顯示每個(gè)對(duì)象}student(char*c=“”){set(c);}定義數(shù)組時(shí)始終要記住:自動(dòng)調(diào)用構(gòu)造函數(shù)對(duì)所有對(duì)象進(jìn)行初始化(二)對(duì)象作為普通函數(shù)的參數(shù)與返回值C++語(yǔ)言程序設(shè)計(jì)43在C++中,類(lèi)是一個(gè)自定義的數(shù)據(jù)類(lèi)型,對(duì)象是該數(shù)據(jù)類(lèi)型的一個(gè)變量。studentstu;inti;類(lèi)類(lèi)型也可以作為一個(gè)函數(shù)的參數(shù)類(lèi)型和返回值類(lèi)型studentf(students){……..}(二)對(duì)象作為普通函數(shù)的參數(shù)與返回值C++語(yǔ)言程序設(shè)計(jì)44類(lèi)類(lèi)型作為函數(shù)的參數(shù)類(lèi)型時(shí):實(shí)參傳遞給形參自動(dòng)調(diào)用復(fù)制構(gòu)造函數(shù)voidsomeFunc(Tdatesomeday){someday.print();}intmain(){

Tdates(2003,15,2);someFunc(s);

……}classTdate{public:voidTdate(int,int,int);

voidPrint();private:intmonth;intday;intyear;};(二)對(duì)象作為普通函數(shù)的參數(shù)與返回值C++語(yǔ)言程序設(shè)計(jì)45類(lèi)類(lèi)型作為函數(shù)的返回類(lèi)型時(shí):return返回對(duì)象時(shí)自動(dòng)執(zhí)行復(fù)制構(gòu)造函數(shù)TdatesomeFunc(Tdatesomeday){returnsomeday;}intmain(){

Tdates(2003,15,2);someFunc(s);

……}classTdate{public:voidTdate(int,int,int);

voidPrint();private:intmonth;intday;intyear;};(二)對(duì)象作為普通函數(shù)的參數(shù)與返回值C++語(yǔ)言程序設(shè)計(jì)46類(lèi)類(lèi)型作為函數(shù)的返回類(lèi)型時(shí):return返回對(duì)象時(shí)自動(dòng)執(zhí)行復(fù)制構(gòu)造函數(shù)需要注意的是,函數(shù)返回后直接初始化另一個(gè)對(duì)象時(shí),僅執(zhí)行一次復(fù)制構(gòu)造函數(shù)TdatesomeFunc(Tdatesomeday){returnsomeday;}intmain(){

Tdates(2003,15,2);Tdatet=someFunc(s);

……}(二)對(duì)象作為普通函數(shù)的參數(shù)與返回值C++語(yǔ)言程序設(shè)計(jì)47類(lèi)類(lèi)型的指針或引用作為函數(shù)的參數(shù)類(lèi)型或返回類(lèi)型時(shí):由于傳遞的是指針,所以不會(huì)執(zhí)行復(fù)制構(gòu)造函數(shù)Tdate&someFunc(Tdate&someday){returnsomeday;}intmain(){

Tdates(2003,15,2);Tdatet=someFunc(s);

……}Tdate*someFunc(Tdate*someday){returnsomeday;}intmain(){

Tdates(2003,15,2);Tdatet

=*someFunc(&s);

……}(三)對(duì)象指針和堆對(duì)象C++語(yǔ)言程序設(shè)計(jì)48對(duì)象相當(dāng)于變量,所以可以定義對(duì)象指針或?qū)ο笠?,或?dòng)態(tài)地從堆中申請(qǐng)空間來(lái)創(chuàng)建一個(gè)對(duì)象。Clockc; //在棧中分配Clock型存儲(chǔ)空間Clock*pc1=newClock; //在堆中分配Clock型存儲(chǔ)空間Clock*pc2=&c;Clock&rc=*pc1//創(chuàng)建對(duì)象的引用(三)對(duì)象指針和堆對(duì)象C++語(yǔ)言程序設(shè)計(jì)49使用對(duì)象指針訪(fǎng)問(wèn)對(duì)象的成員,要使用“->”運(yùn)算符。語(yǔ)法形式為:

對(duì)象指針名->公有成員;voidmain(){Clock*pmyclock=newClock;pmyclock->SetTime(12,5,0);pmyclock->ShowTime();deletepmyclock;}classClock{public:Clock(intH,intM,intS); //構(gòu)造函數(shù)

voidSetTime(intnewH,intNewM,intnewS);

voidShowTime();private:

intHour;

intMinute;

intSecond;};刨根問(wèn)底cC++語(yǔ)言程序設(shè)計(jì)50(I)

this指針C++語(yǔ)言程序設(shè)計(jì)51在類(lèi)的外部訪(fǎng)問(wèn)類(lèi)成員必須通過(guò)對(duì)象來(lái)調(diào)用。在成員函數(shù)內(nèi)部,訪(fǎng)問(wèn)數(shù)據(jù)成員或成員函數(shù)時(shí)并沒(méi)有看到這些成員屬于哪個(gè)對(duì)象。voidmain(){Clocks;Clockt;s.SetTime(12,5,0);t.SetTime(10,30,30);s.ShowTime();t.ShowTime();}voidClock::SetTime(intH,intM,intS){

Hour=H;

Minute=M;

Second=S;}成員函數(shù)又是如何識(shí)別Hour、Minute和Second屬于哪個(gè)對(duì)象呢?(I)

this指針C++語(yǔ)言程序設(shè)計(jì)52在對(duì)象調(diào)用s.SetTime(12,5,0)時(shí),成員函數(shù)除了接收3個(gè)實(shí)參外,還接收了一個(gè)對(duì)象s的地址。雖然我們看到的只有3個(gè)參數(shù),但真正的參數(shù)是4個(gè),其中第一個(gè)參數(shù)是隱含的,這個(gè)參數(shù)的數(shù)據(jù)類(lèi)型為Clock*,形式參數(shù)的名稱(chēng)為this。因此,類(lèi)Clock的成員函數(shù)SetTime()的原型實(shí)際上是:voidSetTime(Clock*this,intH,intM,intS)隱含參數(shù)(I)

this指針C++語(yǔ)言程序設(shè)計(jì)53類(lèi)Clock的成員函數(shù)SetTime()的實(shí)現(xiàn)也可以如下:一般我們編寫(xiě)代碼時(shí)省去了this->voidClock::SetTime(

intH,intM,intS){

this->Hour=H;

this->Minute=M;

this->Second=S;}this指針保存了調(diào)用此成員函數(shù)的對(duì)象地址(II)

復(fù)制構(gòu)造函數(shù)C++語(yǔ)言程序設(shè)計(jì)54復(fù)制構(gòu)造函數(shù)是否可有可無(wú)?有些情況下,可以不寫(xiě),使用默認(rèn)的復(fù)制構(gòu)造函數(shù)但有些情況下,必須要編寫(xiě)——深拷貝復(fù)制構(gòu)造函數(shù)何時(shí)執(zhí)行?通過(guò)“=”復(fù)制,初始化新對(duì)象時(shí)對(duì)象作為函數(shù)的參數(shù),函數(shù)調(diào)用時(shí)函數(shù)返回對(duì)象時(shí)若類(lèi)中含有指針成員,執(zhí)行默認(rèn)復(fù)制構(gòu)造函數(shù)時(shí)(淺拷貝):會(huì)將一個(gè)原對(duì)象的指針成員復(fù)制到新對(duì)象的指針成員若指針成員指向堆內(nèi)存,在原對(duì)象生存期結(jié)束時(shí),析構(gòu)函數(shù)將堆內(nèi)存釋放,則新對(duì)象的指針成員會(huì)變?yōu)閼覓熘羔槪聦?duì)象生存期結(jié)束時(shí),析構(gòu)函數(shù)將出現(xiàn)錯(cuò)誤!(II)

復(fù)制構(gòu)造函數(shù)C++語(yǔ)言程序設(shè)計(jì)55#include<iostream>usingnamespacestd;classstudent{public:

student(char*);

~student();voidprintstu();private: char*name;};student::student(char*c){

cout<<"Constructing..."<<endl;name=newchar[strlen(c)+1];

strcpy(name,c);}student::~student(){cout<<"Destructing..."<<endl;delete[]name;}voidstudent::printstu(){cout<<"姓名:"<<name<<endl;}(II)

復(fù)制構(gòu)造函數(shù)C++語(yǔ)言程序設(shè)計(jì)56voidmain(){studentstu("wang");stu.printstu();}沒(méi)有錯(cuò)誤!voidmain(){studentstu("wang");

st

溫馨提示

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