版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 第15章 靜態(tài)成員與友元2本章主要內(nèi)容 15.1 靜態(tài)成員的需要性 15.2 靜態(tài)成員的使用 15.3 靜態(tài)數(shù)據(jù)成員 15.4 靜態(tài)成員函數(shù) 15.5 需要友員的原因 15.6 友員的使用 作業(yè)3如果類的某些屬性希望他的所有對象共享,怎么辦?數(shù)據(jù)共享途徑: 途徑一:全局變量或全局對象具有局限性破壞程序模塊結(jié)構(gòu)屬于程序,而不屬于類途徑二:靜態(tài)成員被該類的所有對象共享15.1 靜態(tài)成員的需要性415.1 靜態(tài)成員的需要性目的:類的所有對象共享某些資源 class Student / ; int count; /學(xué)生人數(shù) Student * pFirst; /學(xué)生類鏈表首指針 void fn( )
2、 Student ss; /創(chuàng)建第一個學(xué)生對象 count+; /學(xué)生人數(shù)增1 pFirst=&ss; /沒有對pFirst約束,隨便亂用,完全沒把它當(dāng)鏈?zhǔn)字羔?/fn( )退出時,ss作用域中止并被析構(gòu) ,可學(xué)生人數(shù)忘了減1 515.2 靜態(tài)成員的使用靜態(tài)成員是類中的成員,是類的一部分,在類外不可任意訪問,從而起到保護(hù)作用。靜態(tài)成員有靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)之分。聲明格式:static 成員聲明;靜態(tài)數(shù)據(jù)成員與靜態(tài)變量相似,具有靜態(tài)生存期,是在類中聲明的全局?jǐn)?shù)據(jù)成員,能被同一個類的所有對象所共享。公有靜態(tài)成員函數(shù)不僅可以通過類對象來訪問,還可通過“類名:靜態(tài)成員函數(shù)”的形式在程序中直接調(diào)用
3、。615.2 靜態(tài)成員的使用/ ch15_1.cpp#include #include class Student protected: static int noOfStudents; char name40; public: Student(char* pName =no name) cout create one studentn; strncpy(name, pName,40); name39=0; noOfStudents +; /靜態(tài)成員:每創(chuàng)建一個對象,學(xué)生人數(shù)增1 cout noOfStudents endl; static int number( ) /靜態(tài)成員函數(shù) retu
4、rn noOfStudents; Student( ) cout destruct one studentn; noOfStudents-; /每析構(gòu)一個對象,學(xué)生人數(shù)減1 cout noOfStudents endl; ; int Student:noOfStudents =0; /靜態(tài)數(shù)據(jù)成員在類外分配空間和初始化 void fn( ) Student s1; Student s2; cout Student:number( ) endl; /調(diào)用靜態(tài)成員函數(shù)用類名引導(dǎo) int main( ) fn( ); cout Student:number( ) endl; /調(diào)用靜態(tài)成員函數(shù)用類名
5、引導(dǎo) 運(yùn)行結(jié)果: creat one student 1creat one student22 destruct one student1destruct one student00715.2 靜態(tài)成員的使用靜態(tài)數(shù)據(jù)成員不是某一個對象的一部分,而是所有對象共享它,并且能夠訪問它。靜態(tài)數(shù)據(jù)成員要在程序一開始運(yùn)行時就必須存在。因?yàn)楹瘮?shù)在程序運(yùn)行中被調(diào)用,所以靜態(tài)數(shù)據(jù)成員不能在任何函數(shù)內(nèi)分配空間和初始化。 這樣,靜態(tài)數(shù)據(jù)成員的空間分配有三個可能的地方:(1)作為類的外部接口的頭文件,那里有類聲明;(2)類定義的內(nèi)部實(shí)現(xiàn),那里有類的成員函數(shù)定義;(3)應(yīng)用程序的main( )函數(shù)前的全局?jǐn)?shù)據(jù)聲明和定義
6、處。 815.2 靜態(tài)成員的使用例如,下面的代碼重用Student類,但在應(yīng)用程序中不得不再定義Student類的靜態(tài)數(shù)據(jù)成員:/student.h 類定義class Student protected: static int noOfStudents; /靜態(tài)數(shù)據(jù)成員聲明 char name40; public: Student(char* pName =no name); Student( ); static int number( ); /靜態(tài)成員函數(shù)聲明 ;915.2 靜態(tài)成員的使用/student.cpp類的內(nèi)部實(shí)現(xiàn)#include #include #include student
7、.hStudent:Student(char* pName) cout create one studentn; strncpy(name, pName, 40); name39 = 0; noOfStudents+; cout noOfStudents endl; Student:Student( ) cout destruct one studentn; noOfStudents-; cout noOfStudents endl; int Student:number( ) /靜態(tài)成員函數(shù) return noOfStudents; 1015.2 靜態(tài)成員的使用file2.cpp /應(yīng)用程序
8、重用了Student類#include “student.h”#include int Student:noOfStudents=0; /初始化靜態(tài)成員,不便于重用void fn( ) Student s1; Student s2; coutStudent:number( )endl;int main( ) fn( ); coutStudent:number( )endl; return 0; 1115.2 靜態(tài)成員的使用靜態(tài)數(shù)據(jù)成員是類的一部分,靜態(tài)數(shù)據(jù)成員的定義是類定義的一部分,故可將其放在類的內(nèi)部實(shí)現(xiàn)部分中定義。定義時,要用類名引導(dǎo)。重用該類時,簡單地包含其頭文件即可。 例如,下面的程序
9、將ch15_1.cpp改成了多文件程序?qū)崿F(xiàn)結(jié)構(gòu): / student.h class Student protected: static int noOfStudents; /靜態(tài)數(shù)據(jù)成員聲明 char name40; public: Student(char* pName =no name); Student( ); static int number( ); /靜態(tài)成員函數(shù)聲明 ;1215.2 靜態(tài)成員的使用/student.cpp類的內(nèi)部實(shí)現(xiàn)#include #include #include “student.h”int Student:noOfStudents = 0;Student
10、:Student(char* pName) cout create one studentn; strncpy(name, pName, 40); name39 = 0; noOfStudents+; cout noOfStudents endl; Student:Student( ) cout destruct one studentn; noOfStudents-; cout noOfStudents endl; int Student:number( ) return noOfStudents; 1315.2 靜態(tài)成員的使用/ch15_2.cpp #include student.h /
11、重用Student類 #include void fn( ) Student s1; Student s2; cout Student:number() endl; int main() fn( ); cout Student:number() endl; return 0; 工程文件ch15_2.prg包含: student.cppch15_2.cpp1415.3 靜態(tài)數(shù)據(jù)成員使用靜態(tài)數(shù)據(jù)成員可以節(jié)省內(nèi)存,因?yàn)樗淮鎯σ惶?,供所有對象共享。靜態(tài)數(shù)據(jù)成員的值是可修改的,但它對每個對象都是一樣的。1. 定義和使用與靜態(tài)變量相似,靜態(tài)數(shù)據(jù)成員是靜態(tài)存儲(static)的,它必須按下列兩個步驟進(jìn)行:
12、在類中使用關(guān)鍵字static聲明靜態(tài)數(shù)據(jù)成員。 在類外為靜態(tài)數(shù)據(jù)成員分配內(nèi)存空間并初始化。 其定義格式如下::=15【例】靜態(tài)數(shù)據(jù)成員的使用示例#include using namespace std;class CSum public:CSum(int a = 0, int b = 0) /A nSum += a+b; int getSum() return nSum; void setSum(int sum) nSum = sum; private:static int nSum;int CSum:nSum = 0;int main()CSum one(10, 2), two;couton
13、e:sumone.getSum()endl;couttwo:sum=two.getSum()endl;two.setSum(5);coutone:sum=one.getSum()endl;couttwo:sum=two.getSum()endl;return 0;運(yùn)行結(jié)果:one:sum=12two:sum=12one:sum= 5two:sum=51615.3 靜態(tài)數(shù)據(jù)成員2. 幾點(diǎn)說明(1)靜態(tài)數(shù)據(jù)成員是類中的成員,它的訪問屬性同普通數(shù)據(jù)成員一樣,可以為public、private和protected。(2)靜態(tài)數(shù)據(jù)成員的實(shí)際定義和初始化本身是不受public、private和protec
14、ted等訪問屬性限制的。(3)靜態(tài)數(shù)據(jù)成員可看成是類中聲明、類外定義的靜態(tài)全局變量,具有靜態(tài)生存期,在程序中從實(shí)際定義時開始產(chǎn)生,到程序結(jié)束時消失。 (4)當(dāng)靜態(tài)數(shù)據(jù)成員為public時,在類外對該成員的訪問和引用可通過對象,也可直接引用。:1715.3 靜態(tài)數(shù)據(jù)成員例:class CSum /public:static int nSum;int CSum:nSum=0;int main()CSum one;one.nSum=10;CSum:nSum=12; /常用方式coutone.nSumendl;return 0;1815.3 靜態(tài)數(shù)據(jù)成員例: class Student public:
15、 Student( ) noOfStudent+; / static int noOfStudent; /公共靜態(tài)數(shù)據(jù)成員 / ; void fn(Student& s1,Student& s2) couts1.noOfStudents; cout Student:noOfStudents; /此處也可以訪問靜態(tài)數(shù)據(jù)成員 193. 靜態(tài)數(shù)據(jù)成員的使用場合:(1) 用來保存流動變化的對象個數(shù);(2) 存儲鏈表的第一個或者最后一個成員的內(nèi)存地址 一個指針;(3) 作為一個標(biāo)記,標(biāo)記一些動作是否發(fā)生;15.3 靜態(tài)數(shù)據(jù)成員2015.3 靜態(tài)數(shù)據(jù)成員(選講)例ch15_4,創(chuàng)建一個學(xué)生單向鏈表。cla
16、ss Studentpublic: Student(char* pName); Student();protected: static Student* pFirst; Student* pNext; char name40;Student* Student:pFirst =0;Student:Student(char* pName) strncpy(name,pName,sizeof(name); namesizeof(name)-1 =0; pNext =pFirst; /每新建一個結(jié)點(diǎn)(對象),就將其掛在鏈?zhǔn)?pFirst =this;2115.3 靜態(tài)數(shù)據(jù)成員Student:Stude
17、nt() cout name pNext) if(pS-pNext=this) /找到時,pS指向當(dāng)前結(jié)點(diǎn)的結(jié)點(diǎn) pS-pNext=pNext; /pNext即this-pNext return; Student* fn() Student* pS =new Student(Jenny); Student sb(Jone); return pS;2215.3 靜態(tài)數(shù)據(jù)成員void main() Student sa(Jamsa); Student* sb =fn(); Student sc(Tracey); delete sb;運(yùn)行結(jié)果:JoneJennyTraceyJamsa2315.4 靜
18、態(tài)成員函數(shù)靜態(tài)成員函數(shù):在類的定義體中,前面被冠以“static”的成員函數(shù)。靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,都屬于類的靜態(tài)成員,但它們都不專屬于某個對象,而是所有對象所共享的成員。因此,訪問靜態(tài)成員函數(shù)時,也不需要對象。:在類中,靜態(tài)數(shù)據(jù)成員可以被成員函數(shù)或靜態(tài)成員函數(shù)所引用。但反過來,靜態(tài)成員函數(shù)卻不能直接引用類中說明的非靜態(tài)成員。 Page 232415.4 靜態(tài)成員函數(shù)Page 24例如,下面的程序,兩種調(diào)用靜態(tài)成員函數(shù)的方法都是合法的,且意義一樣: #include class Student public: static int number( ) return noOfStude
19、nts; /. protected: char name40; static int noOfStudents; ; int Student:noOfStudents = 1; int main( ) Student s; cout s.number() endl; /ok 用對象引用靜態(tài)成員函數(shù) cout Student:number() endl; /ok 用類名引導(dǎo)靜態(tài)成員函數(shù) 2515.4 靜態(tài)成員函數(shù)一個靜態(tài)成員函數(shù)不與任何對象相聯(lián)系,故不能對非靜態(tài)成員進(jìn)行默認(rèn)訪問。例: #include class Student public: static char* sName()/靜態(tài)成員
20、函數(shù)為所有對象共享 coutnoOfStudentsendl; return name; /error哪個對象? protected: char name40; static int noOfStudents; ;26 int Student:noOfStudents=0; void fn( ) / Student s; couts.sName( )endl; /sName( )從對象s上得到的是Student類型 /故可寫成:Student : sName( ) 15.4 靜態(tài)成員函數(shù)2715.4 靜態(tài)成員函數(shù)(選講)靜態(tài)成員函數(shù)借助靜態(tài)數(shù)據(jù)成員頭指針可以對非靜態(tài)成員訪問。例ch15-6.c
21、pp說明了一個訪問對象中成員的方法: #include #include class Student public: Student(char* pName); Student( ); static Student* findname(char* pName); protected: static Student* pFirst; Student* pNext; char name40; ;Page 2728 Student* Student:pFirst = 0; /靜態(tài)成員空間分配及初始化 Student:Student(char*pName)/頭插法 strncpy(name,pName
22、, sizeof(name); namesizeof(name)-1=0; pNext=pFirst; pFirst=this; Student:Student( ) if(pFirst=this)pFirst=pNext; return; for(Student* pS=pFirst; pS; pS=pS-pNext) if(pS-pNext=this) pS-pNext=pNext; return; /查找被析構(gòu)的節(jié)點(diǎn) Page 2815.4 靜態(tài)成員函數(shù)2915.4 靜態(tài)成員函數(shù)Student* Student:findname(char* pName)/靜態(tài)成員函數(shù) for(Stude
23、nt* pS=pFirst; pS; pS=pS-pNext) if(strcmp(pS-name,pName)=0) return pS; return (Student*)0;int main( ) Student s1(Randy); Student s2(Jenny); Student s3(Kinsey); Student* pS =Student:findname(Jenny) if(pS) cout ok. endl; else cout no find. endl; return 0;3015.5 需要友元的原因問題的提出:對象的保護(hù)和私有成員:只允許本類的成員函數(shù)訪問 為了提
24、高效率,希望本類以外的對象或函數(shù)能夠訪問類中的保護(hù)和私有成員 友元:提供了本類外的對象訪問保護(hù)和私有成員的途徑。Page 3031友元:一個類的友元可以訪問這個類的保護(hù)和私有成員(公有成員當(dāng)然能夠訪問,但是一般不要改變其值。)友元可以是下列之一: (1)友元函數(shù)不屬于任何類的一般函數(shù) (2)友元成員函數(shù)另一個類的某個成員函數(shù) (3)友元類另一個類(整個類作友元)注意:友元使得類的封裝性受到影響,程序的可維護(hù)性變差,應(yīng)慎重使用 Page 3115.5 需要友元的原因3215.6 友元的使用友元的聲明和定義友元聲明:友元聲明的位置可在類的任何部位,既可在public區(qū),也可在protected區(qū),
25、意義完全一 樣。友元的定義:友元不屬于本類的成員,所以友元的定義不能在本類的定義體中。 1. 友元函數(shù)友元函數(shù):不屬于任何類的、被聲明為某個類的友元的一般函數(shù)。友元函數(shù)定義在類的外部,一般與類的成員函數(shù)定義放在一起。格式:friend (形參表) #includeclass A protected: int x,y; public: int z; A(int xx=0,int yy=0,int zz=0):x(xx),y(yy),z(zz) friend void in(A); friend void sh(A); ;void in(A a1) couta1.xa1.ya1.z; couta1
26、.x a1.y a1.zendl; void sh(A a2) couta2.x a2.y a2.zendl; int main() A a1(11,22,33); sh(a1); in(a1); sh(a1); return 0;3415.6友元的使用2.友元成員函數(shù)友元成員函數(shù):其他某個類的成員函數(shù),是本類的友元格式: friend 函數(shù)返回類型 類名標(biāo)識符:函數(shù)名(參數(shù)列表);說明:友元成員函數(shù)的聲明,除了前面冠以“friend”外,還要注明所屬類的類名。友元成員函數(shù)應(yīng)該在自己所屬類的定義體中進(jìn)行定義。3515.6友元的使用class Student; /前項(xiàng)聲明,類名聲明class T
27、eacher / public: void assignGrades(Student& s); /給定成績 protected: int noOfStudents; Student * pList100; ; class Student public: / friend void Teacher:assignGrades (Student&s); /是學(xué)生類的友元成員函數(shù),同時又是教師類的成員函數(shù) Page 353615.6友元的使用 protected: Teacher * pT; int semesterHours; float gpa; ; void Teacher:assignGrades(Student& s) s.
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- JJG 2097-2024太赫茲輻射功率計(jì)量器具檢定系統(tǒng)表
- 2024年度云南省高校教師資格證之高等教育學(xué)模擬考試試卷A卷含答案
- 贛南師范大學(xué)《課外音樂活動的組織與指導(dǎo)》2022-2023學(xué)年第一學(xué)期期末試卷
- 阜陽師范大學(xué)《學(xué)前比較教育》2023-2024學(xué)年第一學(xué)期期末試卷
- 阜陽師范大學(xué)《非政府組織管理》2022-2023學(xué)年第一學(xué)期期末試卷
- 南京市2024-2025學(xué)年三年級上學(xué)期11月期中調(diào)研數(shù)學(xué)試卷一(有答案)
- 福建師范大學(xué)《綜合自然地理》2023-2024學(xué)年第一學(xué)期期末試卷
- 福建師范大學(xué)《演藝娛樂經(jīng)營管理》2022-2023學(xué)年第一學(xué)期期末試卷
- 專題77 實(shí)驗(yàn)八:其它測量電阻的方法(含答案)-十年(2014-2023)高考物理真題分項(xiàng)匯編(全國用)
- 福建師范大學(xué)《小學(xué)課程與教學(xué)研究》2022-2023學(xué)年第一學(xué)期期末試卷
- 2022年癲癇性精神病臨床路徑
- 三年級心理健康教學(xué)課件 第15課 專注的力量
- 廣西壯族自治區(qū)北海市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細(xì)居民村民委員會
- 藥劑科質(zhì)量與安全管理考核表正式版
- 新教材高考化學(xué)一輪復(fù)習(xí)元素“位-構(gòu)-性”推斷技巧及元素周期律應(yīng)用中的關(guān)鍵點(diǎn)課件(19張)
- 無機(jī)離子檢測
- 五年級上冊數(shù)學(xué)課件 - 三角形的面積 人教版(共16張PPT)
- 乳腺癌科普講座課件
- 2022年《國民經(jīng)濟(jì)行業(yè)分類》
- 通止規(guī)設(shè)計(jì)公差自動計(jì)算表
- 胃癌淋巴結(jié)清掃ppt課件(PPT 39頁)
評論
0/150
提交評論