c++程序設(shè)計(jì)第7章-類(lèi)與對(duì)象課件_第1頁(yè)
c++程序設(shè)計(jì)第7章-類(lèi)與對(duì)象課件_第2頁(yè)
c++程序設(shè)計(jì)第7章-類(lèi)與對(duì)象課件_第3頁(yè)
c++程序設(shè)計(jì)第7章-類(lèi)與對(duì)象課件_第4頁(yè)
c++程序設(shè)計(jì)第7章-類(lèi)與對(duì)象課件_第5頁(yè)
已閱讀5頁(yè),還剩91頁(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)介

第7章類(lèi)與對(duì)象(一)面向?qū)ο蟮幕靖拍铑?lèi)的定義創(chuàng)建對(duì)象構(gòu)造函數(shù)與析構(gòu)函數(shù)對(duì)象數(shù)組this指針靜態(tài)成員友元類(lèi)的作用域12/19/20221類(lèi)和對(duì)象第7章類(lèi)與對(duì)象(一)面向?qū)ο蟮幕靖拍?2/16/2022面向?qū)ο蟮幕靖拍?1.面向?qū)ο笈c面向過(guò)程的區(qū)別:我要開(kāi)車(chē)去新疆面向過(guò)程我開(kāi)車(chē),我過(guò)陜西,我過(guò)蘭州……面向?qū)ο笪颐钴?chē)去新疆車(chē)怎么去我不關(guān)心(封裝)12/19/20222類(lèi)和對(duì)象面向?qū)ο蟮幕靖拍?1.面向?qū)ο笈c面向過(guò)程的區(qū)別:12/12.類(lèi)(class)和對(duì)象(object)的概念對(duì)象是系統(tǒng)中用來(lái)描述客觀事務(wù)的一個(gè)實(shí)體,它通過(guò)“屬性attribute(數(shù)據(jù)成員)”和“行為behavior(成員函數(shù)、方法)”來(lái)分別實(shí)體的靜態(tài)屬性和動(dòng)態(tài)屬性。類(lèi)是具有共同屬性和行為的對(duì)象的抽象。對(duì)象是類(lèi)的實(shí)例(instance)。學(xué)生A抽象類(lèi)對(duì)象學(xué)生學(xué)號(hào)姓名學(xué)習(xí)()學(xué)生A學(xué)號(hào)=101姓名=TOM實(shí)例化12/19/20223類(lèi)和對(duì)象2.類(lèi)(class)和對(duì)象(object)的概念對(duì)象是系統(tǒng)中*3.類(lèi)(對(duì)象)之間的關(guān)系關(guān)聯(lián)關(guān)系教師姓名教學(xué)(學(xué)生A)學(xué)生學(xué)號(hào)姓名學(xué)習(xí)()學(xué)校12/19/20224類(lèi)和對(duì)象*3.類(lèi)(對(duì)象)之間的關(guān)系關(guān)聯(lián)關(guān)系教師姓名教學(xué)(學(xué)生A)繼承關(guān)系(一般和特殊)xx是一種XX類(lèi)的繼承層次12/19/20225類(lèi)和對(duì)象繼承關(guān)系(一般和特殊)xx是一種XX類(lèi)的繼承層次12/16/聚合關(guān)系(整體和部分)隊(duì)長(zhǎng)隊(duì)員球隊(duì)聚集頭身體人組合12/19/20226類(lèi)和對(duì)象聚合關(guān)系(整體和部分)隊(duì)長(zhǎng)隊(duì)員球隊(duì)聚集頭身體人組合1多態(tài)車(chē)go()大卡車(chē)go()小汽車(chē)go()12/19/20227類(lèi)和對(duì)象多態(tài)車(chē)go()大卡車(chē)go()小汽車(chē)go()12/16/202面向?qū)ο蟮脑O(shè)計(jì)思想有那些類(lèi)(對(duì)象)?每一種類(lèi)(對(duì)象)有哪些屬性和方法?類(lèi)(對(duì)象)之間有哪些關(guān)系?12/19/20228類(lèi)和對(duì)象面向?qū)ο蟮脑O(shè)計(jì)思想有那些類(lèi)(對(duì)象)?12/16/20228類(lèi)類(lèi)的定義類(lèi)的定義格式一般分為說(shuō)明部分和實(shí)現(xiàn)部分。說(shuō)明部分:是用來(lái)說(shuō)明類(lèi)中的成員,包含數(shù)據(jù)成員的說(shuō)明和成員函數(shù)的說(shuō)明。成員函數(shù)是用來(lái)對(duì)數(shù)據(jù)成員進(jìn)行操作的,也稱(chēng)為“方法”。實(shí)現(xiàn)部分:是用來(lái)對(duì)成員函數(shù)進(jìn)行定義。12/19/20229類(lèi)和對(duì)象類(lèi)的定義類(lèi)的定義格式一般分為說(shuō)明部分和實(shí)現(xiàn)部分。12/16/說(shuō)明部分的一般格式class類(lèi)類(lèi)型名{

public:公有成員說(shuō)明

private:

私有成員說(shuō)明};私有訪問(wèn)權(quán)限,為默認(rèn)值,可缺省公有訪問(wèn)權(quán)限除本類(lèi)中的成員函數(shù)及友元外,其他類(lèi)外函數(shù)不能訪問(wèn)。程序中的任何函數(shù)都可訪問(wèn)12/19/202210類(lèi)和對(duì)象說(shuō)明部分的一般格式class類(lèi)類(lèi)型名私有訪問(wèn)權(quán)限,為默認(rèn)值例如:定義一個(gè)Person類(lèi),設(shè)Person具有的特征:屬性(姓名、年齡、性別),方法(輸出一個(gè)人的屬性);則對(duì)應(yīng)著有4個(gè)成員:三個(gè)數(shù)據(jù)成員,一個(gè)成員函數(shù)。三個(gè)數(shù)據(jù)成員定義為私有成員,print成員函數(shù)定義為公有成員。則有:classCPerson{

public:voidprint();

private:charname[10];intage;charsex;};類(lèi)名通常用C字母開(kāi)始,以區(qū)別其他標(biāo)識(shí)符12/19/202211類(lèi)和對(duì)象例如:定義一個(gè)Person類(lèi),設(shè)Person具有的特征:屬性類(lèi)的實(shí)現(xiàn)部分類(lèi)的實(shí)現(xiàn)部分即定義它的成員函數(shù),如在類(lèi)說(shuō)明內(nèi)部定義,則方式與定義普通函數(shù)大體相同。若在類(lèi)說(shuō)明外部定義成員函數(shù),則應(yīng)使用類(lèi)域運(yùn)算符::(p21)指明該函數(shù)是哪個(gè)類(lèi)中的成員函數(shù)。格式為:函數(shù)類(lèi)型類(lèi)名::成員函數(shù)名(形參表){函數(shù)體;}voidCPerson::print(){cout<<name<<age<<sex<<endl;}除特殊指明外,成員函數(shù)操作的是同一對(duì)象中的數(shù)據(jù)成員。不同的類(lèi)允許有相同名稱(chēng)的成員函數(shù),因此,在類(lèi)外定義成員函數(shù)的實(shí)現(xiàn)時(shí),必須在成員函數(shù)名前加上所屬類(lèi)名和作用域操作符“::”。12/19/202212類(lèi)和對(duì)象類(lèi)的實(shí)現(xiàn)部分類(lèi)的實(shí)現(xiàn)部分即定義它的成員函數(shù),如在類(lèi)說(shuō)明內(nèi)部定當(dāng)成員函數(shù)的規(guī)模較小時(shí),可在類(lèi)中定義成員函數(shù),成為內(nèi)聯(lián)成員函數(shù)。例:classCDate{

public:voidsetDate(intm,intd,inty)//置日期值{ month=m;day=d;year=y;} voidprint();

private:intmonth,day,year;};voidCDate::print(){cout<<year<<'.'<<month<<'.'<<day<<endl;}若將內(nèi)聯(lián)成員函數(shù)定義在類(lèi)說(shuō)明之外則要加上inline。內(nèi)聯(lián)成員函數(shù)12/19/202213類(lèi)和對(duì)象當(dāng)成員函數(shù)的規(guī)模較小時(shí),可在類(lèi)中定義成員函數(shù),成為內(nèi)聯(lián)成員函注意事項(xiàng)1.在類(lèi)體中不允許對(duì)所定義的數(shù)據(jù)成員進(jìn)行初始化。classCDate{public:…private:intyear(1998),month(4);…};2.類(lèi)中的數(shù)據(jù)成員的類(lèi)型可以是任意的,包括整型、浮點(diǎn)型、字符型、數(shù)組、指針和引用等,也可以是另一個(gè)類(lèi)的對(duì)象。3.習(xí)慣將類(lèi)的定義代碼放到一個(gè)頭文件中,以后若要使用則用文件包含命令包含。錯(cuò)誤testClass\CreateClass.cpp12/19/202214類(lèi)和對(duì)象注意事項(xiàng)1.在類(lèi)體中不允許對(duì)所定義的數(shù)據(jù)成員進(jìn)行初始化。錯(cuò)誤創(chuàng)建對(duì)象1.對(duì)象的定義形式為:類(lèi)名

對(duì)象名列表;

CDatedate1,date2;//定義兩個(gè)CDate類(lèi)的對(duì)象date1和date2

CDate*pDate=&date1;

//定義一個(gè)指向date1對(duì)象空間的指針pDateCDate&rDate=date2;//定義一個(gè)引用對(duì)象rDateCDatedata[3];//定義一個(gè)data對(duì)象數(shù)組,其元素類(lèi)型為CDate類(lèi)定義了一個(gè)類(lèi)只是定義了一種類(lèi)型,它并不分配空間,不能進(jìn)行操作。只有用它創(chuàng)建對(duì)象后,系統(tǒng)才為對(duì)象分配存儲(chǔ)空間。12/19/202215類(lèi)和對(duì)象創(chuàng)建對(duì)象1.對(duì)象的定義形式為:定義了一個(gè)類(lèi)只是定義了一種類(lèi)型成員的訪問(wèn)通過(guò)對(duì)象可以訪問(wèn)類(lèi)中的公有類(lèi)型數(shù)據(jù)和成員函數(shù)。其使用方式為:

對(duì)象名.成員函數(shù)名對(duì)象名.數(shù)據(jù)成員例:date1.year=2002;date1.Print();用指針訪問(wèn)對(duì)象公有成員:指針名->數(shù)據(jù)成員或指針名->成員函數(shù)(*指針名).數(shù)據(jù)成員或(*指針名).成員函數(shù)例:pDate->day=30;pDate->Print();(*pDate).day=30;(*pDate).Print();用引用訪問(wèn)對(duì)象成員:引用名.數(shù)據(jù)成員或引用名.成員函數(shù)例:rDate.year=2008;rDate.Print();12/19/202216類(lèi)和對(duì)象成員的訪問(wèn)通過(guò)對(duì)象可以訪問(wèn)類(lèi)中的公有類(lèi)型數(shù)據(jù)和成員函數(shù)。其使注意:在成員函數(shù)中訪問(wèn)成員無(wú)須加對(duì)象名來(lái)作為前綴。如:voidCDate::print(){cout<<year<<'.'<<month<<'.'<<day<<endl;}在year等成員之前不能加對(duì)象名,在定義類(lèi)時(shí),成員函數(shù)是所有對(duì)象共享的代碼,不被某一個(gè)對(duì)象獨(dú)占。也無(wú)法確定類(lèi)的對(duì)象名。注意12/19/202217類(lèi)和對(duì)象注意:注意12/16/202217類(lèi)和對(duì)象例一個(gè)完整的程序//CDate.hclassCDate{public:voidsetDate(intm,intd,inty)//置日期值{ month=m;day=d;year=y;} voidprint();private:intmonth,day,year;};voidCDate::print(){cout<<year<<'.'<<month<<'.'<<day<<endl;}12/19/202218類(lèi)和對(duì)象例一個(gè)完整的程序//CDate.h12/16/202218續(xù)例一個(gè)完整的程序#include<iostream.h>#include"CDate.h"voidmain(){CDatedate1;date1.setDate(8,5,1996);date1.print();

//cout<<date1.year<<endl;/*CDate*pDate=&date1;pDate->print();*/}testClass\testCDate.cpp12/19/202219類(lèi)和對(duì)象續(xù)例一個(gè)完整的程序#include<iostream.類(lèi)的成員函數(shù)內(nèi)聯(lián)函數(shù):指定義在類(lèi)體內(nèi)的成員函數(shù)。外聯(lián)函數(shù):指說(shuō)明在類(lèi)體內(nèi),定義在類(lèi)體外的成員函數(shù)。類(lèi)外定義的函數(shù)缺省情況下都是外聯(lián)函數(shù),用關(guān)鍵字inline

可以強(qiáng)制轉(zhuǎn)換。

對(duì)于內(nèi)聯(lián)成員函數(shù),編譯時(shí)在所有調(diào)用該函數(shù)的地方將裝入實(shí)際的函數(shù)代碼。1.內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù)12/19/202220類(lèi)和對(duì)象類(lèi)的成員函數(shù)內(nèi)聯(lián)函數(shù):指定義在類(lèi)體內(nèi)的成員函數(shù)。對(duì)于內(nèi)聯(lián)成classCDate{public:voidsetDate(intm,intd,inty)//內(nèi)聯(lián)函數(shù)之一{ month=m;day=d;year=y;}voidprint();private:intmonth,day,year;};inlinevoidCDate::print()//內(nèi)聯(lián)函數(shù)之二{cout<<year<<'.'<<month<<'.'<<day<<endl;}12/19/202221類(lèi)和對(duì)象classCDate12/16/202221類(lèi)和對(duì)象2.設(shè)置參數(shù)的缺省值函數(shù)在定義時(shí)可以預(yù)先定義出形參的缺省值。調(diào)用時(shí)如果給出實(shí)參,則用實(shí)參初始化形參,如果沒(méi)有給出實(shí)參,則采用預(yù)先定義形參的缺省值。例如:voidsetDate(intm,intd=28,inty=2008);

//缺省參數(shù)按從右往左的方式或voidsetDate(intm,intd=28,inty=2008){…}在進(jìn)行函數(shù)調(diào)用時(shí),主調(diào)函數(shù)的實(shí)參與被調(diào)函數(shù)的形參按從左到右的位置結(jié)合。TestParaDefault.cpp12/19/202222類(lèi)和對(duì)象2.設(shè)置參數(shù)的缺省值函數(shù)在定義時(shí)可以預(yù)先定義出形參的缺省值3.函數(shù)的重載函數(shù)的重載:出現(xiàn)在相同作用域的兩個(gè)函數(shù),如果具有相同的名字而形參表不同,則稱(chēng)為重載函數(shù)(overloadedfunction)。調(diào)用時(shí),會(huì)根據(jù)不同的參數(shù)表選擇對(duì)應(yīng)的成員函數(shù)。重載函數(shù),必須:函數(shù)名相同,函數(shù)的作用域相同,函數(shù)的參數(shù)個(gè)數(shù)或參數(shù)類(lèi)型不同。使用重載函數(shù)時(shí)應(yīng)注意:⑴只有返回值不同,不能成為重載函數(shù)。

intmax(inta,intb);doublemax(inta,intb); //錯(cuò)誤⑵使用帶缺省值的函數(shù)時(shí),可能引發(fā)錯(cuò)誤。如:

intmax(inta,intb=0);intmax(intc);當(dāng)用一個(gè)實(shí)參調(diào)用該函數(shù)時(shí),如max(2),則會(huì)出現(xiàn)調(diào)用歧義性12/19/202223類(lèi)和對(duì)象3.函數(shù)的重載函數(shù)的重載:出現(xiàn)在相同作用域的兩個(gè)函數(shù),如果構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)都是類(lèi)的成員函數(shù),是特殊的成員函數(shù),不能被調(diào)用而由系統(tǒng)自動(dòng)調(diào)用/執(zhí)行。構(gòu)造函數(shù)名與類(lèi)名相同;析構(gòu)函數(shù)名為類(lèi)名前加“~”。構(gòu)造函數(shù)的功能是在創(chuàng)建對(duì)象時(shí)給對(duì)象分配內(nèi)存空間,并可使用給定值來(lái)初始化對(duì)象。析構(gòu)函數(shù)的功能是用來(lái)釋放一個(gè)對(duì)象的已分配空間。并可在對(duì)象被清除前,完成一些清理工作。12/19/202224類(lèi)和對(duì)象構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)都是類(lèi)的成員函數(shù),是特殊對(duì)前面的日期類(lèi)進(jìn)行修改,并將定義存放在CDate1.h文件中。如:classCDate1

{public:CDate1(inty,intm,intd);~CDate1();voidprint();private:intyear,month,day;

};函數(shù)名與類(lèi)名一致,無(wú)類(lèi)型但可有參數(shù)名字與類(lèi)名一致,前有~,無(wú)類(lèi)型無(wú)參數(shù)12/19/202225類(lèi)和對(duì)象對(duì)前面的日期類(lèi)進(jìn)行修改,并將定義存放在CDate1.h文件中CDate1::CDate1(intm,intd,inty){month=m;day=d;year=y;cout<<"Constructorcalled.\n";}CDate1::~CDate1(){cout<<"Destructorcalled.\n";}voidCDate1::print(){cout<<year<<"."<<month<<"."<<day<<endl;}與其他成員函數(shù)定義一樣,兩種函數(shù)的定義可放在類(lèi)體內(nèi),也可放在類(lèi)體外12/19/202226類(lèi)和對(duì)象CDate1::CDate1(intm,intd,int#include<iostream.h>#include"CDate1.h"voidmain(){CDate1today(2007,4,1),tomorrow(2007,4,2);cout<<"todayis";today.print();cout<<"tomorrowis";tomorrow.print();}執(zhí)行程序后,輸出結(jié)果為:函數(shù)結(jié)束時(shí),自動(dòng)調(diào)用析構(gòu)ConstructorCalled.ConstructorCalled.todayis2007.4.1tomorrowis2007.4.2Destructorcalled.Destructorcalled.12/19/202227類(lèi)和對(duì)象#include<iostream.h>函數(shù)結(jié)束時(shí),自動(dòng)調(diào)構(gòu)造函數(shù)的特點(diǎn)有:程序中一般不直接調(diào)用構(gòu)造函數(shù),在創(chuàng)建對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用構(gòu)造函數(shù)。構(gòu)造函數(shù)可以重載,即可定義多個(gè)參數(shù)個(gè)數(shù)不同的函數(shù)構(gòu)造函數(shù)有隱含的返回值,并由系統(tǒng)內(nèi)部使用析構(gòu)函數(shù)的特點(diǎn)有:一個(gè)類(lèi)中只能定義一個(gè)析構(gòu)函數(shù),即不能重載析構(gòu)函數(shù)可以被調(diào)用,也可系統(tǒng)調(diào)用被自動(dòng)調(diào)用的情況有兩種:在一個(gè)函數(shù)體內(nèi)定義的一個(gè)對(duì)象,當(dāng)函數(shù)結(jié)束時(shí)用new運(yùn)算符動(dòng)態(tài)創(chuàng)建的一個(gè)對(duì)象,在使用delete釋放時(shí)12/19/202228類(lèi)和對(duì)象構(gòu)造函數(shù)的特點(diǎn)有:12/16/202228類(lèi)和對(duì)象缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù)在類(lèi)定義中可以不定義任何構(gòu)造函數(shù),這時(shí)編譯器會(huì)自動(dòng)生成一個(gè)不帶參數(shù)的缺省構(gòu)造函數(shù)。其格式為:

<類(lèi)名>::<缺省構(gòu)造函數(shù)名>(){}則在程序中定義一個(gè)對(duì)象而未指明初始化時(shí),編譯器便按缺省構(gòu)造函數(shù)來(lái)初始化該對(duì)象。若定義了構(gòu)造函數(shù),則編譯器就不會(huì)再生成缺省構(gòu)造函數(shù),必須使用定義的構(gòu)造函數(shù)創(chuàng)建對(duì)象。同理,若一個(gè)類(lèi)中未定義析構(gòu)函數(shù),編譯系統(tǒng)也生成一個(gè)缺省析構(gòu)函數(shù)。其格式為:<類(lèi)名>::~<缺省析構(gòu)函數(shù)名>(){}這也是前面的程序中可以沒(méi)有構(gòu)造和析構(gòu)函數(shù)的原因12/19/202229類(lèi)和對(duì)象缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù)在類(lèi)定義中可以不定義任何構(gòu)造函數(shù),classCConstruct{ public:CConstruct(intx,inty);CConstruct(); voidprint(); private: intm1,m2;};CConstruct::CConstruct(intx,inty){ m1=x; m2=y;}CConstruct::CConstruct(){ m1=0; m2=0;}TestConsOverLoad.cpp例:12/19/202230類(lèi)和對(duì)象classCConstructTestConsOverLovoidCConstruct::print(){cout<<m1<<","<<m2<<endl;}voidmain(){ CConstructc2; CConstructc1(3,4);c1.print();}不帶參數(shù)創(chuàng)建對(duì)象,調(diào)用無(wú)參構(gòu)造函數(shù)12/19/202231類(lèi)和對(duì)象voidCConstruct::print()不帶參數(shù)創(chuàng)拷貝初始化構(gòu)造函數(shù)構(gòu)造函數(shù)除可以用基本數(shù)據(jù)類(lèi)型初始化對(duì)象外,還可以使用已存在的同類(lèi)型的對(duì)象即類(lèi)類(lèi)型的對(duì)象來(lái)初始化正在創(chuàng)建的對(duì)象。為此,必須在類(lèi)中定義一個(gè)特殊的構(gòu)造函數(shù)來(lái)完成這個(gè)工作,這個(gè)構(gòu)造函數(shù)被稱(chēng)為拷貝初始化構(gòu)造函數(shù)。格式為:<類(lèi)名>::<拷貝初始化構(gòu)造函數(shù)名>(<類(lèi)名>&<引用名>){…}如:student::student(student&s){…}每個(gè)類(lèi)中必須有一個(gè)。若類(lèi)中未說(shuō)明,則編譯系統(tǒng)會(huì)自動(dòng)生成缺省函數(shù)。12/19/202232類(lèi)和對(duì)象拷貝初始化構(gòu)造函數(shù)構(gòu)造函數(shù)除可以用基本數(shù)據(jù)類(lèi)型初始化對(duì)象外,classCMyClass{ public: CMyClass(intx); CMyClass(CMyClass&c); private: intmember;};CMyClass::CMyClass(intx){member=x;}CMyClass::CMyClass(CMyClass&c){ cout<<"copyconstructorcalled"<<endl; member=c.member;}拷貝初始化構(gòu)造函數(shù)TestCopyConstructor.cpp12/19/202233類(lèi)和對(duì)象classCMyClass拷貝初始化構(gòu)造函數(shù)TestCo拷貝初始化構(gòu)造函數(shù)被自動(dòng)調(diào)用有三種情況:一、是用一個(gè)已知對(duì)象初始化一個(gè)新對(duì)象時(shí)。二、是以值調(diào)用方式向一個(gè)函數(shù)傳遞對(duì)象參數(shù)時(shí)。三、當(dāng)對(duì)象作為函數(shù)返回值時(shí)。CMyClassfun(CMyClassd);voidmain(){ CMyClassb(3);

CMyClassc(b); CMyClasss=fun(c);}CMyClassfun(CMyClassd){ returnd;}12/19/202234類(lèi)和對(duì)象拷貝初始化構(gòu)造函數(shù)被自動(dòng)調(diào)用有三種情況:12/16/2022內(nèi)存解析member:3bMyClass(intx)MyClass(MyClass&c)cmember:3member:3dmember:3*member:3s12/19/202235類(lèi)和對(duì)象內(nèi)存解析member:3bMyClass(intx)MyC對(duì)象數(shù)組對(duì)象數(shù)組:一個(gè)數(shù)組中的每個(gè)數(shù)組元素都為同一類(lèi)的對(duì)象。對(duì)象數(shù)組的定義有以下幾種形式:類(lèi)中只有無(wú)參的構(gòu)造函數(shù)類(lèi)名數(shù)組名[常量表達(dá)式];例:CDate2objArray[4];類(lèi)中只有需要參數(shù)的構(gòu)造函數(shù)類(lèi)名數(shù)組名[常量表達(dá)式]={構(gòu)造函數(shù)名(參數(shù)表),…,構(gòu)造函數(shù)名(參數(shù)表)};例:CDate2objArray[2]={CDate1(2002,3,4),CDate1(2008,5,26)};類(lèi)中有無(wú)參的構(gòu)造函數(shù)和有參的構(gòu)造函數(shù)12/19/202236類(lèi)和對(duì)象對(duì)象數(shù)組對(duì)象數(shù)組:一個(gè)數(shù)組中的每個(gè)數(shù)組元素都為同一類(lèi)的對(duì)訪問(wèn)數(shù)組元素對(duì)象的成員objArray[1].print()或(objArray+1)->print()testObjectArray.cpp12/19/202237類(lèi)和對(duì)象訪問(wèn)數(shù)組元素對(duì)象的成員testObjectArray.cpp每一個(gè)類(lèi)的非靜態(tài)成員函數(shù)中的都有一個(gè)指針形參this,用于指向正在操作該成員函數(shù)的對(duì)象。例如:classCDate3{ public: CDate3(inty,intm,intd); voidprint(CDate3*t); voidprint(); private: intyear,month,day;};CDate3::CDate3(inty,intm,intd){ year=y;month=m; day=d;}this指針testThis.cpp12/19/202238類(lèi)和對(duì)象每一個(gè)類(lèi)的非靜態(tài)成員函數(shù)中的都有一個(gè)指針形參this,用于voidCDate3::print(CDate3*t){cout<<t->year<<"."<<t->month<<"."<<t->day<<endl;}voidCDate3::print(){cout<<this->year<<"."<<this->month<<"."<<this->day<<endl;}#include<iostream.h>#include"CDate3.h"voidmain(){ CDate3objThis(2008,4,23);objThis.print(&objThis);objThis.print();}隱含的指針形參this12/19/202239類(lèi)和對(duì)象voidCDate3::print(CDate3*t)隱靜態(tài)成員定義類(lèi)時(shí),可用關(guān)鍵字static聲明的數(shù)據(jù)成員或成員函數(shù)稱(chēng)為靜態(tài)成員,包括靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。靜態(tài)數(shù)據(jù)成員是在編譯時(shí)被創(chuàng)建,與對(duì)象是否存在無(wú)關(guān),其內(nèi)存空間為數(shù)據(jù)區(qū),其生命期一直到程序結(jié)束。靜態(tài)數(shù)據(jù)成員必須在類(lèi)外初始化:

數(shù)據(jù)類(lèi)型類(lèi)名::成員名=初始值;靜態(tài)成員函數(shù)屬于類(lèi),而不是對(duì)象成員(無(wú)this指針用來(lái)存放對(duì)象的地址),不能直接引用具體對(duì)象中的非靜態(tài)成員。須使用(對(duì)象名.成員名)來(lái)引用??梢酝ㄟ^(guò)對(duì)象名或類(lèi)名來(lái)訪問(wèn)靜態(tài)成員。12/19/202240類(lèi)和對(duì)象靜態(tài)成員定義類(lèi)時(shí),可用關(guān)鍵字static聲明的數(shù)據(jù)成員或成員靜態(tài)數(shù)據(jù)成員#include<iostream.h>classCCat{ public:

staticintcount; CCat(intcolor) {count++;colorFur=color;} private: intcolorFur;};intCCat::count=0;voidmain(){CCatmm(0);CCatpp(1);cout<<CCat::count<<endl;cout<<mm.count<<endl;}CCat::count++12/19/202241類(lèi)和對(duì)象靜態(tài)數(shù)據(jù)成員#include<iostream.h>CCa靜態(tài)成員函數(shù)classM{public:M(inta){A=a;}

staticvoidf1(Mm);private:intA;staticintB;};intM::B=0;voidM::f1(Mm){cout<<m.A<<B<<endl;}voidmain(){Mp(5);

M::f1(p);//p.f1(p);}靜態(tài)成員聲明靜態(tài)成員定義引用非靜態(tài)成員引用靜態(tài)成員函數(shù)testStaticFunction.cpp12/19/202242類(lèi)和對(duì)象靜態(tài)成員函數(shù)classM{靜態(tài)成員聲明靜態(tài)成員定義引用非靜友元函數(shù)在某個(gè)類(lèi)定義中用friend說(shuō)明一個(gè)外部函數(shù)后,這個(gè)外部函數(shù)就可直接訪問(wèn)該類(lèi)的任何私有成員。則該外部函數(shù)稱(chēng)為這個(gè)類(lèi)的友元函數(shù)。采用友元的目的主要是為提高效率。顯然它破壞了類(lèi)的封裝性。注意:在某個(gè)類(lèi)中說(shuō)明的友元函數(shù)并不是該類(lèi)的成員函數(shù)。它可以是外部的一個(gè)獨(dú)立函數(shù),也可以是另外一個(gè)類(lèi)中的成員函數(shù)。12/19/202243類(lèi)和對(duì)象友元函數(shù)在某個(gè)類(lèi)定義中用friend說(shuō)明一個(gè)外部函數(shù)后,這個(gè)classCFriend{

friendvoidgFunc1(CFriend&p);

//聲明友元函數(shù)private: voidfunc1(){cout<<"friend\n";}};友元為外部的獨(dú)立函數(shù)voidgFunc1(CFriend&p)//定義外部友元函數(shù),使用類(lèi)對(duì)象引用作參數(shù)//注:不是成員函數(shù)不加類(lèi)名::{ p.func1();//友元的使用,調(diào)用私有成員 …}testFriendFunction.cpp12/19/202244類(lèi)和對(duì)象classCFriend友元為外部的獨(dú)立函數(shù)voidgclassCFriendB;classCFriendA{public:intf1(CFriendB&b);//類(lèi)中使用另一個(gè)類(lèi)對(duì)象須先有其說(shuō)明intf2(CFriendB&b);};classCFriendB{friendintCFriendA::f1(CFriendB&b);//把CFriendA中f1說(shuō)明為友元private:staticintm;};intCFriendB::m=5;intCFriendA::f1(CFriendB&b){returnb.m;}//正確:

intCFriendA::f2(CFriendB&b){returnb.m;}//錯(cuò)誤:友元為另一個(gè)類(lèi)的成員函數(shù)testFriendFunction2.cpp12/19/202245類(lèi)和對(duì)象classCFriendB;友元為另一個(gè)類(lèi)的成員函數(shù)tes同函數(shù)一樣,類(lèi)也可以聲明為另一個(gè)類(lèi)的友元,稱(chēng)為友元類(lèi)。若A為B的友元類(lèi),則A類(lèi)的所有成員函數(shù)都是B類(lèi)的友元函數(shù),都可以訪問(wèn)B類(lèi)的私有和保護(hù)成員。聲明的形式為:classB{

friendclassA; …};注意:1)友元關(guān)系是不能傳遞的。2)友元關(guān)系是是單向的。友元類(lèi)testFriendClass.cpp12/19/202246類(lèi)和對(duì)象同函數(shù)一樣,類(lèi)也可以聲明為另一個(gè)類(lèi)的友元,稱(chēng)為友元類(lèi)。cla類(lèi)的作用域類(lèi)的作用域(簡(jiǎn)稱(chēng)類(lèi)域)是指類(lèi)的定義中由一對(duì)花括號(hào)括起的部分。類(lèi)的所有成員都在類(lèi)的作用域中。類(lèi)域區(qū)分符“::”來(lái)確定成員函數(shù)的類(lèi)域,從而可在類(lèi)外定義成員函數(shù)。同變量一樣,在類(lèi)定義體和函數(shù)體外定義的對(duì)象為全局對(duì)象,而在類(lèi)定義體內(nèi)或在函數(shù)體內(nèi)定義的對(duì)象為局部對(duì)象。全局對(duì)象的作用域是從定義它的位置開(kāi)始直至文件的結(jié)束,而局部對(duì)象的作用域只在類(lèi)作用域或函數(shù)體內(nèi)。12/19/202247類(lèi)和對(duì)象類(lèi)的作用域類(lèi)的作用域(簡(jiǎn)稱(chēng)類(lèi)域)是指類(lèi)的定義中由一對(duì)花括號(hào)括#include<iostream.h>intpp=0;classCScope{public:

intpp;voidrp(intpp);};voidCScope::rp(intpp){

::pp=11; //變量名前加域區(qū)分符給全局變量pp賦值this->pp=100;

//給數(shù)據(jù)成員賦值cout<<pp<<endl;}voidmain(){CScopea;a.rp(4);cout<<pp<<'\n'<<a.pp<<endl;}testScope.cpp12/19/202248類(lèi)和對(duì)象#include<iostream.h>testSco第7章類(lèi)與對(duì)象(一)面向?qū)ο蟮幕靖拍铑?lèi)的定義創(chuàng)建對(duì)象構(gòu)造函數(shù)與析構(gòu)函數(shù)對(duì)象數(shù)組this指針靜態(tài)成員友元類(lèi)的作用域12/19/202249類(lèi)和對(duì)象第7章類(lèi)與對(duì)象(一)面向?qū)ο蟮幕靖拍?2/16/2022面向?qū)ο蟮幕靖拍?1.面向?qū)ο笈c面向過(guò)程的區(qū)別:我要開(kāi)車(chē)去新疆面向過(guò)程我開(kāi)車(chē),我過(guò)陜西,我過(guò)蘭州……面向?qū)ο笪颐钴?chē)去新疆車(chē)怎么去我不關(guān)心(封裝)12/19/202250類(lèi)和對(duì)象面向?qū)ο蟮幕靖拍?1.面向?qū)ο笈c面向過(guò)程的區(qū)別:12/12.類(lèi)(class)和對(duì)象(object)的概念對(duì)象是系統(tǒng)中用來(lái)描述客觀事務(wù)的一個(gè)實(shí)體,它通過(guò)“屬性attribute(數(shù)據(jù)成員)”和“行為behavior(成員函數(shù)、方法)”來(lái)分別實(shí)體的靜態(tài)屬性和動(dòng)態(tài)屬性。類(lèi)是具有共同屬性和行為的對(duì)象的抽象。對(duì)象是類(lèi)的實(shí)例(instance)。學(xué)生A抽象類(lèi)對(duì)象學(xué)生學(xué)號(hào)姓名學(xué)習(xí)()學(xué)生A學(xué)號(hào)=101姓名=TOM實(shí)例化12/19/202251類(lèi)和對(duì)象2.類(lèi)(class)和對(duì)象(object)的概念對(duì)象是系統(tǒng)中*3.類(lèi)(對(duì)象)之間的關(guān)系關(guān)聯(lián)關(guān)系教師姓名教學(xué)(學(xué)生A)學(xué)生學(xué)號(hào)姓名學(xué)習(xí)()學(xué)校12/19/202252類(lèi)和對(duì)象*3.類(lèi)(對(duì)象)之間的關(guān)系關(guān)聯(lián)關(guān)系教師姓名教學(xué)(學(xué)生A)繼承關(guān)系(一般和特殊)xx是一種XX類(lèi)的繼承層次12/19/202253類(lèi)和對(duì)象繼承關(guān)系(一般和特殊)xx是一種XX類(lèi)的繼承層次12/16/聚合關(guān)系(整體和部分)隊(duì)長(zhǎng)隊(duì)員球隊(duì)聚集頭身體人組合12/19/202254類(lèi)和對(duì)象聚合關(guān)系(整體和部分)隊(duì)長(zhǎng)隊(duì)員球隊(duì)聚集頭身體人組合1多態(tài)車(chē)go()大卡車(chē)go()小汽車(chē)go()12/19/202255類(lèi)和對(duì)象多態(tài)車(chē)go()大卡車(chē)go()小汽車(chē)go()12/16/202面向?qū)ο蟮脑O(shè)計(jì)思想有那些類(lèi)(對(duì)象)?每一種類(lèi)(對(duì)象)有哪些屬性和方法?類(lèi)(對(duì)象)之間有哪些關(guān)系?12/19/202256類(lèi)和對(duì)象面向?qū)ο蟮脑O(shè)計(jì)思想有那些類(lèi)(對(duì)象)?12/16/20228類(lèi)類(lèi)的定義類(lèi)的定義格式一般分為說(shuō)明部分和實(shí)現(xiàn)部分。說(shuō)明部分:是用來(lái)說(shuō)明類(lèi)中的成員,包含數(shù)據(jù)成員的說(shuō)明和成員函數(shù)的說(shuō)明。成員函數(shù)是用來(lái)對(duì)數(shù)據(jù)成員進(jìn)行操作的,也稱(chēng)為“方法”。實(shí)現(xiàn)部分:是用來(lái)對(duì)成員函數(shù)進(jìn)行定義。12/19/202257類(lèi)和對(duì)象類(lèi)的定義類(lèi)的定義格式一般分為說(shuō)明部分和實(shí)現(xiàn)部分。12/16/說(shuō)明部分的一般格式class類(lèi)類(lèi)型名{

public:公有成員說(shuō)明

private:

私有成員說(shuō)明};私有訪問(wèn)權(quán)限,為默認(rèn)值,可缺省公有訪問(wèn)權(quán)限除本類(lèi)中的成員函數(shù)及友元外,其他類(lèi)外函數(shù)不能訪問(wèn)。程序中的任何函數(shù)都可訪問(wèn)12/19/202258類(lèi)和對(duì)象說(shuō)明部分的一般格式class類(lèi)類(lèi)型名私有訪問(wèn)權(quán)限,為默認(rèn)值例如:定義一個(gè)Person類(lèi),設(shè)Person具有的特征:屬性(姓名、年齡、性別),方法(輸出一個(gè)人的屬性);則對(duì)應(yīng)著有4個(gè)成員:三個(gè)數(shù)據(jù)成員,一個(gè)成員函數(shù)。三個(gè)數(shù)據(jù)成員定義為私有成員,print成員函數(shù)定義為公有成員。則有:classCPerson{

public:voidprint();

private:charname[10];intage;charsex;};類(lèi)名通常用C字母開(kāi)始,以區(qū)別其他標(biāo)識(shí)符12/19/202259類(lèi)和對(duì)象例如:定義一個(gè)Person類(lèi),設(shè)Person具有的特征:屬性類(lèi)的實(shí)現(xiàn)部分類(lèi)的實(shí)現(xiàn)部分即定義它的成員函數(shù),如在類(lèi)說(shuō)明內(nèi)部定義,則方式與定義普通函數(shù)大體相同。若在類(lèi)說(shuō)明外部定義成員函數(shù),則應(yīng)使用類(lèi)域運(yùn)算符::(p21)指明該函數(shù)是哪個(gè)類(lèi)中的成員函數(shù)。格式為:函數(shù)類(lèi)型類(lèi)名::成員函數(shù)名(形參表){函數(shù)體;}voidCPerson::print(){cout<<name<<age<<sex<<endl;}除特殊指明外,成員函數(shù)操作的是同一對(duì)象中的數(shù)據(jù)成員。不同的類(lèi)允許有相同名稱(chēng)的成員函數(shù),因此,在類(lèi)外定義成員函數(shù)的實(shí)現(xiàn)時(shí),必須在成員函數(shù)名前加上所屬類(lèi)名和作用域操作符“::”。12/19/202260類(lèi)和對(duì)象類(lèi)的實(shí)現(xiàn)部分類(lèi)的實(shí)現(xiàn)部分即定義它的成員函數(shù),如在類(lèi)說(shuō)明內(nèi)部定當(dāng)成員函數(shù)的規(guī)模較小時(shí),可在類(lèi)中定義成員函數(shù),成為內(nèi)聯(lián)成員函數(shù)。例:classCDate{

public:voidsetDate(intm,intd,inty)//置日期值{ month=m;day=d;year=y;} voidprint();

private:intmonth,day,year;};voidCDate::print(){cout<<year<<'.'<<month<<'.'<<day<<endl;}若將內(nèi)聯(lián)成員函數(shù)定義在類(lèi)說(shuō)明之外則要加上inline。內(nèi)聯(lián)成員函數(shù)12/19/202261類(lèi)和對(duì)象當(dāng)成員函數(shù)的規(guī)模較小時(shí),可在類(lèi)中定義成員函數(shù),成為內(nèi)聯(lián)成員函注意事項(xiàng)1.在類(lèi)體中不允許對(duì)所定義的數(shù)據(jù)成員進(jìn)行初始化。classCDate{public:…private:intyear(1998),month(4);…};2.類(lèi)中的數(shù)據(jù)成員的類(lèi)型可以是任意的,包括整型、浮點(diǎn)型、字符型、數(shù)組、指針和引用等,也可以是另一個(gè)類(lèi)的對(duì)象。3.習(xí)慣將類(lèi)的定義代碼放到一個(gè)頭文件中,以后若要使用則用文件包含命令包含。錯(cuò)誤testClass\CreateClass.cpp12/19/202262類(lèi)和對(duì)象注意事項(xiàng)1.在類(lèi)體中不允許對(duì)所定義的數(shù)據(jù)成員進(jìn)行初始化。錯(cuò)誤創(chuàng)建對(duì)象1.對(duì)象的定義形式為:類(lèi)名

對(duì)象名列表;

CDatedate1,date2;//定義兩個(gè)CDate類(lèi)的對(duì)象date1和date2

CDate*pDate=&date1;

//定義一個(gè)指向date1對(duì)象空間的指針pDateCDate&rDate=date2;//定義一個(gè)引用對(duì)象rDateCDatedata[3];//定義一個(gè)data對(duì)象數(shù)組,其元素類(lèi)型為CDate類(lèi)定義了一個(gè)類(lèi)只是定義了一種類(lèi)型,它并不分配空間,不能進(jìn)行操作。只有用它創(chuàng)建對(duì)象后,系統(tǒng)才為對(duì)象分配存儲(chǔ)空間。12/19/202263類(lèi)和對(duì)象創(chuàng)建對(duì)象1.對(duì)象的定義形式為:定義了一個(gè)類(lèi)只是定義了一種類(lèi)型成員的訪問(wèn)通過(guò)對(duì)象可以訪問(wèn)類(lèi)中的公有類(lèi)型數(shù)據(jù)和成員函數(shù)。其使用方式為:

對(duì)象名.成員函數(shù)名對(duì)象名.數(shù)據(jù)成員例:date1.year=2002;date1.Print();用指針訪問(wèn)對(duì)象公有成員:指針名->數(shù)據(jù)成員或指針名->成員函數(shù)(*指針名).數(shù)據(jù)成員或(*指針名).成員函數(shù)例:pDate->day=30;pDate->Print();(*pDate).day=30;(*pDate).Print();用引用訪問(wèn)對(duì)象成員:引用名.數(shù)據(jù)成員或引用名.成員函數(shù)例:rDate.year=2008;rDate.Print();12/19/202264類(lèi)和對(duì)象成員的訪問(wèn)通過(guò)對(duì)象可以訪問(wèn)類(lèi)中的公有類(lèi)型數(shù)據(jù)和成員函數(shù)。其使注意:在成員函數(shù)中訪問(wèn)成員無(wú)須加對(duì)象名來(lái)作為前綴。如:voidCDate::print(){cout<<year<<'.'<<month<<'.'<<day<<endl;}在year等成員之前不能加對(duì)象名,在定義類(lèi)時(shí),成員函數(shù)是所有對(duì)象共享的代碼,不被某一個(gè)對(duì)象獨(dú)占。也無(wú)法確定類(lèi)的對(duì)象名。注意12/19/202265類(lèi)和對(duì)象注意:注意12/16/202217類(lèi)和對(duì)象例一個(gè)完整的程序//CDate.hclassCDate{public:voidsetDate(intm,intd,inty)//置日期值{ month=m;day=d;year=y;} voidprint();private:intmonth,day,year;};voidCDate::print(){cout<<year<<'.'<<month<<'.'<<day<<endl;}12/19/202266類(lèi)和對(duì)象例一個(gè)完整的程序//CDate.h12/16/202218續(xù)例一個(gè)完整的程序#include<iostream.h>#include"CDate.h"voidmain(){CDatedate1;date1.setDate(8,5,1996);date1.print();

//cout<<date1.year<<endl;/*CDate*pDate=&date1;pDate->print();*/}testClass\testCDate.cpp12/19/202267類(lèi)和對(duì)象續(xù)例一個(gè)完整的程序#include<iostream.類(lèi)的成員函數(shù)內(nèi)聯(lián)函數(shù):指定義在類(lèi)體內(nèi)的成員函數(shù)。外聯(lián)函數(shù):指說(shuō)明在類(lèi)體內(nèi),定義在類(lèi)體外的成員函數(shù)。類(lèi)外定義的函數(shù)缺省情況下都是外聯(lián)函數(shù),用關(guān)鍵字inline

可以強(qiáng)制轉(zhuǎn)換。

對(duì)于內(nèi)聯(lián)成員函數(shù),編譯時(shí)在所有調(diào)用該函數(shù)的地方將裝入實(shí)際的函數(shù)代碼。1.內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù)12/19/202268類(lèi)和對(duì)象類(lèi)的成員函數(shù)內(nèi)聯(lián)函數(shù):指定義在類(lèi)體內(nèi)的成員函數(shù)。對(duì)于內(nèi)聯(lián)成classCDate{public:voidsetDate(intm,intd,inty)//內(nèi)聯(lián)函數(shù)之一{ month=m;day=d;year=y;}voidprint();private:intmonth,day,year;};inlinevoidCDate::print()//內(nèi)聯(lián)函數(shù)之二{cout<<year<<'.'<<month<<'.'<<day<<endl;}12/19/202269類(lèi)和對(duì)象classCDate12/16/202221類(lèi)和對(duì)象2.設(shè)置參數(shù)的缺省值函數(shù)在定義時(shí)可以預(yù)先定義出形參的缺省值。調(diào)用時(shí)如果給出實(shí)參,則用實(shí)參初始化形參,如果沒(méi)有給出實(shí)參,則采用預(yù)先定義形參的缺省值。例如:voidsetDate(intm,intd=28,inty=2008);

//缺省參數(shù)按從右往左的方式或voidsetDate(intm,intd=28,inty=2008){…}在進(jìn)行函數(shù)調(diào)用時(shí),主調(diào)函數(shù)的實(shí)參與被調(diào)函數(shù)的形參按從左到右的位置結(jié)合。TestParaDefault.cpp12/19/202270類(lèi)和對(duì)象2.設(shè)置參數(shù)的缺省值函數(shù)在定義時(shí)可以預(yù)先定義出形參的缺省值3.函數(shù)的重載函數(shù)的重載:出現(xiàn)在相同作用域的兩個(gè)函數(shù),如果具有相同的名字而形參表不同,則稱(chēng)為重載函數(shù)(overloadedfunction)。調(diào)用時(shí),會(huì)根據(jù)不同的參數(shù)表選擇對(duì)應(yīng)的成員函數(shù)。重載函數(shù),必須:函數(shù)名相同,函數(shù)的作用域相同,函數(shù)的參數(shù)個(gè)數(shù)或參數(shù)類(lèi)型不同。使用重載函數(shù)時(shí)應(yīng)注意:⑴只有返回值不同,不能成為重載函數(shù)。

intmax(inta,intb);doublemax(inta,intb); //錯(cuò)誤⑵使用帶缺省值的函數(shù)時(shí),可能引發(fā)錯(cuò)誤。如:

intmax(inta,intb=0);intmax(intc);當(dāng)用一個(gè)實(shí)參調(diào)用該函數(shù)時(shí),如max(2),則會(huì)出現(xiàn)調(diào)用歧義性12/19/202271類(lèi)和對(duì)象3.函數(shù)的重載函數(shù)的重載:出現(xiàn)在相同作用域的兩個(gè)函數(shù),如果構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)都是類(lèi)的成員函數(shù),是特殊的成員函數(shù),不能被調(diào)用而由系統(tǒng)自動(dòng)調(diào)用/執(zhí)行。構(gòu)造函數(shù)名與類(lèi)名相同;析構(gòu)函數(shù)名為類(lèi)名前加“~”。構(gòu)造函數(shù)的功能是在創(chuàng)建對(duì)象時(shí)給對(duì)象分配內(nèi)存空間,并可使用給定值來(lái)初始化對(duì)象。析構(gòu)函數(shù)的功能是用來(lái)釋放一個(gè)對(duì)象的已分配空間。并可在對(duì)象被清除前,完成一些清理工作。12/19/202272類(lèi)和對(duì)象構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)都是類(lèi)的成員函數(shù),是特殊對(duì)前面的日期類(lèi)進(jìn)行修改,并將定義存放在CDate1.h文件中。如:classCDate1

{public:CDate1(inty,intm,intd);~CDate1();voidprint();private:intyear,month,day;

};函數(shù)名與類(lèi)名一致,無(wú)類(lèi)型但可有參數(shù)名字與類(lèi)名一致,前有~,無(wú)類(lèi)型無(wú)參數(shù)12/19/202273類(lèi)和對(duì)象對(duì)前面的日期類(lèi)進(jìn)行修改,并將定義存放在CDate1.h文件中CDate1::CDate1(intm,intd,inty){month=m;day=d;year=y;cout<<"Constructorcalled.\n";}CDate1::~CDate1(){cout<<"Destructorcalled.\n";}voidCDate1::print(){cout<<year<<"."<<month<<"."<<day<<endl;}與其他成員函數(shù)定義一樣,兩種函數(shù)的定義可放在類(lèi)體內(nèi),也可放在類(lèi)體外12/19/202274類(lèi)和對(duì)象CDate1::CDate1(intm,intd,int#include<iostream.h>#include"CDate1.h"voidmain(){CDate1today(2007,4,1),tomorrow(2007,4,2);cout<<"todayis";today.print();cout<<"tomorrowis";tomorrow.print();}執(zhí)行程序后,輸出結(jié)果為:函數(shù)結(jié)束時(shí),自動(dòng)調(diào)用析構(gòu)ConstructorCalled.ConstructorCalled.todayis2007.4.1tomorrowis2007.4.2Destructorcalled.Destructorcalled.12/19/202275類(lèi)和對(duì)象#include<iostream.h>函數(shù)結(jié)束時(shí),自動(dòng)調(diào)構(gòu)造函數(shù)的特點(diǎn)有:程序中一般不直接調(diào)用構(gòu)造函數(shù),在創(chuàng)建對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用構(gòu)造函數(shù)。構(gòu)造函數(shù)可以重載,即可定義多個(gè)參數(shù)個(gè)數(shù)不同的函數(shù)構(gòu)造函數(shù)有隱含的返回值,并由系統(tǒng)內(nèi)部使用析構(gòu)函數(shù)的特點(diǎn)有:一個(gè)類(lèi)中只能定義一個(gè)析構(gòu)函數(shù),即不能重載析構(gòu)函數(shù)可以被調(diào)用,也可系統(tǒng)調(diào)用被自動(dòng)調(diào)用的情況有兩種:在一個(gè)函數(shù)體內(nèi)定義的一個(gè)對(duì)象,當(dāng)函數(shù)結(jié)束時(shí)用new運(yùn)算符動(dòng)態(tài)創(chuàng)建的一個(gè)對(duì)象,在使用delete釋放時(shí)12/19/202276類(lèi)和對(duì)象構(gòu)造函數(shù)的特點(diǎn)有:12/16/202228類(lèi)和對(duì)象缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù)在類(lèi)定義中可以不定義任何構(gòu)造函數(shù),這時(shí)編譯器會(huì)自動(dòng)生成一個(gè)不帶參數(shù)的缺省構(gòu)造函數(shù)。其格式為:

<類(lèi)名>::<缺省構(gòu)造函數(shù)名>(){}則在程序中定義一個(gè)對(duì)象而未指明初始化時(shí),編譯器便按缺省構(gòu)造函數(shù)來(lái)初始化該對(duì)象。若定義了構(gòu)造函數(shù),則編譯器就不會(huì)再生成缺省構(gòu)造函數(shù),必須使用定義的構(gòu)造函數(shù)創(chuàng)建對(duì)象。同理,若一個(gè)類(lèi)中未定義析構(gòu)函數(shù),編譯系統(tǒng)也生成一個(gè)缺省析構(gòu)函數(shù)。其格式為:<類(lèi)名>::~<缺省析構(gòu)函數(shù)名>(){}這也是前面的程序中可以沒(méi)有構(gòu)造和析構(gòu)函數(shù)的原因12/19/202277類(lèi)和對(duì)象缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù)在類(lèi)定義中可以不定義任何構(gòu)造函數(shù),classCConstruct{ public:CConstruct(intx,inty);CConstruct(); voidprint(); private: intm1,m2;};CConstruct::CConstruct(intx,inty){ m1=x; m2=y;}CConstruct::CConstruct(){ m1=0; m2=0;}TestConsOverLoad.cpp例:12/19/202278類(lèi)和對(duì)象classCConstructTestConsOverLovoidCConstruct::print(){cout<<m1<<","<<m2<<endl;}voidmain(){ CConstructc2; CConstructc1(3,4);c1.print();}不帶參數(shù)創(chuàng)建對(duì)象,調(diào)用無(wú)參構(gòu)造函數(shù)12/19/202279類(lèi)和對(duì)象voidCConstruct::print()不帶參數(shù)創(chuàng)拷貝初始化構(gòu)造函數(shù)構(gòu)造函數(shù)除可以用基本數(shù)據(jù)類(lèi)型初始化對(duì)象外,還可以使用已存在的同類(lèi)型的對(duì)象即類(lèi)類(lèi)型的對(duì)象來(lái)初始化正在創(chuàng)建的對(duì)象。為此,必須在類(lèi)中定義一個(gè)特殊的構(gòu)造函數(shù)來(lái)完成這個(gè)工作,這個(gè)構(gòu)造函數(shù)被稱(chēng)為拷貝初始化構(gòu)造函數(shù)。格式為:<類(lèi)名>::<拷貝初始化構(gòu)造函數(shù)名>(<類(lèi)名>&<引用名>){…}如:student::student(student&s){…}每個(gè)類(lèi)中必須有一個(gè)。若類(lèi)中未說(shuō)明,則編譯系統(tǒng)會(huì)自動(dòng)生成缺省函數(shù)。12/19/202280類(lèi)和對(duì)象拷貝初始化構(gòu)造函數(shù)構(gòu)造函數(shù)除可以用基本數(shù)據(jù)類(lèi)型初始化對(duì)象外,classCMyClass{ public: CMyClass(intx); CMyClass(CMyClass&c); private: intmember;};CMyClass::CMyClass(intx){member=x;}CMyClass::CMyClass(CMyClass&c){ cout<<"copyconstructorcalled"<<endl; member=c.member;}拷貝初始化構(gòu)造函數(shù)TestCopyConstructor.cpp12/19/202281類(lèi)和對(duì)象classCMyClass拷貝初始化構(gòu)造函數(shù)TestCo拷貝初始化構(gòu)造函數(shù)被自動(dòng)調(diào)用有三種情況:一、是用一個(gè)已知對(duì)象初始化一個(gè)新對(duì)象時(shí)。二、是以值調(diào)用方式向一個(gè)函數(shù)傳遞對(duì)象參數(shù)時(shí)。三、當(dāng)對(duì)象作為函數(shù)返回值時(shí)。CMyClassfun(CMyClassd);voidmain(){ CMyClassb(3);

CMyClassc(b); CMyClasss=fun(c);}CMyClassfun(CMyClassd){ returnd;}12/19/202282類(lèi)和對(duì)象拷貝初始化構(gòu)造函數(shù)被自動(dòng)調(diào)用有三種情況:12/16/2022內(nèi)存解析member:3bMyClass(intx)MyClass(MyClass&c)cmember:3member:3dmember:3*member:3s12/19/202283類(lèi)和對(duì)象內(nèi)存解析member:3bMyClass(intx)MyC對(duì)象數(shù)組對(duì)象數(shù)組:一個(gè)數(shù)組中的每個(gè)數(shù)組元素都為同一類(lèi)的對(duì)象。對(duì)象數(shù)組的定義有以下幾種形式:類(lèi)中只有無(wú)參的構(gòu)造函數(shù)類(lèi)名數(shù)組名[常量表達(dá)式];例:CDate2objArray[4];類(lèi)中只有需要參數(shù)的構(gòu)造函數(shù)類(lèi)名數(shù)組名[常量表達(dá)式]={構(gòu)造函數(shù)名(參數(shù)表),…,構(gòu)造函數(shù)名(參數(shù)表)};例:CDate2objArray[2]={CDate1(2002,3,4),CDate1(2008,5,26)};類(lèi)中有無(wú)參的構(gòu)造函數(shù)和有參的構(gòu)造函數(shù)12/19/202284類(lèi)和對(duì)象對(duì)象數(shù)組對(duì)象數(shù)組:一個(gè)數(shù)組中的每個(gè)數(shù)組元素都為同一類(lèi)的對(duì)訪問(wèn)數(shù)組元素對(duì)象的成員objArray[1].print()或(objArray+1)->print()testObjectArray.cpp12/19/202285類(lèi)和對(duì)象訪問(wèn)數(shù)組元素對(duì)象的成員testObjectArray.cpp每一個(gè)類(lèi)的非靜態(tài)成員函數(shù)中的都有一個(gè)指針形參this,用于指向正在操作該成員函數(shù)的對(duì)象。例如:classCDate3{ public: CDate3(inty,intm,intd); voidprint(CDate3*t); voidprint(); private: intyear,month,day;};CDate3::CDate3(inty,intm,intd){ year=y;month=m; day=d;}this指針testThis.cpp12/19/202286類(lèi)和對(duì)象每一個(gè)類(lèi)的非靜態(tài)成員函數(shù)中的都有一個(gè)指針形參this,用于voidCDate3::print(CDate3*t){cout<<t->year<<"."<<t->month<<"."<<t->day<<endl;}voidCDate3::print(){cout<<this->year<<"."<<this->month<<"."<<this->day<<endl;}#include<iostream.h>#include"CDate3.h"voidmain(){ CDate3objThis(2008,4,23);objThis.print(&objThis);objThis.print();}隱含的指針形參this12/19/202287類(lèi)和對(duì)象voidCDate3::print(CDate3*t)隱靜態(tài)成員定義類(lèi)時(shí),可用關(guān)鍵字static聲明的數(shù)據(jù)成員或成員函數(shù)稱(chēng)為靜態(tài)成員,包括靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。靜態(tài)數(shù)據(jù)成員是在編譯時(shí)被創(chuàng)建,與對(duì)象是否存在無(wú)關(guān),其內(nèi)存空間為數(shù)據(jù)區(qū),其生命期一直到程序結(jié)束。靜態(tài)數(shù)據(jù)成員必須在類(lèi)外初始化:

數(shù)據(jù)類(lèi)型類(lèi)名::成員名=初始值;靜態(tài)成員函數(shù)屬于類(lèi),而不是對(duì)象成員(無(wú)this指針用來(lái)存放對(duì)象的地址),不能直接引用具體對(duì)象中的非靜態(tài)成員。須使用(對(duì)象名.成員名)來(lái)引用??梢酝ㄟ^(guò)對(duì)象名或類(lèi)名來(lái)訪問(wèn)靜態(tài)成員。12/19/2022

溫馨提示

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