第9章-關(guān)于類和對(duì)象的進(jìn)一步說(shuō)明-C++-程序設(shè)計(jì)教學(xué)課件_第1頁(yè)
第9章-關(guān)于類和對(duì)象的進(jìn)一步說(shuō)明-C++-程序設(shè)計(jì)教學(xué)課件_第2頁(yè)
第9章-關(guān)于類和對(duì)象的進(jìn)一步說(shuō)明-C++-程序設(shè)計(jì)教學(xué)課件_第3頁(yè)
第9章-關(guān)于類和對(duì)象的進(jìn)一步說(shuō)明-C++-程序設(shè)計(jì)教學(xué)課件_第4頁(yè)
第9章-關(guān)于類和對(duì)象的進(jìn)一步說(shuō)明-C++-程序設(shè)計(jì)教學(xué)課件_第5頁(yè)
已閱讀5頁(yè),還剩123頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第9章關(guān)于類和對(duì)象的進(jìn)一步說(shuō)明第9章關(guān)于類和對(duì)象的進(jìn)一步說(shuō)明19.1構(gòu)造函數(shù)問(wèn)題:前面是用成員函數(shù)來(lái)對(duì)對(duì)象中的數(shù)據(jù)成員賦初值的,如果對(duì)一個(gè)類定義了多個(gè)對(duì)象,那么,程序就顯得非常復(fù)雜煩瑣。另外,類聲明中,也無(wú)法對(duì)對(duì)象的各數(shù)據(jù)成員賦值。解決方法:用構(gòu)造函數(shù)對(duì)對(duì)象中的數(shù)據(jù)成員賦初值。9.1構(gòu)造函數(shù)問(wèn)題:前面是用成員函數(shù)來(lái)對(duì)對(duì)象中的數(shù)據(jù)成員賦classTime{intnum=0;charname=’’ab’’;charsex=’f’;};classStudent{private:intnum;charname[20];charsex;public:voidset(){cin>>num>>name>>sex;}voiddisplay(){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;}};intmain(){Students1,s2,s3;s1.set();s2.set();s3.set();s1.display();s2.display();s3.display();}主程序復(fù)雜錯(cuò)誤,在聲明類時(shí)不能對(duì)數(shù)據(jù)成員初始化classTimeclassStudentintma39.1.2構(gòu)造函數(shù)的作用構(gòu)造函數(shù)是一種特殊的成員函數(shù),不需要用戶來(lái)調(diào)用,而是在建立對(duì)象時(shí)自動(dòng)執(zhí)行。構(gòu)造函數(shù)的特點(diǎn):(1)構(gòu)造函數(shù)的名字必須與類名同名,而不能由用戶任意命名;(2)構(gòu)造函數(shù)不具有任何類型,不返回任何值。用戶根據(jù)初始化的要求設(shè)計(jì)函數(shù)體和函數(shù)參數(shù)。9.1.2構(gòu)造函數(shù)的作用例9.1在例8.3基礎(chǔ)上定義構(gòu)造成員函數(shù)。intmain(){Timet1;t1.set_time();t1.show_time();Timet2;t2.show_time();return0;}voidTime∷set_time(){cin>>hour;cin>>minute;cin>>sec;}voidTime∷show_time(){cout<<hour<<’’:’’<<minute<<’’:’’<<sec<<endl;}Time∷Time(){hour=0;minute=0;sec=0;}#include<iostream>usingnamespacestd;classTime{public:Time();voidset_time();voidshow_time();private:inthour;intminute;intsec;};102554↙

10:25:540:0:0例9.1在例8.3基礎(chǔ)上定義構(gòu)造成員函數(shù)。intmain5對(duì)構(gòu)造函數(shù)的說(shuō)明(1)構(gòu)造函數(shù)的定義可以寫在類內(nèi),也可以在類外。如果定義寫在類外,則必須在類內(nèi)聲明構(gòu)造函數(shù)的原型,而且類外定義時(shí)要指明其所屬的類。(2)在建立對(duì)象時(shí)系統(tǒng)自動(dòng)執(zhí)行構(gòu)造函數(shù),進(jìn)行初始化,對(duì)各數(shù)據(jù)成員賦初值。(3)構(gòu)造函數(shù)不需用戶調(diào)用,也不能被用戶調(diào)用。它是由系統(tǒng)自動(dòng)調(diào)用。(4)構(gòu)造函數(shù)沒(méi)有返回值,不能在定義構(gòu)造函數(shù)時(shí)聲明類型。(不能加void)對(duì)構(gòu)造函數(shù)的說(shuō)明(5)在構(gòu)造函數(shù)的函數(shù)體中不僅可以對(duì)數(shù)據(jù)成員賦初值,而且可以包含其他語(yǔ)句。但是一般不提倡在構(gòu)造函數(shù)中加入與初始化無(wú)關(guān)的內(nèi)容,以保持程序的清晰。(6)如果用戶自己沒(méi)有定義構(gòu)造函數(shù),則C++系統(tǒng)會(huì)自動(dòng)生成一個(gè)構(gòu)造函數(shù),只是這個(gè)構(gòu)造函數(shù)的函數(shù)體是空的,也沒(méi)有參數(shù),不執(zhí)行初始化操作。(5)在構(gòu)造函數(shù)的函數(shù)體中不僅可以對(duì)數(shù)據(jù)成員賦初值,而且可以9.1.3帶參數(shù)的構(gòu)造函數(shù)前面的方法使每個(gè)對(duì)象都有同一初值,有時(shí)用戶希望對(duì)不同的對(duì)象賦予不同的值,可采用帶參數(shù)的構(gòu)造函數(shù)。構(gòu)造函數(shù)首部格式:構(gòu)造函數(shù)名(類型1形參1,類型2形參2,…)定義對(duì)象的格式:類名對(duì)象名(實(shí)參1,實(shí)參2,…);在建立對(duì)象時(shí),將實(shí)參數(shù)據(jù)傳給構(gòu)造函數(shù)的形參。9.1.3帶參數(shù)的構(gòu)造函數(shù)前面的方法使每個(gè)對(duì)象都有同一初值例9.2有兩個(gè)長(zhǎng)方柱,其長(zhǎng)、寬、高分別為:(1)12,20,25;(2)10,14,20。求它們的體積。編一個(gè)基于對(duì)象的程序,在類中用帶參數(shù)的構(gòu)造函數(shù)。#include<iostream>usingnamespacestd;classBox{public:

Box(int,int,int);intvolume();private:intheight;intwidth;intlength;};intmain(){Boxbox1(12,25,30);cout<<box1.volume()<<endl;

Boxbox2(15,30,21);cout<<box2.volume()<<endl;return0;}intBox∷volume(){return(height*width*length);}90009450Box∷Box(inth,intw,intlen){height=h;width=w;length=len;}例9.2有兩個(gè)長(zhǎng)方柱,其長(zhǎng)、寬、高分別為:(1)12,209#include<iostream>usingnamespacestd;classBox{public:

Box∷Box(inth,intw,intlen):height(h),width(w),length(len){}intvolume();private:intheight;intwidth;intlength;};intmain(){Boxbox1(12,25,30);cout<<box1.volume()<<endl;

Boxbox2(15,30,21);cout<<box2.volume()<<endl;return0;}intBox∷volume(){return(height*width*length);}可以用參數(shù)初始化表對(duì)數(shù)據(jù)成員初始化Box∷Box(inth,intw,intlen){height=h;width=w;length=len;}#include<iostream>intmain()109.1.5構(gòu)造函數(shù)的重載在一個(gè)類中可以定義多個(gè)構(gòu)造函數(shù),以便對(duì)類對(duì)象提供不同的初始化的方法,供用戶選用。這些構(gòu)造函數(shù)具有相同的名字,而參數(shù)的個(gè)數(shù)或參數(shù)的類型不相同。這稱為構(gòu)造函數(shù)的重載。當(dāng)有多個(gè)構(gòu)造函數(shù)時(shí),調(diào)用哪一個(gè)構(gòu)造函數(shù)由系統(tǒng)根據(jù)實(shí)參來(lái)決定。9.1.5構(gòu)造函數(shù)的重載在一個(gè)類中可以定義多個(gè)構(gòu)造函數(shù),以#include<iostream>usingnamespacestd;classBox{public:

Box();

Box(inth,intw,intlen):height(h),width(w),length(len){}intvolume();private:intheight;intwidth;intlength;};Box∷Box(){height=10;width=10;length=10;}intmain(){Boxbox1;cout<<box1.volume()<<endl;

Boxbox2(15,30,25);cout<<box2.volume()<<endl;return0;}intBox∷volume(){return(height*width*length);}100011250#include<iostream>intmain()12說(shuō)明:(1)調(diào)用構(gòu)造函數(shù)時(shí)不必給出實(shí)參的構(gòu)造函數(shù),稱為默認(rèn)構(gòu)造函數(shù)。顯然,無(wú)參的構(gòu)造函數(shù)屬于默認(rèn)構(gòu)造函數(shù)。一個(gè)類只能有一個(gè)默認(rèn)構(gòu)造函數(shù)。(2)盡管在一個(gè)類中可以包含多個(gè)構(gòu)造函數(shù),但是對(duì)于每一個(gè)對(duì)象來(lái)說(shuō),建立對(duì)象時(shí)只執(zhí)行其中一個(gè)構(gòu)造函數(shù)。說(shuō)明:9.1.6使用默認(rèn)參數(shù)的構(gòu)造函數(shù)構(gòu)造函數(shù)中參數(shù)的值既可以通過(guò)實(shí)參傳遞,也可以指定為某些默認(rèn)值,即如果用戶不指定實(shí)參值,編譯系統(tǒng)就使形參取默認(rèn)值。9.1.6使用默認(rèn)參數(shù)的構(gòu)造函數(shù)構(gòu)造函數(shù)中參數(shù)的值既可以通#include<iostream>usingnamespacestd;classBox{public:

Box(inth=10,intw=10,intlen=10);intvolume();private:intheight;intwidth;intlength;};Box∷Box(inth,intw,intlen){height=h;width=w;length=len;}intBox∷volume(){return(height*width*length);}intmain(){Boxbox1;cout<<box1.volume()<<endl;Boxbox2(15);cout<<box2.volume()<<endl;Boxbox3(15,30);cout<<box3.volume()<<endl;Boxbox4(15,30,20);cout<<box4.volume()<<endl;return0;}1000150045009000#include<iostream>intBox∷vol15說(shuō)明:(1)應(yīng)該在聲明構(gòu)造函數(shù)時(shí)指定默認(rèn)值,而不能只在定義構(gòu)造函數(shù)時(shí)指定默認(rèn)值。(2)聲明構(gòu)造函數(shù)時(shí),形參名可以省略。(3)如果構(gòu)造函數(shù)的全部參數(shù)都指定了默認(rèn)值,則在定義對(duì)象時(shí)可以給一個(gè)或幾個(gè)實(shí)參,也可以不給出實(shí)參。(4)在一個(gè)類中定義了全部是默認(rèn)參數(shù)的構(gòu)造函數(shù)后,不能再定義重載構(gòu)造函數(shù)。否則會(huì)出現(xiàn)歧義性。說(shuō)明:9.2析構(gòu)函數(shù)析構(gòu)函數(shù)也是一個(gè)特殊的成員函數(shù),它的作用與構(gòu)造函數(shù)相反,它的名字是類名的前面加一個(gè)“~”符號(hào)。當(dāng)對(duì)象的生命期結(jié)束時(shí),會(huì)自動(dòng)執(zhí)行析構(gòu)函數(shù)。析構(gòu)函數(shù)的作用并不是刪除對(duì)象,而是在撤銷對(duì)象占用的內(nèi)存之前完成一些清理工作,使這部分內(nèi)存可以被程序分配給新對(duì)象使用。析構(gòu)函數(shù)不返回任何值,沒(méi)有函數(shù)類型,也沒(méi)有函數(shù)參數(shù)。因此它不能被重載。一個(gè)類可以有多個(gè)構(gòu)造函數(shù),但只能有一個(gè)析構(gòu)函數(shù)。實(shí)際上,析構(gòu)函數(shù)的作用并不僅限于釋放資源方面,它還可以被用來(lái)執(zhí)行“用戶希望在最后一次使用對(duì)象之后所執(zhí)行的任何操作”9.2析構(gòu)函數(shù)析構(gòu)函數(shù)也是一個(gè)特殊的成員函數(shù),它的作用與構(gòu)如果用戶沒(méi)有定義析構(gòu)函數(shù),編譯系統(tǒng)會(huì)自動(dòng)生成一個(gè)析構(gòu)函數(shù),但該函數(shù)是一個(gè)空函數(shù),什么操作都不進(jìn)行。如果用戶沒(méi)有定義析構(gòu)函數(shù),編譯系統(tǒng)會(huì)自動(dòng)生成一個(gè)析構(gòu)函數(shù),但#include<string>#include<iostream>usingnamespacestd;classStudent{public:student(intn,stringnam,chars){num=n;name=nam;sex=s;cout<<’’調(diào)用構(gòu)造函數(shù).’’<<endl;}~Student(){cout<<’’調(diào)用’’<<num<<析構(gòu)函數(shù).’’<<endl;}voiddisplay(){cout<<num<<endl;cout<<name<<endl;cout<<sex<<endl;}private:intnum;charname[10];charsex;};intmain(){Studentstud1(10010,″Wang_li″,′f′);stud1.display();Studentstud2(10011,″Zhang_fun″,′m′);stud2.display();return0;}調(diào)用構(gòu)造函數(shù)10010name:Wang_lisex:f調(diào)用構(gòu)造函數(shù)10011name:Zhang_funsex:m調(diào)用10011析構(gòu)函數(shù)調(diào)用10010析構(gòu)函數(shù)#include<string>intmain()調(diào)用構(gòu)199.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序一般原則:先構(gòu)造的后析構(gòu),后構(gòu)造的先析構(gòu)。并不是在任何情況下都是按這一原則處理的。對(duì)象可以在不同的作用域中定義,可以有不同的存儲(chǔ)類別。這些會(huì)影響調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的時(shí)機(jī)。9.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序一般原則:先構(gòu)造的后析構(gòu)9.4對(duì)象數(shù)組對(duì)象數(shù)組是指數(shù)組的每個(gè)元素都是同類的對(duì)象。假設(shè)已聲明了Student類,定義stud數(shù)組,有50個(gè)元素:

Studentstud[50];在建立數(shù)組時(shí),同樣要調(diào)用構(gòu)造函數(shù)。如果有50個(gè)元素,需要調(diào)用50次構(gòu)造函數(shù)。如果構(gòu)造函數(shù)只有一個(gè)參數(shù),在定義數(shù)組時(shí)可以直接在等號(hào)后面的花括號(hào)內(nèi)提供實(shí)參。如:

Studentstud[3]={60,70,78};9.4對(duì)象數(shù)組對(duì)象數(shù)組是指數(shù)組的每個(gè)元素都是同類的對(duì)象。9.4對(duì)象數(shù)組如果構(gòu)造函數(shù)有多個(gè)參數(shù),定義對(duì)象數(shù)組時(shí),在花括號(hào)中分別寫出構(gòu)造函數(shù)并指定實(shí)參。在建立對(duì)象數(shù)組時(shí),分別調(diào)用構(gòu)造函數(shù),對(duì)每個(gè)元素初始化。每一個(gè)元素的實(shí)參分別用括號(hào)包起來(lái),對(duì)應(yīng)構(gòu)造函數(shù)的一組形參,不會(huì)混淆。Studentstud[3]={Student(1001,18,87),Student(1002,19,76),Student(1003,18,72)}9.4對(duì)象數(shù)組如果構(gòu)造函數(shù)有多個(gè)參數(shù),定義對(duì)象數(shù)組時(shí),在花例9.6對(duì)象數(shù)組的使用方法。#include<iostream>usingnamespacestd;classBox{public:

Box(inth=10,intw=12,intlen=15):height(h),width(w),length(len){}intvolume();private:intheight;intwidth;intlength;};intBox∷volume(){return(height*width*length);}intmain(){Boxa[3]={Box(10,12,15),Box(15,18,20),Box(16,20,26)};cout<<“a[0]體積:”a[0].volume()<<endl;cout<<“a[1]體積:”a[1].volume()<<endl;cout<<“a[2]體積:”a[2].volume()<<endl;return0;}a[0]體積:1800a[1]體積:5400a[2]體積:8320例9.6對(duì)象數(shù)組的使用方法。#include<iostr9.5對(duì)象指針9.5.1指向?qū)ο蟮闹羔樤诮?duì)象時(shí),編譯系統(tǒng)會(huì)為每一個(gè)對(duì)象分配一定的存儲(chǔ)空間,以存放其成員。對(duì)象空間的起始地址就是對(duì)象的指針??梢远x一個(gè)指針變量,用來(lái)存放對(duì)象的指針。Time*pt;Timet1;pt=&t1;(*pt).hourpt->hourt1.hour(*pt).showtime()pt->showtime()

t1.showtime()

9.5對(duì)象指針9.5.1指向?qū)ο蟮闹羔楾ime*pt;9.5.2指向?qū)ο蟪蓡T的指針對(duì)象中的各成員也有地址。(1)指向?qū)ο髷?shù)據(jù)成員的指針定義指向?qū)ο髷?shù)據(jù)成員的指針變量的方法和定義指向普通變量的指針變量方法相同。

int*p1;p1=&t1.hour;cout<<*p1<<endl;9.5.2指向?qū)ο蟪蓡T的指針int*p1;(2)指向?qū)ο蟪蓡T函數(shù)的指針定義指向公用成員函數(shù)的指針變量的一般形式為:返回值類型(類名∷*指針變量名)(參數(shù)表列);為指針變量賦值的形式是:指針變量名=&類名∷成員函數(shù)名;訪問(wèn)指針變量所指向的函數(shù)形式是:(對(duì)象名.*指針變量名)(參數(shù)表列);(2)指向?qū)ο蟪蓡T函數(shù)的指針#include<iostream>usingnamespacestd;classTime{public:Time(int,int,int);inthour;intminute;intsec;voidget_time();};Time∷Time(inth,intm,ints){hour=h;minute=m;sec=s;}voidTime∷get_time(){cout<<hour<<”:”<<minute<<”:”<<sec<<endl;}intmain(){Timet1(10,13,56);int*p1=&t1.hour;cout<<*p1<<endl;t1.get_time();Time*p2=&t1;p2->get_time();void(Time∷*p3)();p3=&Time∷get_time;(t1.*p3)();}1010:13:5610:13:5610:13:56#include<iostream>intmain()9.5.3this指針每個(gè)對(duì)象中的數(shù)據(jù)成員都分別占有存儲(chǔ)空間,如果對(duì)同一個(gè)類定義了n個(gè)對(duì)象,則有n組同樣大小的空間以存放n個(gè)對(duì)象中的數(shù)據(jù)成員。但是,不同對(duì)象都調(diào)用同一個(gè)函數(shù)代碼段。問(wèn)題:當(dāng)不同對(duì)象的成員函數(shù)引用數(shù)據(jù)成員時(shí),怎么能保證引用的是所指定的對(duì)象的數(shù)據(jù)成員呢?解決方法:this指針在每一個(gè)成員函數(shù)中都包含一個(gè)特殊的指針,這個(gè)指針的名字是固定的,稱為this。它的值是當(dāng)前被調(diào)用的成員函數(shù)所在的對(duì)象的起始地址。9.5.3this指針每個(gè)對(duì)象中的數(shù)據(jù)成員都分別占有存儲(chǔ)intBox∷volume(){return(height*width*length);}intBox∷volume(){return(this->height*this->width*this->length);}假設(shè)a是box類對(duì)象當(dāng)執(zhí)行a.volume()時(shí),this=&aintBox∷volume(){return(a.height*a.width*a.length);}intBox∷volume()intBox∷volum9.6共用數(shù)據(jù)的保護(hù)9.6.1常對(duì)象在定義對(duì)象時(shí)指定對(duì)象為常對(duì)象。常對(duì)象必須要有初值,如:Timeconstt1(12,34,46);這樣,對(duì)象t1中的所有數(shù)據(jù)成員的值都不能被修改。定義常對(duì)象的一般形式為類名const對(duì)象名[(實(shí)參表列)];const類名對(duì)象名[(實(shí)參表列)];9.6共用數(shù)據(jù)的保護(hù)9.6.1常對(duì)象類名const對(duì)9.6.2常對(duì)象成員可以將對(duì)象的成員聲明為const,包括常數(shù)據(jù)成員和常成員函數(shù)。常數(shù)據(jù)成員:用關(guān)鍵字const來(lái)聲明常數(shù)據(jù)成員。常數(shù)據(jù)成員的值是不能改變的。只能通過(guò)構(gòu)造函數(shù)的參數(shù)初始化表對(duì)常數(shù)據(jù)成員進(jìn)行初始化。常對(duì)象的數(shù)據(jù)成員都是常數(shù)據(jù)成員,因此常對(duì)象的構(gòu)造函數(shù)只能用參數(shù)初始化表對(duì)常數(shù)據(jù)成員進(jìn)行初始化。constinthour;//聲明hour為常數(shù)據(jù)成員Time∷Time(inth):hour(h){}9.6.2常對(duì)象成員constinthour;常成員函數(shù)將成員函數(shù)聲明為常成員函數(shù):voidget_time()const;//注意const的位置在函數(shù)名和括號(hào)之后const是函數(shù)類型的一部分,在聲明函數(shù)和定義函數(shù)時(shí)都要有該關(guān)鍵字,在調(diào)用時(shí)不必加const。常成員函數(shù)可以引用const數(shù)據(jù)成員,也可以引用非const的數(shù)據(jù)成員。但是都不能修改它們。const數(shù)據(jù)成員可以被const成員函數(shù)引用,也可以被非const的成員函數(shù)引用。常對(duì)象中的成員函數(shù)不一定都是常成員函數(shù)。常對(duì)象只保證其數(shù)據(jù)成員是常數(shù)據(jù)成員。常成員函數(shù)怎樣利用常成員函數(shù)呢?(1)如果在一個(gè)類中,有些數(shù)據(jù)成員的值允許改變,另一些數(shù)據(jù)成員的值不允許改變,則可以將一部分?jǐn)?shù)據(jù)成員聲明為const,以保證其值不被改變,可以用非const的成員函數(shù)引用這些數(shù)據(jù)成員的值,并修改非const數(shù)據(jù)成員的值。(2)如果要求所有的數(shù)據(jù)成員的值都不允許改變,則可以將所有的數(shù)據(jù)成員聲明為const,或?qū)?duì)象聲明為const(常對(duì)象),然后用const成員函數(shù)引用數(shù)據(jù)成員,這樣起到“雙保險(xiǎn)”的作用,切實(shí)保證了數(shù)據(jù)成員不被修改。怎樣利用常成員函數(shù)呢?(3)如果已定義了一個(gè)常對(duì)象,則只能調(diào)用其中的const成員函數(shù),而不能調(diào)用非const成員函數(shù)(不論這些函數(shù)是否會(huì)修改對(duì)象中的數(shù)據(jù))。這是為了保證數(shù)據(jù)的安全。(4)當(dāng)希望在調(diào)用函數(shù)時(shí)對(duì)象的值不被修改,就應(yīng)當(dāng)把形參定義為指向常對(duì)象的指針變量,同時(shí)用對(duì)象的地址作實(shí)參(對(duì)象可以是const或非const型)。如果要求該對(duì)象不僅在調(diào)用函數(shù)過(guò)程中不被改變,而且要求它在程序執(zhí)行過(guò)程中都不改變,則應(yīng)把它定義為const型。(3)如果已定義了一個(gè)常對(duì)象,則只能調(diào)用其中的const成9.6.3指向?qū)ο蟮某V羔槍⒅羔樧兞柯暶鳛閏onst型,這樣指針值始終保持為其初值,不能改變。如注意:指向?qū)ο蟮某V羔樧兞康闹挡荒芨淖?,但可以改變其所指向?qū)ο?如t1)的值。定義指向?qū)ο蟮某V羔樀囊话阈问綖轭惷?const指針變量名;Timet1(10,12,15),t2;//定義對(duì)象Time*constptr1;//const位置在指針變量名前面,規(guī)定ptr1的值是常值ptr1=&t1;//ptr1指向?qū)ο髏1,此后不能再改變指向ptr1=&t2;//錯(cuò)誤,ptr1不能改變指向9.6.3指向?qū)ο蟮某V羔槍⒅羔樧兞柯暶鳛閏onst型,這9.6.4指向常對(duì)象的指針變量定義指向常對(duì)象的指針變量的一般形式為const類型名*指針變量名;例:constTime*ptr;說(shuō)明ptr指向的Time類對(duì)象是常對(duì)象,不能通過(guò)ptr來(lái)改變其值。注意:(1)如果一個(gè)對(duì)象已被聲明為常對(duì)象,只能用指向常對(duì)象的指針變量指向它,而不能用一般的(指向非const型對(duì)象的)指針變量去指向它。(2)如果定義了一個(gè)指向常對(duì)象的指針變量,并使它指向一個(gè)非const的對(duì)象,則其指向的對(duì)象是不能通過(guò)指針來(lái)改變的。(3)如果定義了一個(gè)指向常對(duì)象的指針變量,是不能通過(guò)它改變所指向的對(duì)象的值的,但是指針變量本身的值是可以改變的。9.6.4指向常對(duì)象的指針變量定義指向常對(duì)象的指針變量的一9.6.5對(duì)象的常引用例9.8對(duì)象的常引用。#include<iostream>usingnamespacestd;classTime{public:Time(int,int,int);inthour;intminute;intsec;};Time∷Time(inth,intm,ints){hour=h;minute=m;sec=s;}voidfun(Time&t)//形參t是Time類對(duì)象的引用{t.hour=18;}intmain(){Timet1(10,13,56);fun(t1);cout<<t1.hour<<endl;return0;}以上程序修改了t1的hour成員的值。如果不希望在函數(shù)中修改實(shí)參t1的值,可以把引用變量t聲明為const(常引用),函數(shù)原型為:voidfun(constTime&t);9.6.5對(duì)象的常引用例9.8對(duì)象的常引用。#inclu在C++面向?qū)ο蟪绦蛟O(shè)計(jì)中,經(jīng)常用常指針和常引用作函數(shù)參數(shù)。這樣既能保證數(shù)據(jù)安全,使數(shù)據(jù)不能被隨意修改。形式含義Timeconstt1;t1是常對(duì)象,其值在任何情況下都不能改變voidTime∷fun()constfun是Time類中的常成員函數(shù),可以引用,但不能修改本類中的數(shù)據(jù)成員Time*constp;p是指向Time對(duì)象的常指針,p的值(即p的指向)不能改變constTime*p;p是指向Time類常對(duì)象的指針,其指向的類對(duì)象的值不能通過(guò)指針來(lái)改變?cè)贑++面向?qū)ο蟪绦蛟O(shè)計(jì)中,經(jīng)常用常指針和常引用作函數(shù)參數(shù)。9.7對(duì)象的動(dòng)態(tài)建立和釋放用前面介紹的方法定義的對(duì)象是靜態(tài)的,在程序運(yùn)行過(guò)程中,對(duì)象所占的空間是不能隨時(shí)釋放的。但有時(shí)人們希望在需要用到對(duì)象時(shí)才建立對(duì)象,在不需要用該對(duì)象時(shí)就撤銷它,釋放它所占的內(nèi)存空間以供別的數(shù)據(jù)使用。這樣可提高內(nèi)存空間的利用率??梢杂胣ew運(yùn)算符動(dòng)態(tài)建立對(duì)象,用delete運(yùn)算符撤銷對(duì)象。9.7對(duì)象的動(dòng)態(tài)建立和釋放用前面介紹的方法定義的對(duì)象是靜態(tài)如果已經(jīng)定義了一個(gè)Box類,可以用下面的方法動(dòng)態(tài)地建立一個(gè)對(duì)象:newbox用new運(yùn)算符動(dòng)態(tài)地分配內(nèi)存后,將返回新對(duì)象的起始地址。

在程序中就可以通過(guò)pt訪問(wèn)這個(gè)新建的對(duì)象。如Box*pt;//定義一個(gè)指向Box類對(duì)象的指針變量pt=newBox;//在pt中存放了新建對(duì)象的起始地址cout<<pt->height;//輸出對(duì)象的height成員cout<<pt->volume();//調(diào)用對(duì)象的volume函數(shù)求體積如果已經(jīng)定義了一個(gè)Box類,可以用下面的方法動(dòng)態(tài)地建立一個(gè)對(duì)允許在執(zhí)行new時(shí),對(duì)新建立的對(duì)象進(jìn)行初始化。不再需要使用由new建立的對(duì)象時(shí),可以用delete運(yùn)算符予以釋放。在執(zhí)行delete運(yùn)算符時(shí),在釋放內(nèi)存空間之前,自動(dòng)調(diào)用析構(gòu)函數(shù),完成有關(guān)善后清理工作。Box*pt=newBox(12,15,18);deletept;//釋放pt指向的內(nèi)存空間允許在執(zhí)行new時(shí),對(duì)新建立的對(duì)象進(jìn)行初始化。Box*pt9.8對(duì)象的賦值和復(fù)制9.8.1對(duì)象的賦值如果對(duì)一個(gè)類定義了兩個(gè)或多個(gè)對(duì)象,則這些同類的對(duì)象之間可以互相賦值,或者說(shuō),一個(gè)對(duì)象的值可以賦給另一個(gè)同類的對(duì)象。這里所指的對(duì)象的值是指對(duì)象中所有數(shù)據(jù)成員的值。對(duì)象之間的賦值也是通過(guò)賦值運(yùn)算符“=”進(jìn)行的。對(duì)象賦值的一般形式為:

對(duì)象名1=對(duì)象名2;9.8對(duì)象的賦值和復(fù)制9.8.1對(duì)象的賦值#include<iostream>usingnamespacestd;classBox{public:

Box(inth=10,intw=10,intlen=10);intvolume();private:intheight;intwidth;intlength;};Box∷Box(inth,intw,intlen){height=h;width=w;length=len;}intBox∷volume(){return(height*width*length);}intmain(){Boxbox1(15,30,25),box2;cout<<box1.volume()<<endl;box2=box1;cout<<box2.volume()<<endl;return0;}1125011250對(duì)象的賦值只對(duì)其中的數(shù)據(jù)成員賦值,而不對(duì)成員函數(shù)賦值。#include<iostream>intBox∷vol439.8.2對(duì)象的復(fù)制例如:Boxbox2(box1);作用是用已有的對(duì)象box1去克隆出一個(gè)新對(duì)象box2。對(duì)象復(fù)制的一般形式為:類名對(duì)象2(對(duì)象1);用對(duì)象1復(fù)制出對(duì)象2。這實(shí)際上也是建立對(duì)象的語(yǔ)句,建立對(duì)象2。C++還提供另一種方便用戶的復(fù)制形式,用賦值號(hào)代括號(hào),其形式是:類名對(duì)象名1=對(duì)象名2;如:Boxbox2=box1,box3=box1;9.8.2對(duì)象的復(fù)制例如:Boxbox2(box1);對(duì)象的賦值與復(fù)制的區(qū)別:對(duì)象的賦值是對(duì)一個(gè)已經(jīng)存在的對(duì)象賦值,因此必須先定義被賦值的對(duì)象,才能進(jìn)行賦值。而對(duì)象的復(fù)制則是從無(wú)到有地建立一個(gè)新對(duì)象,并使它與一個(gè)已有的對(duì)象完全相同(包括對(duì)象的結(jié)構(gòu)和成員的值)。對(duì)象的賦值與復(fù)制的區(qū)別:9.9靜態(tài)成員在c++中,可以將關(guān)鍵字static用于類的某成員,這樣該成員就成為靜態(tài)成員了。靜態(tài)成員包括:靜態(tài)數(shù)據(jù)成員、靜態(tài)成員函數(shù)。一旦把類的某成員聲明為靜態(tài),則無(wú)論這個(gè)類創(chuàng)建多少個(gè)對(duì)象都只有靜態(tài)成員的一個(gè)拷貝,即靜態(tài)成員被類的所有對(duì)象共享。9.9靜態(tài)成員在c++中,可以將關(guān)鍵字static用于類的9.9.1靜態(tài)數(shù)據(jù)成員 classBox{public:intvolume();private:

staticintheight;intwidth;intlength;};height為靜態(tài)數(shù)據(jù)成員,它為各對(duì)象所共有。即使有多個(gè)box對(duì)象,height在內(nèi)存中只占一份空間(而不是每個(gè)對(duì)象都分別為它保留一份空間)。height的值對(duì)所有對(duì)象都是一樣的,如果改變它的值,則各對(duì)象height的值都同時(shí)改變了。9.9.1靜態(tài)數(shù)據(jù)成員 classBoxheight為靜#include<iostream>usingnamespacestd;classBox{public:Box(int,int);intvolume();staticintheight;intwidth;intlength;};Box∷Box(intw,intlen){width=w;length=len;}intBox∷volume(){return(height*width*length);}intBox∷height=10;intmain(){Boxa(15,20),b(20,30);cout<<a.height<<endl;cout<<b.height<<endl;cout<<Box∷height<<endl;cout<<a.volume()<<endl;return0;}(1)在一個(gè)類中可以有一個(gè)或多個(gè)靜態(tài)數(shù)據(jù)成員。靜態(tài)數(shù)據(jù)成員不屬于某一個(gè)對(duì)象,在為對(duì)象所分配的空間中不包括靜態(tài)數(shù)據(jù)成員所占的空間。靜態(tài)數(shù)據(jù)成員是在所有對(duì)象之外單獨(dú)開(kāi)辟空間。只要在類中定義了靜態(tài)數(shù)據(jù)成員,即使不定義對(duì)象,也為靜態(tài)數(shù)據(jù)成員分配空間。(2)靜態(tài)數(shù)據(jù)成員可以初始化,但只能在類體外進(jìn)行初始化。形式為:數(shù)據(jù)類型類名∷靜態(tài)數(shù)據(jù)成員名=初值;(3)靜態(tài)數(shù)據(jù)成員既可以通過(guò)對(duì)象名引用,也可以通過(guò)類名來(lái)引用。(4)靜態(tài)數(shù)據(jù)成員是在程序編譯時(shí)被分配空間的,到程序結(jié)束時(shí)才釋放空間。#include<iostream>intmain()48如果靜態(tài)數(shù)據(jù)成員被定義為私有的,則不能在類外直接引用,而必須通過(guò)公用的成員函數(shù)引用。如果靜態(tài)數(shù)據(jù)成員被定義為私有的,則不能在類外直接引用,而必須#include<iostream>usingnamespacestd;classObjcount{private:intcount;public:Objcount(){count=0;}voidtotal(){count++;}intget(){returncount;}};intmain(){Objcounta1;a1.total();cout<<a1.get()<<endl;Objcounta2;a2.total();cout<<a2.get()<<endl;Objcounta3;a3.total();cout<<a3.get()<<endl;return0;}111#include<iostream>intmain()150#include<iostream>usingnamespacestd;classObjcount{private:staticintcount;public:Objcount(){count++;}intget(){returncount;}};intObjcount::count=0;intmain(){Objcounta1,a2,a3;cout<<”對(duì)象的數(shù)量是:”<<a1.get();cout<<”對(duì)象的數(shù)量是:”<<a2.get();cout<<”對(duì)象的數(shù)量是:”<<Objcount.get();}該程序可用來(lái)統(tǒng)計(jì)Objcount對(duì)象的個(gè)數(shù)。若將static去掉,就不能完成該功能。333#include<iostream>該程序可用來(lái)統(tǒng)計(jì)Obj519.9.2靜態(tài)成員函數(shù)成員函數(shù)也可以定義為靜態(tài)的。與靜態(tài)數(shù)據(jù)成員不同,靜態(tài)成員函數(shù)的作用不是為了對(duì)象之間的溝通,而是為了能處理靜態(tài)數(shù)據(jù)成員。靜態(tài)成員函數(shù)可以訪問(wèn)靜態(tài)數(shù)據(jù)成員,而不能訪問(wèn)非靜態(tài)成員。9.9.2靜態(tài)成員函數(shù)成員函數(shù)也可以定義為靜態(tài)的。#include<iostream>usingnamespacestd;classObjcount{private:staticintcount;public:Objcount(){count++;}staticintget(){returncount;}};intObjcount::count=0;intmain(){Objcounta1,a2,a3;cout<<”對(duì)象的數(shù)量是:”<<Objcount.get();

}#include<iostream>53#include<iostream>usingnamespacestd;classStudent{public:Student(intn,inta,floats):num(n),age(a),score(s){}voidtotal();staticfloataverage();private:intnum;intage;floatscore;staticfloatsum;staticintcount;};voidStudent∷total(){sum+=score;count++;}floatStudent∷average(){return(sum/count);}floatStudent∷sum=0;intStudent∷count=0;intmain(){Studentstud[3]={Student(1001,18,70),Student(1002,19,78),Student(1005,20,98)};intn;cout<<’’請(qǐng)輸入學(xué)生數(shù)量:”;cin>>n;for(inti=0;i<n;i++)stud[i].total();cout<<’’平均分:’’<<Student∷average();cout<<endl;return0;}3↙

82.3333#include<iostream>floatStud549.10友元前面講過(guò),如果在類外要訪問(wèn)私有成員,必須通過(guò)公用的成員函數(shù),在有些情況下,這種要求也存在問(wèn)題:如果某些成員函數(shù)多次連續(xù)調(diào)用時(shí),由于參數(shù)傳遞、類型檢查等所花的開(kāi)銷很大,使程序運(yùn)行的效率大為降低。為此,c++提供了一種機(jī)制:友元。友元可以訪問(wèn)與其有好友關(guān)系的類中的私有成員。友元包括:友元函數(shù)和友元類。9.10友元前面講過(guò),如果在類外要訪問(wèn)私有成員,必須通過(guò)公友元函數(shù)是能夠訪問(wèn)類的所有成員的函數(shù),友元函數(shù)可以是不屬于任何類的非成員函數(shù),也可以是其他類的成員函數(shù)。一個(gè)函數(shù)可以是多個(gè)類的友元函數(shù)。將一個(gè)函數(shù)聲明為某個(gè)類的友元函數(shù)的方法是:在該類聲明中提供一個(gè)以friend開(kāi)頭的函數(shù)原型。至于友元函數(shù)的定義,可以在類的內(nèi)部也可以在類的外部。注意:友元函數(shù)不是該類的成員函數(shù)。友元函數(shù)是能夠訪問(wèn)類的所有成員的函數(shù),友元函數(shù)可以是不屬于任1、將普通函數(shù)聲明為友元函數(shù)例9.12友元函數(shù)的簡(jiǎn)單例子。1、將普通函數(shù)聲明為友元函數(shù)#include<iostream>usingnamespacestd;classTime{public:Time(int,int,int);friendvoiddisplay(Time&t);//聲明display函數(shù)為Time類的友元函數(shù)private:inthour;intminute;intsec;};Time∷Time(inth,intm,ints){hour=h;minute=m;sec=s;}voiddisplay(Time&t){cout<<t.hour<<″:″<<t.minute<<″:″<<t.sec<<endl;}intmain(){Timet1(10,13,56);display(t1);return0;}10:13:56注意:(1)例子中的友元函數(shù)是個(gè)普通函數(shù),不屬于任何類,在定義時(shí),不應(yīng)在函數(shù)名前用類名加以限制。(2)友元函數(shù)要對(duì)類的成員進(jìn)行訪問(wèn),必須顯式地指明要訪問(wèn)的對(duì)象。#include<iostream>intmain()582、友元成員函數(shù)友元函數(shù)不僅可以是一般函數(shù),而且可以是另一個(gè)類中的成員函數(shù)。例9.13友元成員函數(shù)的簡(jiǎn)單應(yīng)用。2、友元成員函數(shù)#include<iostream>usingnamespacestd;classDate;//對(duì)Date類的提前引用聲明classTime{public:Time(inth,intm,ints);voiddisplay(Date&);private:inthour;intminute;intsec;};classDate{public:Date(intm,intd,inty);friendvoidTime∷display(Date&);//聲明Time中的display函數(shù)為友元成員函數(shù)private:intmonth;intday;intyear;};intmain(){Timet1(10,13,56);Dated1(12,25,2004);t1.display(d1);return0;}Time∷Time(inth,intm,ints){hour=h;minute=m;sec=s;}voidTime∷display(Date&d){cout<<d.month<<’’/’’<<d.day<<’’/’’<<d.year;cout<<endl;cout<<hour<<’’:’’<<minute<<’’:’’<<sec<<endl;}Date∷Date(intm,intd,inty){month=m;day=d;year=y;}12/25/200410:13:56#include<iostream>intmain()60在一般情況下,對(duì)象必須先聲明,然后才能使用它。但在有些情況下,在正式聲明類之前,需要使用該類名。C++允許對(duì)類作“提前引用”的聲明,即在正式聲明一個(gè)類之前,先聲明一個(gè)類名,表示此類將在稍后聲明。提前引用聲明,它只包含類名,不包括類體。應(yīng)當(dāng)注意:類的提前聲明的使用范圍是有限的。只有在正式聲明一個(gè)類以后才能用它去定義類對(duì)象。在對(duì)一個(gè)類作了提前引用聲明后,可以用該類的名字去定義指向該類型對(duì)象的指針變量或?qū)ο蟮囊米兞吭谝话闱闆r下,對(duì)象必須先聲明,然后才能使用它。但在有些情況下3.一個(gè)函數(shù)(包括普通函數(shù)和成員函數(shù))可以被多個(gè)類聲明為“朋友”,這樣就可以引用多個(gè)類中的私有數(shù)據(jù)3.一個(gè)函數(shù)(包括普通函數(shù)和成員函數(shù))可以被多個(gè)類聲明為“9.10.2友元類不僅可以將一個(gè)函數(shù)聲明為一個(gè)類的“朋友”,而且可以將一個(gè)類(例如B類)聲明為另一個(gè)類(例如A類)的“朋友”。這時(shí)B類就是A類的友元類。友元類B中的所有函數(shù)都是A類的友元函數(shù),可以訪問(wèn)A類中的所有成員。在A類的定義體中用以下語(yǔ)句聲明B類為其友元類:

friendB;聲明友元類的一般形式為friend類名;9.10.2友元類不僅可以將一個(gè)函數(shù)聲明為一個(gè)類的“朋友”注意:友元的關(guān)系是單向的而不是雙向的。友元的關(guān)系不能傳遞。在實(shí)際工作中,除非確有必要,一般并不把整個(gè)類聲明為友元類,而只將確實(shí)有需要的成員函數(shù)聲明為友元函數(shù),這樣更安全一些。注意:第9章關(guān)于類和對(duì)象的進(jìn)一步說(shuō)明第9章關(guān)于類和對(duì)象的進(jìn)一步說(shuō)明659.1構(gòu)造函數(shù)問(wèn)題:前面是用成員函數(shù)來(lái)對(duì)對(duì)象中的數(shù)據(jù)成員賦初值的,如果對(duì)一個(gè)類定義了多個(gè)對(duì)象,那么,程序就顯得非常復(fù)雜煩瑣。另外,類聲明中,也無(wú)法對(duì)對(duì)象的各數(shù)據(jù)成員賦值。解決方法:用構(gòu)造函數(shù)對(duì)對(duì)象中的數(shù)據(jù)成員賦初值。9.1構(gòu)造函數(shù)問(wèn)題:前面是用成員函數(shù)來(lái)對(duì)對(duì)象中的數(shù)據(jù)成員賦classTime{intnum=0;charname=’’ab’’;charsex=’f’;};classStudent{private:intnum;charname[20];charsex;public:voidset(){cin>>num>>name>>sex;}voiddisplay(){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;}};intmain(){Students1,s2,s3;s1.set();s2.set();s3.set();s1.display();s2.display();s3.display();}主程序復(fù)雜錯(cuò)誤,在聲明類時(shí)不能對(duì)數(shù)據(jù)成員初始化classTimeclassStudentintma679.1.2構(gòu)造函數(shù)的作用構(gòu)造函數(shù)是一種特殊的成員函數(shù),不需要用戶來(lái)調(diào)用,而是在建立對(duì)象時(shí)自動(dòng)執(zhí)行。構(gòu)造函數(shù)的特點(diǎn):(1)構(gòu)造函數(shù)的名字必須與類名同名,而不能由用戶任意命名;(2)構(gòu)造函數(shù)不具有任何類型,不返回任何值。用戶根據(jù)初始化的要求設(shè)計(jì)函數(shù)體和函數(shù)參數(shù)。9.1.2構(gòu)造函數(shù)的作用例9.1在例8.3基礎(chǔ)上定義構(gòu)造成員函數(shù)。intmain(){Timet1;t1.set_time();t1.show_time();Timet2;t2.show_time();return0;}voidTime∷set_time(){cin>>hour;cin>>minute;cin>>sec;}voidTime∷show_time(){cout<<hour<<’’:’’<<minute<<’’:’’<<sec<<endl;}Time∷Time(){hour=0;minute=0;sec=0;}#include<iostream>usingnamespacestd;classTime{public:Time();voidset_time();voidshow_time();private:inthour;intminute;intsec;};102554↙

10:25:540:0:0例9.1在例8.3基礎(chǔ)上定義構(gòu)造成員函數(shù)。intmain69對(duì)構(gòu)造函數(shù)的說(shuō)明(1)構(gòu)造函數(shù)的定義可以寫在類內(nèi),也可以在類外。如果定義寫在類外,則必須在類內(nèi)聲明構(gòu)造函數(shù)的原型,而且類外定義時(shí)要指明其所屬的類。(2)在建立對(duì)象時(shí)系統(tǒng)自動(dòng)執(zhí)行構(gòu)造函數(shù),進(jìn)行初始化,對(duì)各數(shù)據(jù)成員賦初值。(3)構(gòu)造函數(shù)不需用戶調(diào)用,也不能被用戶調(diào)用。它是由系統(tǒng)自動(dòng)調(diào)用。(4)構(gòu)造函數(shù)沒(méi)有返回值,不能在定義構(gòu)造函數(shù)時(shí)聲明類型。(不能加void)對(duì)構(gòu)造函數(shù)的說(shuō)明(5)在構(gòu)造函數(shù)的函數(shù)體中不僅可以對(duì)數(shù)據(jù)成員賦初值,而且可以包含其他語(yǔ)句。但是一般不提倡在構(gòu)造函數(shù)中加入與初始化無(wú)關(guān)的內(nèi)容,以保持程序的清晰。(6)如果用戶自己沒(méi)有定義構(gòu)造函數(shù),則C++系統(tǒng)會(huì)自動(dòng)生成一個(gè)構(gòu)造函數(shù),只是這個(gè)構(gòu)造函數(shù)的函數(shù)體是空的,也沒(méi)有參數(shù),不執(zhí)行初始化操作。(5)在構(gòu)造函數(shù)的函數(shù)體中不僅可以對(duì)數(shù)據(jù)成員賦初值,而且可以9.1.3帶參數(shù)的構(gòu)造函數(shù)前面的方法使每個(gè)對(duì)象都有同一初值,有時(shí)用戶希望對(duì)不同的對(duì)象賦予不同的值,可采用帶參數(shù)的構(gòu)造函數(shù)。構(gòu)造函數(shù)首部格式:構(gòu)造函數(shù)名(類型1形參1,類型2形參2,…)定義對(duì)象的格式:類名對(duì)象名(實(shí)參1,實(shí)參2,…);在建立對(duì)象時(shí),將實(shí)參數(shù)據(jù)傳給構(gòu)造函數(shù)的形參。9.1.3帶參數(shù)的構(gòu)造函數(shù)前面的方法使每個(gè)對(duì)象都有同一初值例9.2有兩個(gè)長(zhǎng)方柱,其長(zhǎng)、寬、高分別為:(1)12,20,25;(2)10,14,20。求它們的體積。編一個(gè)基于對(duì)象的程序,在類中用帶參數(shù)的構(gòu)造函數(shù)。#include<iostream>usingnamespacestd;classBox{public:

Box(int,int,int);intvolume();private:intheight;intwidth;intlength;};intmain(){Boxbox1(12,25,30);cout<<box1.volume()<<endl;

Boxbox2(15,30,21);cout<<box2.volume()<<endl;return0;}intBox∷volume(){return(height*width*length);}90009450Box∷Box(inth,intw,intlen){height=h;width=w;length=len;}例9.2有兩個(gè)長(zhǎng)方柱,其長(zhǎng)、寬、高分別為:(1)12,2073#include<iostream>usingnamespacestd;classBox{public:

Box∷Box(inth,intw,intlen):height(h),width(w),length(len){}intvolume();private:intheight;intwidth;intlength;};intmain(){Boxbox1(12,25,30);cout<<box1.volume()<<endl;

Boxbox2(15,30,21);cout<<box2.volume()<<endl;return0;}intBox∷volume(){return(height*width*length);}可以用參數(shù)初始化表對(duì)數(shù)據(jù)成員初始化Box∷Box(inth,intw,intlen){height=h;width=w;length=len;}#include<iostream>intmain()749.1.5構(gòu)造函數(shù)的重載在一個(gè)類中可以定義多個(gè)構(gòu)造函數(shù),以便對(duì)類對(duì)象提供不同的初始化的方法,供用戶選用。這些構(gòu)造函數(shù)具有相同的名字,而參數(shù)的個(gè)數(shù)或參數(shù)的類型不相同。這稱為構(gòu)造函數(shù)的重載。當(dāng)有多個(gè)構(gòu)造函數(shù)時(shí),調(diào)用哪一個(gè)構(gòu)造函數(shù)由系統(tǒng)根據(jù)實(shí)參來(lái)決定。9.1.5構(gòu)造函數(shù)的重載在一個(gè)類中可以定義多個(gè)構(gòu)造函數(shù),以#include<iostream>usingnamespacestd;classBox{public:

Box();

Box(inth,intw,intlen):height(h),width(w),length(len){}intvolume();private:intheight;intwidth;intlength;};Box∷Box(){height=10;width=10;length=10;}intmain(){Boxbox1;cout<<box1.volume()<<endl;

Boxbox2(15,30,25);cout<<box2.volume()<<endl;return0;}intBox∷volume(){return(height*width*length);}100011250#include<iostream>intmain()76說(shuō)明:(1)調(diào)用構(gòu)造函數(shù)時(shí)不必給出實(shí)參的構(gòu)造函數(shù),稱為默認(rèn)構(gòu)造函數(shù)。顯然,無(wú)參的構(gòu)造函數(shù)屬于默認(rèn)構(gòu)造函數(shù)。一個(gè)類只能有一個(gè)默認(rèn)構(gòu)造函數(shù)。(2)盡管在一個(gè)類中可以包含多個(gè)構(gòu)造函數(shù),但是對(duì)于每一個(gè)對(duì)象來(lái)說(shuō),建立對(duì)象時(shí)只執(zhí)行其中一個(gè)構(gòu)造函數(shù)。說(shuō)明:9.1.6使用默認(rèn)參數(shù)的構(gòu)造函數(shù)構(gòu)造函數(shù)中參數(shù)的值既可以通過(guò)實(shí)參傳遞,也可以指定為某些默認(rèn)值,即如果用戶不指定實(shí)參值,編譯系統(tǒng)就使形參取默認(rèn)值。9.1.6使用默認(rèn)參數(shù)的構(gòu)造函數(shù)構(gòu)造函數(shù)中參數(shù)的值既可以通#include<iostream>usingnamespacestd;classBox{public:

Box(inth=10,intw=10,intlen=10);intvolume();private:intheight;intwidth;intlength;};Box∷Box(inth,intw,intlen){height=h;width=w;length=len;}intBox∷volume(){return(height*width*length);}intmain(){Boxbox1;cout<<box1.volume()<<endl;Boxbox2(15);cout<<box2.volume()<<endl;Boxbox3(15,30);cout<<box3.volume()<<endl;Boxbox4(15,30,20);cout<<box4.volume()<<endl;return0;}1000150045009000#include<iostream>intBox∷vol79說(shuō)明:(1)應(yīng)該在聲明構(gòu)造函數(shù)時(shí)指定默認(rèn)值,而不能只在定義構(gòu)造函數(shù)時(shí)指定默認(rèn)值。(2)聲明構(gòu)造函數(shù)時(shí),形參名可以省略。(3)如果構(gòu)造函數(shù)的全部參數(shù)都指定了默認(rèn)值,則在定義對(duì)象時(shí)可以給一個(gè)或幾個(gè)實(shí)參,也可以不給出實(shí)參。(4)在一個(gè)類中定義了全部是默認(rèn)參數(shù)的構(gòu)造函數(shù)后,不能再定義重載構(gòu)造函數(shù)。否則會(huì)出現(xiàn)歧義性。說(shuō)明:9.2析構(gòu)函數(shù)析構(gòu)函數(shù)也是一個(gè)特殊的成員函數(shù),它的作用與構(gòu)造函數(shù)相反,它的名字是類名的前面加一個(gè)“~”符號(hào)。當(dāng)對(duì)象的生命期結(jié)束時(shí),會(huì)自動(dòng)執(zhí)行析構(gòu)函數(shù)。析構(gòu)函數(shù)的作用并不是刪除對(duì)象,而是在撤銷對(duì)象占用的內(nèi)存之前完成一些清理工作,使這部分內(nèi)存可以被程序分配給新對(duì)象使用。析構(gòu)函數(shù)不返回任何值,沒(méi)有函數(shù)類型,也沒(méi)有函數(shù)參數(shù)。因此它不能被重載。一個(gè)類可以有多個(gè)構(gòu)造函數(shù),但只能有一個(gè)析構(gòu)函數(shù)。實(shí)際上,析構(gòu)函數(shù)的作用并不僅限于釋放資源方面,它還可以被用來(lái)執(zhí)行“用戶希望在最后一次使用對(duì)象之后所執(zhí)行的任何操作”9.2析構(gòu)函數(shù)析構(gòu)函數(shù)也是一個(gè)特殊的成員函數(shù),它的作用與構(gòu)如果用戶沒(méi)有定義析構(gòu)函數(shù),編譯系統(tǒng)會(huì)自動(dòng)生成一個(gè)析構(gòu)函數(shù),但該函數(shù)是一個(gè)空函數(shù),什么操作都不進(jìn)行。如果用戶沒(méi)有定義析構(gòu)函數(shù),編譯系統(tǒng)會(huì)自動(dòng)生成一個(gè)析構(gòu)函數(shù),但#include<string>#include<iostream>usingnamespacestd;classStudent{public:student(intn,stringnam,chars){num=n;name=nam;sex=s;cout<<’’調(diào)用構(gòu)造函數(shù).’’<<endl;}~Student(){cout<<’’調(diào)用’’<<num<<析構(gòu)函數(shù).’’<<endl;}voiddisplay(){cout<<num<<endl;cout<<name<<endl;cout<<sex<<endl;}private:intnum;charname[10];charsex;};intmain(){Studentstud1(10010,″Wang_li″,′f′);stud1.display();Studentstud2(10011,″Zhang_fun″,′m′);stud2.display();return0;}調(diào)用構(gòu)造函數(shù)10010name:Wang_lisex:f調(diào)用構(gòu)造函數(shù)10011name:Zhang_funsex:m調(diào)用10011析構(gòu)函數(shù)調(diào)用10010析構(gòu)函數(shù)#include<string>intmain()調(diào)用構(gòu)839.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序一般原則:先構(gòu)造的后析構(gòu),后構(gòu)造的先析構(gòu)。并不是在任何情況下都是按這一原則處理的。對(duì)象可以在不同的作用域中定義,可以有不同的存儲(chǔ)類別。這些會(huì)影響調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的時(shí)機(jī)。9.3調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序一般原則:先構(gòu)造的后析構(gòu)9.4對(duì)象數(shù)組對(duì)象數(shù)組是指數(shù)組的每個(gè)元素都是同類的對(duì)象。假設(shè)已聲明了Student類,定義stud數(shù)組,有50個(gè)元素:

Studentstud[50];在建立數(shù)組時(shí),同樣要調(diào)用構(gòu)造函數(shù)。如果有50個(gè)元素,需要調(diào)用50次構(gòu)造函數(shù)。如果構(gòu)造函數(shù)只有一個(gè)參數(shù),在定義數(shù)組時(shí)可以直接在等號(hào)后面的花括號(hào)內(nèi)提供實(shí)參。如:

Studentstud[3]={60,70,78};9.4對(duì)象數(shù)組對(duì)象數(shù)組是指數(shù)組的每個(gè)元素都是同類的對(duì)象。9.4對(duì)象數(shù)組如果構(gòu)造函數(shù)有多個(gè)參數(shù),定義對(duì)象數(shù)組時(shí),在花括號(hào)中分別寫出構(gòu)造函數(shù)并指定實(shí)參。在建立對(duì)象數(shù)組時(shí),分別調(diào)用構(gòu)造函數(shù),對(duì)每個(gè)元素初始化。每一個(gè)元素的實(shí)參分別用括號(hào)包起來(lái),對(duì)應(yīng)構(gòu)造函數(shù)的一組形參,不會(huì)混淆。Studentstud[3]={Student(1001,18,87),Student(1002,19,76),Student(1003,18,72)}9.4對(duì)象數(shù)組如果構(gòu)造函數(shù)有多個(gè)參數(shù),定義對(duì)象數(shù)組時(shí),在花例9.6對(duì)象數(shù)組的使用方法。#include<iostream>usingnamespacestd;classBox{public:

Box(inth=10,intw=12,intlen=15):height(h),width(w),length(len){}intvolume();private:intheight;intwidth;intlength;};intBox∷volume(){return(height*width*length);}intmain(){Boxa[3]={Box(10,12,15),Box(15,18,20),Box(16,20,26)};cout<<“a[0]體積:”a[0].volume()<<endl;cout<<“a[1]體積:”a[1].volume()<<endl;cout<<“a[2]體積:”a[2].volume()<<endl;return0;}a[0]體積:1800a[1]體積:5400a[2]體積:8320例9.6對(duì)象數(shù)組的使用方法。#include<iostr9.5對(duì)象指針9.5.1指向?qū)ο蟮闹羔樤诮?duì)象時(shí),編譯系統(tǒng)會(huì)為每一個(gè)對(duì)象分配一定的存儲(chǔ)空間,以存放其成員。對(duì)象空間的起始地址就是對(duì)象的指針??梢远x一個(gè)指針變量,用來(lái)存放對(duì)象的指針。Time*pt;Timet1;pt=&t1;(*pt).hourpt->hourt1.hour(*pt).showtime()pt->showtime()

t1.showtime()

9.5對(duì)象指針9.5.1指向?qū)ο蟮闹羔楾ime*pt;9.5.2指向?qū)ο蟪蓡T的指針對(duì)象中的各成員也有地址。(1)指向?qū)ο髷?shù)據(jù)成員的指針定義指向?qū)ο髷?shù)據(jù)成員的指針變量的方法和定義指向普通變量的指針變量方法相同。

int*p1;p1=&t1.hour;cout<<*p1<<endl;9.5.2指向?qū)ο蟪蓡T的指針int*p1;(2)指向?qū)ο蟪蓡T函數(shù)的指針定義指向公用成員函數(shù)的指針變量的一般形式為:返回值類型(類名∷*指針變量名)(參數(shù)表列);為指針變量賦值的形式是:指針變量名=&類名∷成員函數(shù)名;訪問(wèn)指針變量所指向的函數(shù)形式是:(對(duì)象名.*指針變量名)(參數(shù)表列);(2)指向?qū)ο蟪蓡T函數(shù)的指針#include<iostream>usingnamespacestd;classTime{public:Time(int,int,int);inthour;intminute;intsec;voidget_time();};Time∷Time(inth,intm,ints){hour=h;minute=m;sec=s;}voidTime∷get_time(){cout<<hour<<”:”<<minute<<”:”<<sec<<endl;}intmain(){Timet1(10,13,56);int*p1=&t1.hour;cout<<*p1<<endl;t1.get_time();Time*p2=&t1;p2->get_time();void(Time∷*p3)();p3=&Time∷get_time;(t1.*p3)();}1010:13:5610:13:5610:13:56#include<iostream>intmain()9.5.3this指針每個(gè)對(duì)象中的數(shù)據(jù)成員都分別占有存儲(chǔ)空間,如果對(duì)同一個(gè)類定義了n個(gè)對(duì)象,則有n組同樣大小的空間以存放n個(gè)對(duì)象中的數(shù)據(jù)成員。但是,不同對(duì)象都調(diào)用同一個(gè)函數(shù)代碼段。問(wèn)題:當(dāng)不同對(duì)象的成員函數(shù)引用數(shù)據(jù)成員時(shí),怎么能保證引用的是所指定的對(duì)象的數(shù)據(jù)成員呢?解決方法:this指針在每一個(gè)成員函數(shù)中都包含一個(gè)特殊的指針,這個(gè)指針的名字是固定的,稱為this。它的值是當(dāng)前被調(diào)用的成員函數(shù)所在的對(duì)象的起始地址。9.5.3this指針每個(gè)對(duì)象中的數(shù)據(jù)成員都分別占有存儲(chǔ)intBox∷volume(){return(height*width*length);}intBo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論