




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
會計學(xué)1C程序設(shè)計面向?qū)ο蟮耐讌f(xié)本章學(xué)習(xí)目標(biāo)了解友元函數(shù)的概念,掌握友元函數(shù)的定義與使用了解友元類的概念掌握靜態(tài)數(shù)據(jù)成員的定義與使用掌握靜態(tài)成員函數(shù)的定義與使用第6章面向?qū)ο蟮耐讌f(xié)第1頁/共36頁友元可以訪問與其有好友關(guān)系的類中的任何成員。
§6.1封裝的破壞——友元友元友元函數(shù)友元類第2頁/共36頁如果在本類以外的其他地方定義了一個函數(shù)(這個函數(shù)可以是不屬于任何類的普通函數(shù),也可以是其他類的成員函數(shù)),在類體中用friend對其進(jìn)行聲明,此函數(shù)就稱為本類的友元函數(shù)。友元函數(shù)可以訪問這個類中的任何成員。如何將普通函數(shù)聲明為友元函數(shù)呢?看下面這個簡單的例子:§6.1封裝的破壞——友元6.1.1友元函數(shù)
第3頁/共36頁【例6-1】友元普通函數(shù)。
#include<iostream>usingnamespacestd;classClock//聲明Clock類{public:
Clock(int,int,int);
friendvoiddisplay(Clock&);private:
inthour;
intminute;
intsecond;};§6.1.1友元函數(shù)第4頁/共36頁Clock::Clock(inth,intm,ints)//構(gòu)造函數(shù){hour=h;minute=m;second=s;}//這是友元函數(shù),形參t是Clock類對象的引用voiddisplay(Clock&t){cout<<t.hour<<":"<<t.minute<<":"<<t.second<<endl;}intmain(){Clockt(10,13,56);display(t);//調(diào)用display函數(shù),實參t是Clock類對象
return0;}§6.1友元函數(shù)程序運行結(jié)果如下:10:13:56cout<<hour<<":"<<minute<<":"<<second<<endl;注意第5頁/共36頁【例6-2】友元成員函數(shù)。#include<iostream>usingnamespacestd;classDate;//對Date類的提前引用聲明classClock//聲明Clock類{public:
Clock(int,int,int);
voiddisplay(Date&);private:
inthour,minute,second;};§6.1.1友元函數(shù)第6頁/共36頁classDate//聲明Date類{public:
Date(int,int,int);
friendvoidClock::display(Date&);private:
intmonth;
intday;
intyear;};§6.1.1友元函數(shù)第7頁/共36頁Clock::Clock(inth,intm,ints)//Clock類的構(gòu)造函數(shù){hour=h;minute=m;second=s;}voidClock::display(Date&dd){cout<<dd.month<<"/"<<dd.day<<"/"<<dd.year<<endl;
cout<<hour<<":"<<minute<<":"<<second<<endl;}Date::Date(intm,intd,inty)//Date類的構(gòu)造函數(shù){month=m;day=d;year=y;}§6.1.1友元函數(shù)第8頁/共36頁intmain(){Clockt(10,13,56);//定義Clock類對象t
Dated(12,25,2004);//定義Date類對象d
//調(diào)用t的display函數(shù),實參是Date類對象d
t.display(d);
return0;}§6.1友元函數(shù)程序運行結(jié)果如下:12/25/200410:13:56第9頁/共36頁不僅可以將一個函數(shù)聲明為一個類的“朋友”,而且可以將一個類(例如B類)聲明為另一個類(例如A類)的“朋友”。這時B類就是A類的友元類。友元類B中的所有成員函數(shù)都是A類的友元函數(shù),可以訪問A類中的任何成員?!?.1封裝的破壞——友元6.1.2友元類第10頁/共36頁classStudent;classTeacher{public:voidassigngrades(Student&s);//給出學(xué)生成績protected:intstu_count;//學(xué)生人數(shù)Student*plist[100];//學(xué)生數(shù)組};§6.1.2友元類classStudent{public:friendTeacher;//友元類…protected:intnum;stringname;floatscore;};…第11頁/共36頁§6.1.2友元類聲明友元類的一般形式為:friend類名;關(guān)于友元,有三點需要說明:(1)友元函數(shù)的聲明可以出現(xiàn)在類的任何地方(包括在private和public部分),也就是說友元的說明不受成員訪問控制符的限制。第12頁/共36頁§6.1.2友元類(2)友元關(guān)系是單向的而不是雙向的,如果聲明了B類是A類的友元類,不等于A類是B類的友元類,A類中的成員函數(shù)不一定能夠訪問B類中的成員(3)友元關(guān)系是不能傳遞的,例如,如果B類是A類的友元類,C類是B類的友元類,并不能說C類就是A類的友元類。第13頁/共36頁在C++中,聲明了一個類之后,可以定義該類的多個對象。系統(tǒng)為每個對象分配單獨的內(nèi)存空間。每一個對象都分別有自己的數(shù)據(jù)成員,不同對象的數(shù)據(jù)成員各自有其值,互不相干。但是有時我們希望有某一個或幾個數(shù)據(jù)成員為所有對象所共有。這樣可以實現(xiàn)數(shù)據(jù)共享?!?.2對象機(jī)制的破壞
——靜態(tài)成員第14頁/共36頁我們知道全局變量能夠?qū)崿F(xiàn)數(shù)據(jù)共享。但是用全局變量的安全性得不到保證,因為在各處都可以自由地修改全局變量的值,很有可能由于某個沒注意到的失誤,全局變量的值就被修改,導(dǎo)致程序的失敗。因此在實際工作中很少使用全局變量。如果想在同類的多個對象之間實現(xiàn)數(shù)據(jù)共享,也不要用全局對象,可以用靜態(tài)成員。靜態(tài)成員包括靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)?!?.2對象機(jī)制的破壞
——靜態(tài)成員第15頁/共36頁靜態(tài)數(shù)據(jù)成員是一種特殊的數(shù)據(jù)成員。它以關(guān)鍵字static開頭。例如:§6.2對象機(jī)制的破壞
——靜態(tài)成員6.2.1靜態(tài)數(shù)據(jù)成員classStudent{public:Student(char*name="noname");staticintstu_count;charname[40];};第16頁/共36頁靜態(tài)數(shù)據(jù)成員在內(nèi)存中只占一份空間(而不是每個對象都分別為它保留一份空間),它是屬于類的,但它被該類的所有對象所共享,每個對象都可以訪問這個靜態(tài)數(shù)據(jù)成員。靜態(tài)數(shù)據(jù)成員的值對所有對象都是一樣的。如果改變它的值,則在各對象中這個數(shù)據(jù)成員的值都同時改變了。這樣可以節(jié)約空間,提高效率?!?.2.1靜態(tài)數(shù)據(jù)成員第17頁/共36頁說明:(1)如果只聲明了類而未定義對象,則類的一般數(shù)據(jù)成員是不占內(nèi)存空間的,只有在定義對象時,才為對象的數(shù)據(jù)成員分配空間。但是靜態(tài)數(shù)據(jù)成員不屬于某一個對象,在為對象所分配的空間中不包括靜態(tài)數(shù)據(jù)成員所占的空間。靜態(tài)數(shù)據(jù)成員是在所有對象之外單獨開辟空間。只要在類中定義了靜態(tài)數(shù)據(jù)成員,即使不定義對象,也為靜態(tài)數(shù)據(jù)成員分配空間,它可以被訪問。在一個類中可以有一個或多個靜態(tài)數(shù)據(jù)成員,所有的對象共享這些靜態(tài)數(shù)據(jù)成員,都可以訪問它?!?.2.1靜態(tài)數(shù)據(jù)成員第18頁/共36頁(2)靜態(tài)數(shù)據(jù)成員不隨對象的建立而分配空間,也不隨對象的撤銷而釋放(一般數(shù)據(jù)成員是在對象建立時分配空間,在對象撤銷時釋放)。靜態(tài)數(shù)據(jù)成員是在程序編譯時被分配空間的,到程序結(jié)束時才釋放空間?!?.2.1靜態(tài)數(shù)據(jù)成員第19頁/共36頁(3)靜態(tài)數(shù)據(jù)成員可以初始化,但只能在類體外進(jìn)行初始化。如:intStudent::stu_count=0;//表示對Student類中的靜態(tài)數(shù)據(jù)成員初始化靜態(tài)數(shù)據(jù)成員可以初始化語句的一般形式為:數(shù)據(jù)類型類名::靜態(tài)數(shù)據(jù)成員名=初值;不必在初始化語句中加static?!?.2.1靜態(tài)數(shù)據(jù)成員第20頁/共36頁(4)靜態(tài)數(shù)據(jù)成員既可以通過對象名訪問,也可以通過類名來訪問。§6.2.1靜態(tài)數(shù)據(jù)成員第21頁/共36頁【例6-3】訪問靜態(tài)數(shù)據(jù)成員。#include<iostream>usingnamespacestd;#include<string>classStudent{public:
Student(char*name="noname");
~Student();
staticintstu_count;
charname[40];};§6.2.1靜態(tài)數(shù)據(jù)成員第22頁/共36頁Student::Student(char*pname){strcpy(name,pname);
stu_count++;//每創(chuàng)建一個對象,學(xué)生人數(shù)加1}Student::~Student(){
stu_count--;
//每釋放一個對象,學(xué)生人數(shù)減1}//對靜態(tài)數(shù)據(jù)成員stu_count初始化
intStudent::stu_count=0;§6.2.1靜態(tài)數(shù)據(jù)成員第23頁/共36頁intmain(){Students1;
cout<<s1.stu_count<<endl;
{Students2;
cout<<s2.stu_count<<endl;
}
cout<<Student::stu_count<<endl;
return0;}程序運行結(jié)果如下:121§6.2.1靜態(tài)數(shù)據(jù)成員第24頁/共36頁與靜態(tài)數(shù)據(jù)成員不同,靜態(tài)成員函數(shù)的作用不是為了對象之間的溝通,而是為了能處理靜態(tài)數(shù)據(jù)成員?!?.2對象機(jī)制的破壞
——靜態(tài)成員6.2.2靜態(tài)成員函數(shù)第25頁/共36頁【例6-4】靜態(tài)成員函數(shù)訪問靜態(tài)數(shù)據(jù)成員的例子。#include<iostream>usingnamespacestd;#include<string>classStudent //聲明Student類{public:
Student(char*name="noname");
~Student();
staticintgetcount()
{returnstu_count;}private:
staticintstu_count;
charname[40];};§6.2.2靜態(tài)成員函數(shù)第26頁/共36頁Student::Student(char*pname){strcpy(name,pname);stu_count++;//每創(chuàng)建一個對象,學(xué)生人數(shù)加1}Student::~Student(){stu_count--;}//每銷毀一個對象,學(xué)生人數(shù)減1intStudent::stu_count=0;§6.2.2靜態(tài)成員函數(shù)第27頁/共36頁intmain(){Students1;
cout<<s1.getcount()<<endl;
{Students2;
cout<<s2.getcount()<<endl;
}
cout<<Student::getcount()<<endl;
return0;}§6.2.2靜態(tài)成員函數(shù)第28頁/共36頁§6.2.2靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)是類的一部分,而不是對象的一部分。如果要在類外調(diào)用公用的靜態(tài)成員函數(shù),可以用類名和域運算符“::”,也允許通過對象名調(diào)用靜態(tài)成員函數(shù)。如:Student::getcount();//用類名調(diào)用靜態(tài)成員函數(shù)s1.getcount(); //用對象名調(diào)用靜態(tài)成員函數(shù)但這并不意味著此函數(shù)是屬于對象s1的,而只是用s1的類型而已。第29頁/共36頁§6.2.2靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)是類的一部分,而不是對象的一部分。如果要在類外調(diào)用公用的靜態(tài)成員函數(shù),可以用類名和域運算符“::”,也允許通過對象名調(diào)用靜態(tài)成員函數(shù)。如:Student::getcount();//用類名調(diào)用靜態(tài)成員函數(shù)s1.getcount(); //用對象名調(diào)用靜態(tài)成員函數(shù)但這并不意味著此函數(shù)是屬于對象s1的,而只是用s1的類型而已。第30頁/共36頁§6.2.2靜態(tài)成員函數(shù)說明:(1)靜態(tài)成員函數(shù)不能默認(rèn)訪問本類中的非靜態(tài)成員。當(dāng)調(diào)用一個對象的成員函數(shù)(非靜態(tài)成員函數(shù))時,系統(tǒng)會把該對象的起始地址賦給成員函數(shù)的this指針。而靜態(tài)成員函數(shù)并不屬于某一對象,它與任何對象都無關(guān),因此靜態(tài)成員函數(shù)沒有thi
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程承包勞務(wù)合同范本
- 員工福利保險合同條款協(xié)議書
- 農(nóng)村個人購房合同模板版
- 土地使用權(quán)出讓合同標(biāo)準(zhǔn)文本
- 校際聯(lián)賽參賽學(xué)生合同條款
- 戰(zhàn)略合作合同模板:油品采購
- 度廣告宣傳合同范本
- 合作開發(fā)項目合同終止協(xié)議
- 辦公室裝修工程設(shè)計合同
- 合同范本:房地產(chǎn)企業(yè)項目貸款合同
- 大學(xué)生創(chuàng)新創(chuàng)業(yè)基礎(chǔ)(創(chuàng)新創(chuàng)業(yè)課程)完整全套教學(xué)課件
- 人教版小學(xué)數(shù)學(xué)四年級下冊第一單元測試卷附答案(共9套)
- 統(tǒng)編版六年級下冊道德與法治1-學(xué)會尊重-課件(54張課件)
- 2024年新改版青島版(六三制)三年級下冊科學(xué)全冊知識點復(fù)習(xí)資料
- 2022年山西省中考物理試題(含答案)
- QC成果:預(yù)制扭王字塊體表面缺陷控制知識分享
- 光伏強(qiáng)制性條文執(zhí)行計劃(共25頁)
- 2021新《安全生產(chǎn)法》全面解讀課件(PPT 84頁)
- 企業(yè)、事業(yè)專職消防隊訓(xùn)練內(nèi)容及操作規(guī)程
- 脛骨平臺骨折(課堂PPT)
- 歐洲文化入門王精品PPT課件
評論
0/150
提交評論