版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、C+面向?qū)ο蟮耐讌f(xié)1本章學(xué)習(xí)要點友元函數(shù)友元類靜態(tài)數(shù)據(jù)成員靜態(tài)成員函數(shù)第6章 面向?qū)ο蟮耐讌f(xié)2本章學(xué)習(xí)目標了解友元函數(shù)的概念,掌握友元函數(shù)的定義與使用了解友元類的概念掌握靜態(tài)數(shù)據(jù)成員的定義與使用掌握靜態(tài)成員函數(shù)的定義與使用第6章 面向?qū)ο蟮耐讌f(xié)3友元可以訪問與其有好友關(guān)系的類中的任何成員。 6.1 封裝的破壞友元 友元友元函數(shù)友元類4如果在本類以外的其他地方定義了一個函數(shù)(這個函數(shù)可以是不屬于任何類的普通函數(shù),也可以是其他類的成員函數(shù)),在類體中用friend對其進行聲明,此函數(shù)就稱為本類的友元函數(shù)。友元函數(shù)可以訪問這個類中的任何成員。如何將普通函數(shù)聲明為友元函數(shù)呢?看下面這個簡單的例子:6.
2、1 封裝的破壞友元 6.1.1 友元函數(shù) 5【例6-1】友元普通函數(shù)。 #include using namespace std; class Clock /聲明Clock類 public: Clock(int,int,int); friend void display(Clock &); private: int hour; int minute; int second; ;6.1.1 友元 函數(shù)6Clock:Clock(int h,int m,int s) /構(gòu)造函數(shù) hour=h; minute=m; second=s; /這是友元函數(shù),形參t是Clock類對象的引用void displ
3、ay(Clock& t) coutt.hour:t.minute:t.secondendl;int main() Clock t(10,13,56); display(t); /調(diào)用display函數(shù),實參t是Clock類對象 return 0; 6.1 友元函數(shù)程序運行結(jié)果如下:10:13:56couthour:minute:secondendl;注意7【例6-2】友元成員函數(shù)。#include using namespace std;class Date; /對Date類的提前引用聲明class Clock /聲明Clock類public: Clock(int,int,int); void
4、 display(Date &); private: int hour, minute, second;6.1.1 友元 函數(shù)8class Date /聲明Date類public: Date(int,int,int); friend void Clock:display(Date &); private: int month; int day; int year;6.1.1 友元 函數(shù)9Clock:Clock(int h,int m,int s) / Clock類的構(gòu)造函數(shù) hour=h; minute=m; second=s; void Clock:display(Date &dd) cou
5、tdd.month/dd.day/dd.yearendl; couthour:minute:secondendl; Date:Date(int m,int d,int y) / Date類的構(gòu)造函數(shù) month=m; day=d; year=y;6.1.1 友元 函數(shù)10int main() Clock t(10,13,56); /定義Clock類對象t Date d(12,25,2004); /定義Date類對象d /調(diào)用t的display函數(shù),實參是Date類對象d t.display(d); return 0;6.1 友元函數(shù)程序運行結(jié)果如下:12/25/200410:13:5611不僅
6、可以將一個函數(shù)聲明為一個類的“朋友”,而且可以將一個類(例如B類)聲明為另一個類(例如A類)的“朋友”。這時B類就是A類的友元類。友元類B中的所有成員函數(shù)都是A類的友元函數(shù),可以訪問A類中的任何成員。6.1 封裝的破壞友元 6.1.2 友元類12class Student;class Teacherpublic: void assigngrades(Student& s); /給出學(xué)生成績 protected: int stu_count; /學(xué)生人數(shù) Student* plist100; /學(xué)生數(shù)組;6.1.2 友元類class Studentpublic: friend Teacher;
7、/友元類 protected: int num; string name; float score;136.1.2 友元類聲明友元類的一般形式為:friend 類名;關(guān)于友元,有三點需要說明:(1)友元函數(shù)的聲明可以出現(xiàn)在類的任何地方(包括在private和public部分),也就是說友元的說明不受成員訪問控制符的限制。146.1.2 友元類(2)友元關(guān)系是單向的而不是雙向的,如果聲明了B類是A類的友元類,不等于A類是B類的友元類,A類中的成員函數(shù)不一定能夠訪問B類中的成員(3)友元關(guān)系是不能傳遞的,例如,如果B類是A類的友元類,C類是B類的友元類,并不能說C類就是A類的友元類。15在C+中,
8、聲明了一個類之后,可以定義該類的多個對象。系統(tǒng)為每個對象分配單獨的內(nèi)存空間。每一個對象都分別有自己的數(shù)據(jù)成員,不同對象的數(shù)據(jù)成員各自有其值,互不相干。但是有時我們希望有某一個或幾個數(shù)據(jù)成員為所有對象所共有。這樣可以實現(xiàn)數(shù)據(jù)共享。6.2 對象機制的破壞 靜態(tài)成員 16我們知道全局變量能夠?qū)崿F(xiàn)數(shù)據(jù)共享。但是用全局變量的安全性得不到保證,因為在各處都可以自由地修改全局變量的值,很有可能由于某個沒注意到的失誤,全局變量的值就被修改,導(dǎo)致程序的失敗。因此在實際工作中很少使用全局變量。如果想在同類的多個對象之間實現(xiàn)數(shù)據(jù)共享,也不要用全局對象,可以用靜態(tài)成員。靜態(tài)成員包括靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。6.2
9、對象機制的破壞 靜態(tài)成員 17靜態(tài)數(shù)據(jù)成員是一種特殊的數(shù)據(jù)成員。它以關(guān)鍵字static開頭。例如:6.2 對象機制的破壞 靜態(tài)成員 6.2.1 靜態(tài)數(shù)據(jù)成員class Studentpublic: Student(char *name=no name); static int stu_count; char name40;18靜態(tài)數(shù)據(jù)成員在內(nèi)存中只占一份空間(而不是每個對象都分別為它保留一份空間),它是屬于類的,但它被該類的所有對象所共享,每個對象都可以訪問這個靜態(tài)數(shù)據(jù)成員。靜態(tài)數(shù)據(jù)成員的值對所有對象都是一樣的。如果改變它的值,則在各對象中這個數(shù)據(jù)成員的值都同時改變了。這樣可以節(jié)約空間,提高效
10、率。6.2.1 靜態(tài)數(shù)據(jù)成員 19說明: (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ù)成員,都可以訪問它。6.2.1 靜態(tài)數(shù)據(jù)成員 20(2)靜態(tài)數(shù)據(jù)成員不隨對象的建立而分配空間,也不隨對象的撤銷而釋放(一般數(shù)據(jù)成員是在對象建立時分配空間,在對象撤
11、銷時釋放)。靜態(tài)數(shù)據(jù)成員是在程序編譯時被分配空間的,到程序結(jié)束時才釋放空間。6.2.1 靜態(tài)數(shù)據(jù)成員 21(3)靜態(tài)數(shù)據(jù)成員可以初始化,但只能在類體外進行初始化。如:int Student:stu_count=0; /表示對Student類中的靜態(tài)數(shù)據(jù)成員初始化靜態(tài)數(shù)據(jù)成員可以初始化語句的一般形式為:數(shù)據(jù)類型 類名:靜態(tài)數(shù)據(jù)成員名=初值;不必在初始化語句中加static。6.2.1 靜態(tài)數(shù)據(jù)成員 22(4)靜態(tài)數(shù)據(jù)成員既可以通過對象名訪問,也可以通過類名來訪問。6.2.1 靜態(tài)數(shù)據(jù)成員 23【例6-3】 訪問靜態(tài)數(shù)據(jù)成員。#include using namespace std;#includ
12、e class Studentpublic: Student(char *name= no name); Student(); static int stu_count; char name40;6.2.1 靜態(tài)數(shù)據(jù)成員 24Student:Student (char *pname) strcpy(name ,pname); stu_count+; /每創(chuàng)建一個對象,學(xué)生人數(shù)加1Student:Student () stu_count-; /每釋放一個對象,學(xué)生人數(shù)減1 /對靜態(tài)數(shù)據(jù)成員stu_count初始化 int Student:stu_count=0; 6.2.1 靜態(tài)數(shù)據(jù)成員 25i
13、nt main() Student s1; couts1.stu_countendl; Student s2; couts2. stu_count endl; coutStudent:stu_count endl; return 0;程序運行結(jié)果如下:1216.2.1 靜態(tài)數(shù)據(jù)成員 26與靜態(tài)數(shù)據(jù)成員不同,靜態(tài)成員函數(shù)的作用不是為了對象之間的溝通,而是為了能處理靜態(tài)數(shù)據(jù)成員。6.2 對象機制的破壞 靜態(tài)成員 6.2.2 靜態(tài)成員函數(shù)27【例6-4】 靜態(tài)成員函數(shù)訪問靜態(tài)數(shù)據(jù)成員的例子。#include using namespace std;#include class Student/聲明S
14、tudent類public: Student(char *name=no name); Student(); static int getcount() return stu_count; private: static int stu_count; char name40;6.2.2 靜態(tài)成員函數(shù) 28Student:Student (char *pname) strcpy(name ,pname); stu_count+; /每創(chuàng)建一個對象,學(xué)生人數(shù)加1Student:Student () stu_count-; /每銷毀一個對象,學(xué)生人數(shù)減1int Student:stu_count=0
15、; 6.2.2 靜態(tài)成員函數(shù) 29int main() Student s1; couts1.getcount()endl; Student s2; couts2.getcount()endl; coutStudent:getcount()endl; return 0;6.2.2 靜態(tài)成員函數(shù) 306.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(); / 用對象
16、名調(diào)用靜態(tài)成員函數(shù)但這并不意味著此函數(shù)是屬于對象s1的,而只是用s1的類型而已。316.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的類型而已。326.2.2 靜態(tài)成員函數(shù) 說明:(1)靜態(tài)成員函數(shù)不能默認訪問本類中的非靜態(tài)成員。當調(diào)用一個對象的成員函數(shù)(非靜態(tài)成員函數(shù))時,系統(tǒng)
17、會把該對象的起始地址賦給成員函數(shù)的this指針。而靜態(tài)成員函數(shù)并不屬于某一對象,它與任何對象都無關(guān),因此靜態(tài)成員函數(shù)沒有this指針。既然它沒有指向某一對象,就無法對一個對象中的非靜態(tài)成員進行默認訪問(即在訪問數(shù)據(jù)成員時不指定對象名)??梢哉f,靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的根本區(qū)別是:非靜態(tài)成員函數(shù)有this指針,而靜態(tài)成員函數(shù)沒有this指針,因而決定了靜態(tài)成員函數(shù)不能默認訪問本類中的非靜態(tài)成員。336.2.2 靜態(tài)成員函數(shù) 說明:(2)靜態(tài)成員函數(shù)可以直接訪問本類中的靜態(tài)數(shù)據(jù)成員,因為靜態(tài)成員同樣是屬于類的,可以直接訪問。在C+程序中,靜態(tài)成員函數(shù)主要用來訪問靜態(tài)數(shù)據(jù)成員,而不訪問非靜態(tài)成員。假如在一個靜態(tài)成員函數(shù)中有以下語句: coutageendl; /若age已聲明為static,則訪問本類中的靜態(tài)成員,合法coutscoreendl; /若score是
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024石料運輸合同協(xié)議書模板
- 二零二五年度賣房墊資貸款與物業(yè)管理協(xié)議4篇
- 2025年校醫(yī)聘用合同模板校園醫(yī)療信息化建設(shè)與應(yīng)用協(xié)議2篇
- 二零二五版專業(yè)翻譯平臺兼職翻譯人員招募協(xié)議3篇
- 二零二五按揭房產(chǎn)離婚財產(chǎn)分割協(xié)議范本及子女撫養(yǎng)細則3篇
- 2025年度全國性展會場地租賃及服務(wù)保障合同2篇
- 專用礦山事故救援車輛買賣協(xié)議2024年版版B版
- 2025年度綠色生態(tài)園區(qū)場地租賃保證金協(xié)議3篇
- 2025年度高新技術(shù)企業(yè)臨時租用土地合作開發(fā)協(xié)議書4篇
- 二零二五年度財務(wù)離職后保密及財務(wù)商業(yè)機密保護合同6篇
- 河南省鄭州外國語高中-【高二】【上期中】【把握現(xiàn)在 蓄力高三】家長會【課件】
- 天津市武清區(qū)2024-2025學(xué)年八年級(上)期末物理試卷(含解析)
- 《徐霞客傳正版》課件
- 江西硅博化工有限公司年產(chǎn)5000噸硅樹脂項目環(huán)境影響評價
- 2025年中煤電力有限公司招聘筆試參考題庫含答案解析
- 企業(yè)內(nèi)部控制與財務(wù)風險防范
- 高端民用航空復(fù)材智能制造交付中心項目環(huán)評資料環(huán)境影響
- 量子醫(yī)學(xué)成像學(xué)行業(yè)研究報告
- 胃潴留護理查房
- 污水處理廠運營方案計劃
- 眼科慢病管理新思路
評論
0/150
提交評論